匈牙利算法(The Hungarian algorithm) :一个通俗易懂的例子

转自: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

猜你喜欢

转载自blog.csdn.net/qq_37748396/article/details/88950424