匈牙利算法
转自:http://www.hungarianalgorithm.com/examplehungarianalgorithm.php
匈牙利算法:一个例子
我们考虑一个例子,其中四个工作(W1,W2,W3和W4)需要执行四个作业(J1,J2,J3和J4),每个工作一个作业。下面的矩阵显示了将某个工人分配给某个工作的成本。目标是最小化任务的总成本。
J1 | J2 | J3 | J4 | |
W1 | 82 | 83 | 69 | 92 |
W2 | 77 | 37 | 49 | 92 |
W3 | 11 | 69 | 5 | 86 |
W4 | 8 | 9 | 98 | 23 |
下面我们将使用这个例子解释匈牙利算法。
第1步:减去行最小值
我们首先从每行中减去行最小值。例如,第一行中的最小元素是69.因此,我们从第一行中的每个元素中减去69。得到的矩阵是:
J1 | J2 | J3 | J4 | ||
W1 | 13 | 14 | 0 | 23 | (-69) |
W2 | 40 | 0 | 12 | 55 | (-37) |
W3 | 6 | 64 | 0 | 81 | (-5) |
W4 | 0 | 1 | 90 | 15 | (-8) |
第2步:减去列最小值
同样,我们从每列中减去列最小值,给出以下矩阵:
J1 | J2 | J3 | J4 | |
W1 | 13 | 14 | 0 | 8 |
W2 | 40 | 0 | 12 | 40 |
W3 | 6 | 64 | 0 | 66 |
W4 | 0 | 1 | 90 | 0 |
(-15) |
第3步:用最少的行数覆盖全零
我们现在将确定覆盖矩阵中所有零所需的最小行数(水平或垂直)。可以使用3行覆盖所有零:
J1 | J2 | J3 | J4 | ||
W1 | 13 | 14 | 0 | 8 | |
W2 | 40 | 0 | 12 | 40 | X |
W3 | 6 | 64 | 0 | 66 | |
W4 | 0 | 1 | 90 | 0 | X |
X |
因为所需的行数(3)低于矩阵的大小(n = 4),所以继续步骤4。
第4步:创建其他零
首先,我们发现最小的未覆盖数是6.我们从所有未覆盖的元素中减去这个数字,并将其添加到所有被覆盖两次的元素中。这导致以下矩阵:
J1 | J2 | J3 | J4 | |
W1 | 7 | 8 | 0 | 2 |
W2 | 40 | 0 | 18 | 40 |
W3 | 0 | 58 | 0 | 60 |
W4 | 0 | 1 | 96 | 0 |
现在我们回到第3步。
第3步:用最少的行数覆盖全零
同样,我们确定覆盖矩阵中所有零所需的最小行数。现在需要4行:
J1 | J2 | J3 | J4 | ||
W1 | 7 | 8 | 0 | 2 | X |
W2 | 40 | 0 | 18 | 40 | X |
W3 | 0 | 58 | 0 | 60 | X |
W4 | 0 | 1 | 96 | 0 | X |
因为所需的行数(4)等于矩阵的大小(n = 4),所以矩阵中的零之间存在最佳分配。因此,算法停止。
最佳分配
以下零点包含最佳分配:
J1 | J2 | J3 | J4 | |
W1 | 7 | 8 | 0 | 2 |
W2 | 40 | 0 | 18 | 40 |
W3 | 0 | 58 | 0 | 60 |
W4 | 0 | 1 | 96 | 0 |
这对应于原始成本矩阵中的以下最佳分配:
J1 | J2 | J3 | J4 | |
W1 | 82 | 83 | 69 | 92 |
W2 | 77 | 37 | 49 | 92 |
W3 | 11 | 69 | 五 | 86 |
W4 | 8 | 9 | 98 | 23 |
因此,工人1应该执行工作3,工人2工作2,工人3工作1,工人4应该执行工作4.该最佳分配的总成本是69 + 37 + 11 + 23 = 140
posted on 2019-06-05 11:03 xiegangqingnian 阅读(747) 评论(0) 编辑 收藏 举报