指派问题——匈牙利Hungary算法(用python实现)

注:昨天刚刚看了关于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        300  0]
 [ (0)       10      5       7  2]
 [  9        8      (0)      5  4]
 [ “06       3       6  5]
  • 现在,依次检查每列。规则同上。

 [ 5       (0)       202]
 [ 2        30“      (0)    “0“]
 [ (0)      10       5        7      2]
 [ 9        8       (0)       5      4]
 [ “06        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]
 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值