注:昨天刚刚看了关于python的关于数组的简单操作,就将匈牙利算法用python实现了以下。其中可能有很多点可以用python中数组本身属性实现,但由于初学,所以不熟悉而导致步骤繁琐的望指出~
1.匈牙利算法的简单例子
(1)矩阵所表示的就是从A点到B所要付出的代价,一般目标函数都是使得代价最小,那么匈牙利算法就是一种精确算法,求解在多个出发点和多个目标点的情况下得出最小代价。约束是一个出发点只能对应一个目标点,在操作矩阵上的表现为某行某列只能选择一个数,即基于所选择的数画十字,这个十字上没有其他任何对应选择。
(2)初始矩阵
[12 7 9 7 9]
[ 8 9 6 6 6]
[ 7 17 12 14 9]
[15 14 6 11 10]
[ 4 10 7 10 9]
(3)矩阵每行每列都减去该行该列的最小元素(此处每行每列至少出现一个0)
[ 5 0 2 0 2]
[ 2 3 0 0 0]
[ 0 10 5 7 2]
[ 9 8 0 5 4]
[ 0 6 3 6 5]
(4)制定完全分配方案(即每个目标每个地点都被匹配)
- 从第一行开始,依次检查各行,直到找出只有一个未标记的0元素的一行。【圆括号表示选中标记,双引号表示忽略标记,即如果某数上有符号,表示该数已标记】。对未标记的0元素进行圆括号选中标记,并对同一列上的其他0元素进行双引号忽略标记。重复这一过程,直到每行没有尚未标记的0元素或至少有2个以上的0元素。
[ 5 0 2 0 2]
[ 2 3 “0“ 0 0]
[ (0) 10 5 7 2]
[ 9 8 (0) 5 4]
[ “0“ 6 3 6 5]
- 现在,依次检查每列。规则同上。
[ 5 (0) 2 “0“ 2]
[ 2 3 “0“ (0) “0“]
[ (0) 10 5 7 2]
[ 9 8 (0) 5 4]
[ “0“ 6 3 6 5]
- 最后如果还存在都行多列同时有两个或两个以上的尚未标记的0元素,则可将其中任意行或列的一个为标记的0元素作选中标记,并将同行同列的其他0元素作忽略标记。
- 以上并没有做到完全分配(第四行还有进行选中),于是根据以下步骤调整矩阵
a.检查尚未标记()的行,并且打勾☑️,得
[ 5 (0) 2 “0“ 2]
[ 2 3 “0“ (0) “0“]
[ (0) 10 5 7 2]
[ 9 8 (0) 5 4]
[ “0“ 6 3 6 5] ☑️
b.在已☑️的行中对所有有0元素的列打☑️
c.在对已☑️的列中对已有标记()的行进行☑️,得
[ 5 (0) 2 “0“ 2]
[ 2 3 “0“ (0) “0“]
[ (0) 10 5 7 2] ☑️
[ 9 8 (0) 5 4]