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

转自:http://www.hungarianalgorithm.com/examplehungarianalgorithm.php
 

匈牙利算法:一个例子

我们考虑一个例子,其中四个工作(W1,W2,W3和W4)需要执行四个作业(J1,J2,J3和J4),每个工作一个作业。下面的矩阵显示了将某个工人分配给某个工作的成本。目标是最小化任务的总成本。

 J1J2J3J4
W182836992
W277374992
W31169586
W4899823

下面我们将使用这个例子解释匈牙利算法。

第1步:减去行最小值

我们首先从每行中减去行最小值。例如,第一行中的最小元素是69.因此,我们从第一行中的每个元素中减去69。得到的矩阵是:

 J1J2J3J4 
W11314023(-69)
W24001255(-37)
W3664081(-5)
W4019015(-8)

第2步:减去列最小值

同样,我们从每列中减去列最小值,给出以下矩阵:

 J1J2J3J4
W1131408
W24001240
W3664066
W401900
    (-15)

第3步:用最少的行数覆盖全零

我们现在将确定覆盖矩阵中所有零所需的最小行/列数(水平或垂直)。可以使用2行+1列(第二行,第四行,第三列)覆盖所有零:

 J1J2J3J4 
W1131408 
W24001240  X
W3664066 
W401900  X
   X  

因为所需的行数(3)低于矩阵的大小(n = 4),所以继续步骤4。

第4步:创建其他零

首先,我们发现最小的未覆盖数是6.我们从所有未覆盖的元素中减去这个数字,并将其添加到所有被覆盖两次的元素中。这导致以下矩阵:

 J1J2J3J4
W17802
W24001840
W3058060
W401960

现在我们回到第3步。

第3步:用最少的行数覆盖全零

同样,我们确定覆盖矩阵中所有零所需的最小行数。现在需要4行:

 J1J2J3J4
W17802  X
W24001840  X
W3058060  X
W401960  X

因为所需的行数(4)等于矩阵的大小(n = 4),所以矩阵中的零之间存在最佳分配。因此,算法停止。

最佳分配

以下零点包含最佳分配:

 J1J2J3J4
W17802
W24001840
W3058060
W401960

这对应于原始成本矩阵中的以下最佳分配:

 J1J2J3J4
W182836992
W277374992
W3116986
W4899823

因此,工人1应该执行工作3,工人2工作2,工人3工作1,工人4应该执行工作4.该最佳分配的总成本是69 + 37 + 11 + 23 = 140

  • 17
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值