匈牙利算法

时间:2014-04-24 19:44:55

标签: hungarian-algorithm

我已经找到了匈牙利算法的实现,但我有一个关于" starred zero"的含义的问题。并且"准备零"。我认为这用于指代标记为零,但我不确定。这是对的吗?

这是代码:http://ccp.uchicago.edu/khetarpal/code/edit-distance/HungarianAlgorithm.java

感谢。

1 个答案:

答案 0 :(得分:3)

您应该知道匈牙利语(或Kuhn-Munkres)算法是一种组合优化算法,可以解决分配问题。它由应用于方阵的一组运算组成,其单元值是将“任务”i分配给“工人”j或“工人”i到“任务”j的成本的函数。分别是i和j的行号和列号。 在这里,我简要介绍了您正在使用的实现,这样您就可以了解主演和启动单元(或零)的目标是什么。

步骤0 :创建一个称为成本矩阵的矩阵,其中每个元素表示将其中一个工作人员分配给其中一个工作的成本。转到 第1步

第1步 reduceMatrix ):对于每一行,找到最小的元素,并从其行中的每个元素中减去它。转到 第2步

第2步 initStars ):在结果矩阵中找到零(Z)。如果其行或列中没有星号零,则为星形Z.对矩阵中的每个元素重复。转到 第3步

第3步 coverColumnsOfStarredZeroes ):覆盖每个包含已加星号零的列。如果覆盖K列,则加星标的零描述一组完整的唯一赋值。在这种情况下,请转到 完成 ,否则,转到 第4步

第4步 primeSomeUncoveredZero ):查找未覆盖的零并填充它。如果包含此已准备零的行中没有已加星标的零,请转到 步骤5 。否则,覆盖此行并显示包含已加星标的零的列。以这种方式继续,直到没有未覆盖的零。保存最小的未覆盖值并转到 第6步

第5步 incrementSetOfStarredZeroes ):构建一系列交替引导和加星标的零,如下所示。令Z0表示在步骤4中找到的未覆盖的引导零点。令Z1表示Z0列中的星号零(如果有的话)。设Z2表示Z1行中的准备零(总会有一个)。继续,直到系列终止于其列中没有星号零的已准备好的零点。 Unstar系列中每个已加星标的零,为系列中的每个引导零点加注星标,擦除所有素数并揭示矩阵中的每一行。返回 第3步

第6步 makeMoreZeroes ):将步骤4中找到的值添加到每个被覆盖行的每个元素中,并从每个未覆盖列的每个元素中减去它。返回 第4步 ,而不更改任何星号,素数或覆盖线。

完成:分配对由成本矩阵中已加星标的零的位置指示。如果C(i,j)是加星号零,则与行i关联的元素将分配给与列j关联的元素。

希望这有帮助。