【程序人生】Hungarian Algorithm——匈牙利算法
原文链接
http://www.hungarianalgorithm.com/hungarianalgorithm.php
http://www.hungarianalgorithm.com/examplehungarianalgorithm.php
匈牙利算法解决的问题
匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),用于求解指派问题(assignment problem),算法时间复杂度为 O ( n 3 ) O(n^3) O(n3)。
匈牙利算法的步骤
匈牙利算法包括下面四个步骤,第一步和第二步只执行一次,第三步和第四步重复执行,直到得到最优的指派方案。这个算法的输入是一个 n ∗ n n * n n∗n的矩阵,且矩阵元素非负。
- 步骤一:每行元素减当前行最小值
对于每一行,找到这一行的最小元素,这一行的每个元素都减去这个最小元素。 - 步骤二:每列元素减当前列最小值
同样,对于每一列,找到这一列的最小元素,这一列的每个元素都减去这个最小元素。注意此时矩阵已经是经过第一步处理后的矩阵,如果这一列的最小值是0,那么就减0,而不是减输入矩阵中这一列的最小值。 - 步骤三:在矩阵上划横线或是竖线,用最少数量的线覆盖所有的0
如果用线的数量等于矩阵的宽度 n n n,则已经找到最优指派方案,算法结束。如果用线的数量小于矩阵的宽度 n n n,则进行第四步。 - 步骤四:找到没有被线覆盖的矩阵元素中的最小值,这里把它命名为 k k k。所有没有被线覆盖的矩阵元素减 k k k,所有同时被两条线覆盖的矩阵元素加 k k k。重复步骤三。
匈牙利算法的例子
这里有四份工作
J
1
,
J
2
,
J
3
,
J
4
J_1, J_2, J_3, J_4
J1,J2,J3,J4需要分配给四个工人
W
1
,
W
2
,
W
3
,
W
4
W_1, W_2, W_3, W_4
W1,W2,W3,W4,每个人只分配到一份工作。每个工人对应每份工作的要求劳务矩阵如下,这里用匈牙利算法求得总劳务最低的指派方案。
- 每行减最小值
- 每列减最小值
- 用最少数量的线覆盖所有零元素
- 线的数量为三,小于矩阵宽度四。所以找到没有被线覆盖的最小元素
k
k
k,所有没有被线覆盖的元素减
k
k
k,同时被两条线覆盖的元素加
k
k
k
- 重复执行步骤三
- 线的数量为四,等于矩阵宽度四。找到最优指派方案,算法结束。
结语
如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。