算法3. 匈牙利匹配算法

输入:损失矩阵 Cost ( C i , C j ) = 1 i = 1 m j = 1 n S i j Z i j

输出:匹配矩阵 Matched ( C i , C j )

1) 在给定的损失矩阵中,遍历该行的所有列元素并减去该行成本最低的元素。确保每一行至少有一个零

2) 从第1步生成的结果成本矩阵中,遍历各列并减去每一列中成本最低的元素,确保每一列至少包含一个零

3) 分配零

a) 检查每一行的各个元素,找出各行中并未标记为零的元素。标记该元素并划掉与该元素同一列的其他元素。对其他行执行相同的操作

b) 检查每一列的各个元素,找出各列中并未标记为零的元素。标记该元素并划掉与该元素同一行的其他元素。对其他列执行相同的操作

4) 执行最佳测试

a) 如果每一行和每一列都恰好有一个标记元素,则当前分配是最优的

b) 如果至少一行或一列缺少分配(即,如果至少一行或一列缺少一个带标记的零元素),则当前分配不是最佳的。继续执行步骤5。从步骤1中创建的成本矩阵的每一列中的所有条目中减去成本最低的元素,并确保每一列至少有一个零

5) 绘制最少数量的直线以覆盖所有零点

a) 突出显示未分配的行;

b) 在已标记的行中对未标记的列进行标记

c) 在已标记的列中对未标记的行进行标记

d) 继续(b)和(c),直到找不到新的未标记的行和列为止

e) 在所有未被标记的行和列上画线,得到覆盖所有零元素的最少直线数

6) 找出未被直线覆盖的最低成本元素。在所有未覆盖的元素中减去这个成本最低的元素,并将该最小元素添加到这些直线相交处的所有元素,得到新的损失矩阵

7) 继续第1~6步,直到找到最合适的分配

8) 输出匹配矩阵