匈牙利算法
我们考虑一种情况,四个工作(J1, J2, J3, J4)需要四个工人(W1, W2, W3, W4)来完成,一个工作由一个工人完成。每个工人完成每个工作的成本矩阵如下。最终目标是最小化分配的总成本。
接下来通过这个例子解释匈牙利算法。
步骤1:减去行中的最小值
我们将每一行减去该行中的最小值。比如第一行中的最小值就是69。因此第一行的所有元素都要减去69,最后的结果矩阵如下:
步骤2:减去列中最小值
同样的,每一列减去该列中的最小值,得到以下矩阵:
(注意前三列中各自的最小值都是0,因此不变)
步骤3:用最少的线覆盖所有的0
我们用最少的线(水平或者垂直)覆盖矩阵中所有的0。可以用3条线覆盖所有的0。
因为按照要求得到的线的数量是3,小于矩阵的大小(n=4),我们继续步骤4。
步骤4:创建额外的0
首先,我们发现未覆盖的最小值是6。将步骤3得到的矩阵中未覆盖的元素都减去6,覆盖两次的元素(12和90)加上6,得到以下矩阵:
然后返回步骤3。
步骤3:用最少的线覆盖所有的0
再次,我们用最少的线覆盖矩阵中所有的0,现在满足条件的有4条线。
因为满足条件的线数等于矩阵的大小(n=4),矩阵的所有0存在最优分配,结束算法。
最优分配
以下的0表示最优分配:
对应的原始成本矩阵中的最优分配:
因此,工人1完成工作3,工人2完成工作2,工人3完成工作1,工人4完成工作4。