Algorithm 使用行索引和列索引查找矩阵中的最小值之和一次

Algorithm 使用行索引和列索引查找矩阵中的最小值之和一次,algorithm,python-2.7,matrix,optimization,Algorithm,Python 2.7,Matrix,Optimization,所以我想用下面的方法找到矩阵中的最小值 [[ 1000. 930. 940. 740.] [ 1000. 1000. 990. 670.] M1= [ 1000. 1000. 1000. 680.] [ 1000. 1000. 1000. 1000.]] 选择两个矩阵值之和时,应确保索引使用一次0,1,2,3。但矩阵值之和也应最小化 因此,在这种情况下,解决方案将是M1[2][3]和M1[0][1]。 不

所以我想用下面的方法找到矩阵中的最小值

       [[ 1000.   930.   940.   740.]
        [ 1000.  1000.   990.   670.]
   M1=  [ 1000.  1000.  1000.   680.]
        [ 1000.  1000.  1000.  1000.]]
选择两个矩阵值之和时,应确保索引使用一次0,1,2,3。但矩阵值之和也应最小化

因此,在这种情况下,解决方案将是
M1[2][3]
M1[0][1]
。 不正确的将是
M1[2][3]
M1[1][3]
,它们的总和较低,但不包含唯一的索引号

解应该适用于NxN矩阵,N是偶数。对于8x8矩阵,我想找到4个元素。因此,索引编号。0,1,2,3,4,5,6,7为一次使用。四个矩阵值。 另一个约束是,该矩阵仅包含上平移矩阵中的intrest值。如果矩阵元素是1000,那么在求最小和时可以忽略这些元素

我曾试图改变匈牙利算法,但没有成功。 有人知道一种算法能满足我的要求吗?也许是我可以滥用的python包


或者有一个聪明的解决方案会有所帮助,我必须用最大200X200个元素来做这个矩阵。

我会说一个解决方案可能不是最快的,但它可能会工作

您可以通过以下方式构建图形:

  • 该图将包含(N×N+1)个顶点,表示矩阵的索引,以及一个新的顶点,它将是

  • 源将连接到所有其他顶点,其距离等于每个顶点表示的索引值

  • 然后,您必须将每个顶点(源除外)连接到可能连接到的每个其他顶点(例如,M1[1][2]可以连接到M1[0][3],但不能连接到M1[1][3])。从任何顶点到顶点V的距离将对应于矩阵中V的值

在构建这个图之后,你应该在k步上(k是可能的矩阵索引的数目,你会考虑,例如,在4x4矩阵中,比如你的例子中有2个)。 对于您采取的每一步,您都将最后一个位置(第一个存储所有已使用的行,第二个存储所有已使用的列)存储在堆栈中,并在2个散列中标记您进入的顶点

当你进入一个顶点时,你应该通过使用散列(理论上是O(1)检查)来检查是否可以留在其中,如果可以,你将该值添加到当前和中,否则你将转到上一个位置(存储在堆栈中)并移除你进入当前顶点时添加的权重

您还应该存储一个全局变量,并始终执行K步,检查当前和是否小于全局和,如果小于,则进行更改

在你走完所有可能的路之后,你的答案将是全局和


希望这有帮助:)

这是一个理论问题还是考试?还是一个真正的问题?对数据是否有一些限制,如稀疏矩阵或值的巨大差异?对于n=200,简单的蛮力拾取听起来不太可能。它是一个对角矩阵,如示例中所示。这是一个个人项目,我想最小化多个对象之间的差异。对角线约束可能会有所帮助。我认为,当你添加转置矩阵时,你可以使用匈牙利算法。你用m[i][j]需要m[j][i]的约束来搜索一对一的赋值。@stefan-Yeah只要在对角线上镜像矩阵,我就能做到。谢谢:)这就是所谓的深度优先搜索。如果我对矩阵n=100做对了,那么可能的组合数超过了宇宙中的原子数。以百万计。更不用说n=200:-)