使用行索引和colum索引一次在矩阵中查找最小的值总和

时间:2017-03-03 16:33:58

标签: algorithm python-2.7 matrix optimization

所以我想通过以下方式找到矩阵中的最小值。

#include <string>

应选择2个矩阵值的总和,使得索引一次使用0,1,2,3。但是,矩阵值的总和也应该最小化。

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

解决方案适用于NxN矩阵,N是偶数。所以对于8x8矩阵,我想找到4个元素。这样就是索引号。 0,1,2,3,4,5,6,7使用一次。所以四个矩阵值。 另一个约束是矩阵仅包含上部trangle矩阵中的intrest值。因此,矩阵元素为1000,这些元素在查找最小总和时可以忽略。

我试图改变匈牙利算法,但这没有成功。 有没有人知道我想做的算法?也许我可以滥用的python包

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

1 个答案:

答案 0 :(得分:-1)

我会说一个可能不是最快但可能有效的解决方案。

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

  • 图表将包含(N×N + 1)个顶点,它们代表矩阵的索引和一个新的顶点,它将是

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

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

在构建此图之后,您应该走K步(K是您将考虑的可能矩阵'索引的数量,例如,像您的示例中的4x4矩阵中的2)。

对于你采取的每一步,你存储在一个堆栈中,并在2个哈希中存储你的最后一个位置(第一个存储已经使用的所有行,第二个存储已经使用的所有列)并标记你进入的顶点

你总是进入一个顶点,你应该检查是否可以通过使用哈希值(理论上是O(1)检查)来保留它,如果可能,你将该值加到当前总和上,否则你就去了到前一个位置(存储在堆栈中)并删除当你进入当前顶点时添加的重量。

您还应该存储一个全局变量,并且总是走K步,检查当前总和是否小于全局总和,如果是,则更改它。

在你走完所有可能的方式后,全球总和将是你的答案。

希望这会有所帮助:)