匈牙利匹配算法原理以及python实现

原理可参考链接
重:Munkres’ Assignment Algorithm Modified for Rectangular Matrices
Munkres 分配算法
Kuhn-Munkres 算法详细解析
带你入门多目标跟踪(三)匈牙利算法&KM算法
趣写算法系列之–匈牙利算法
匈牙利算法维基百科
【原创】我的KM算法详解
在Python中运行munkres库的复杂性
匈牙利算法和KM算法

匈牙利匹配的用法可以直接调用模块:(输出的结果不一样但都是最大匹配)

from sklearn.utils.linear_assignment_ import linear_assignment
## 法1:使用sklearn的模块
cost_matrix = np.array([[147],[256],[671]) #这里自己定义
indices = linear_assignment(cost_matrix)
# indices 是一个n x 2的矩阵 对应代价矩阵的最大匹配的位置
print(indices)


## 法2:使用scipy的模块
from scipy.optimize import linear_sum_assignment
row_ind, col_ind = linear_sum_assignment(cost_matrix)
print([(x,y) for x,y in zip(row_ind,col_ind)])
# row_ind,col为代价矩阵最佳匹配元素的行号和列号

原理和源代码:

[ 16 26 16 23 40 82 73 35 51 61 15 66 76 98 97 66 7 52 92 65 ] \left[ \begin{matrix} & 16 & 26 &16& 23& 40 \\ & 82& 73& 35& 51& 61 \\ & 15& 66& 76& 98& 97 \\ & 66& 7 &52& 92& 65 \\ \end{matrix} \right] 168215662673667163576522351989240619765

[ 0 10 0 7 24 47 38 0 16 26 0 51 61 83 82 59 0 45 85 58 ] \left[ \begin{matrix} &0 &10 & 0 &7& 24\\ &47& 38& 0&16 &26 \\ &0& 51 &61& 83& 82\\ &59 & 0& 45& 85& 58\\ \end{matrix} \right] 0470591038510006145716838524268258

marked:
[ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 ] \left[ \begin{matrix} &1 &0 &0& 0 &0 \\ &0& 0 &1 &0 &0\\ &0 &0 &0 &0& 0\\ &0 &1& 0 &0& 0\\ \end{matrix} \right] 10000001010000000000
self.marked
[[1 0 0 0 2],
[0 0 1 0 0],
[2 0 0 0 0],
[0 1 0 0 0]]

6 x 7 matrix

原矩阵:
[ 80 50 16 77 36 46 1 15 14 44 75 40 85 91 89 16 73 90 10 73 97 87 95 60 58 76 88 48 95 57 68 12 2 19 6 35 24 58 16 36 42 58 ] \left[ \begin{matrix} &80 &50&16&77&36&46& 1\\ &15 &14&44&75&40&85&91\\ & 89&16&73&90&10&73&97\\ &87&95&60&58& 76&88& 48\\ &95&57 &68 &12 &2& 19 & 6\\ &35&24&58 &16 &36 &42 &58\\ \end{matrix} \right] 801589879535501416955724164473606858777590581216364010762364685738819421919748658
行归约:(对第一次匹配的标记一个1
[ 79 49 15 76 35 45 0 1 1 0 1 30 61 26 71 77 79 6 63 80 0 1 63 87 39 47 12 10 28 40 0 93 55 66 10 0 17 4 19 8 42 0 1 20 26 42 ] \left[ \begin{matrix} &79& 49 &15 &76 &35& 45& \color{#00f} 0^1 \\ & 1 &\color{#00f}0^1& 30 &61&26& 71 &77\\ & 79& 6 &63& 80& \color{#00f}0^1& 63& 87\\ & 39& 47 &12& 10 &28& 40 & 0\\ & 93& 55& 66 &10 & 0& 17 &4\\ & 19& 8 &42 & \color{#00f}0^1& 20 &26& 42\\ \end{matrix} \right] 791793993194901647558153063126642766180101001352601280204571634017260177870442
在这里插入图片描述
self.marked
[[0 0 0 0 0 0 1],
[0 1 0 0 0 0 0],
[0 0 0 0 1 0 0],
[0 0 0 0 0 0 0],
[0 0 0 0 0 0 0],
[0 0 0 1 0 0 0]]
列覆盖后没有0了
减去最小值后(b,1)处为0标记为2
[ 78 49 14 76 35 44 0 1 0 0 1 29 61 26 70 77 78 6 62 80 0 1 62 87 38 47 11 10 28 39 0 92 55 65 10 0 16 4 18 8 41 0 1 20 25 42 ] \left[ \begin{matrix} &78 &49 &14& 76& 35& 44&\color{#00f} 0^1\\ &0& \color{#00f}0^1& 29& 61& 26 &70& 77\\ & 78& 6& 62 &80 & \color{#00f}0^1& 62& 87\\ & 38& 47 &11& 10 &28& 39 & 0\\ & 92& 55 &65& 10& 0 &16 &4\\ & 18 &8 &41 &\color{#00f} 0^1& 20 &25& 42\\ \end{matrix} \right] 780783892184901647558142962116541766180101001352601280204470623916250177870442

[ 78 49 14 76 35 44 0 1 0 2 0 1 29 61 26 70 77 78 6 62 80 0 1 62 87 38 47 11 10 28 39 0 92 55 65 10 0 16 4 18 8 41 0 1 20 25 42 ] \left[ \begin{matrix} &78 &49 &14& 76& 35& 44&\color{#00f} 0^1\\ &\color{#f00} 0^2 & \color{#00f}0^1& 29& 61& 26 &70& 77\\ & 78& 6& 62 &80 & \color{#00f}0^1& 62& 87\\ & 38& 47 &11& 10 &28& 39 & 0\\ & 92& 55 &65& 10& 0 &16 &4\\ & 18 &8 &41 &\color{#00f} 0^1& 20 &25& 42\\ \end{matrix} \right] 7802783892184901647558142962116541766180101001352601280204470623916250177870442
在这里插入图片描述
self.marked
[[0 0 0 0 0 0 1],
[2 1 0 0 0 0 0],
[0 0 0 0 1 0 0],
[0 0 0 0 0 0 0],
[0 0 0 0 0 0 0],
[0 0 0 1 0 0 0]]
再减去最小值后
[ 72 43 8 76 35 38 0 1 0 2 0 1 29 67 32 70 83 72 0 2 56 80 0 1 56 87 32 41 5 10 28 33 0 86 49 59 10 0 10 4 12 2 35 0 1 20 19 42 ] \left[ \begin{matrix} &72& 43 &8& 76 &35& 38& \color{#00f} 0^1\\ &\color{#f00} 0^2 & \color{#00f} 0^1& 29& 67& 32 &70& 83\\ & 72 &\color{#f00} 0^2& 56 &80& \color{#00f} 0^1& 56& 87\\ & 32& 41& 5 &10 &28& 33 & 0\\ & 86 &49& 59 &10 & 0& 10 & 4\\ & 12 & 2& 35& \color{#00f} 0^1 &20& 19 &42\\ \end{matrix} \right] 720272328612430102414928295655935766780101001353201280203870563310190183870442
在这里插入图片描述
self.marked
[[0 0 0 0 0 0 1],
[2 1 0 0 0 0 0],
[0 2 0 0 1 0 0],
[0 0 0 0 0 0 0],
[0 0 0 0 0 0 0],
[0 0 0 1 0 0 0]]

将第5列置为true后第e,5出现新的0
[ 72 43 8 76 35 38 0 1 0 2 0 1 29 67 32 70 83 72 0 2 56 80 0 1 56 87 32 41 5 10 28 33 0 86 49 59 10 0 2 10 4 12 2 35 0 1 20 19 42 ] \left[ \begin{matrix} &72& 43 &8& 76 &35& 38& \color{#00f} 0^1\\ &\color{#f00} 0^2 & \color{#00f} 0^1& 29& 67& 32 &70& 83\\ & 72 &\color{#f00} 0^2& 56 &80& \color{#00f} 0^1& 56& 87\\ & 32& 41& 5 &10 &28& 33 & 0\\ & 86 &49& 59 &10 &\color{#f00} 0^2& 10 & 4\\ & 12 & 2& 35& \color{#00f} 0^1 &20& 19 &42\\ \end{matrix} \right] 7202723286124301024149282956559357667801010013532012802203870563310190183870442
增广路径:增广路径
self.marked
[[0 0 0 0 0 0 1],
[2 1 0 0 0 0 0],
[0 2 0 0 1 0 0],
[0 0 0 0 0 0 0],
[0 0 0 0 2 0 0],
[0 0 0 1 0 0 0]]
将增广路径取反,将路径上的1标记为0,路径上的2标记为1,清除覆盖
[ 72 43 8 76 35 38 0 1 0 1 0 29 67 32 70 83 72 0 1 56 80 0 56 87 32 41 5 10 28 33 0 86 49 59 10 0 1 10 4 12 2 35 0 1 20 19 42 ] \left[ \begin{matrix} &72& 43 &8& 76 &35& 38& \color{#00f} 0^1\\ &\color{#00f} 0^1 & 0& 29& 67& 32 &70& 83\\ & 72 &\color{#00f} 0^1& 56 &80& 0& 56& 87\\ & 32& 41& 5 &10 &28& 33 & 0\\ & 86 &49& 59 &10 &\color{#00f} 0^1& 10 & 4\\ & 12 & 2& 35& \color{#00f} 0^1 &20& 19 &42\\ \end{matrix} \right] 72017232861243001414928295655935766780101001353202801203870563310190183870442
[[0 0 0 0 0 0 1],
[1 0 0 0 0 0 0],
[0 1 0 0 0 0 0],
[0 0 0 0 0 0 0],
[0 0 0 0 1 0 0],
[0 0 0 1 0 0 0]]
只有5个匹配小于6,除了列覆盖以外减去最小值
在这里插入图片描述
[ 72 43 3 76 35 33 0 0 0 24 67 32 65 83 72 0 51 80 0 51 87 32 41 0 2 10 28 28 0 86 49 54 10 0 5 4 12 2 30 0 20 14 42 ] \left[ \begin{matrix} &72& 43 & 3& 76& 35& 33& 0\\ & 0 & 0 &24& 67 &32 &65& 83\\ & 72 & 0& 51 &80& 0& 51 &87\\ & 32& 41 & \color{#f00}0^2& 10& 28& 28 & 0 \\ & 86 &49 &54 &10& 0 &5 &4\\ & 12 & 2 &30 &0& 20& 14& 42\\ \end{matrix} \right] 720723286124300414923245102543076678010100353202802033655128514083870442

self.marked
[[0 0 0 0 0 0 1],
[1 0 0 0 0 0 0],
[0 1 0 0 0 0 0],
[0 0 2 0 0 0 0],
[0 0 0 0 1 0 0],
[0 0 0 1 0 0 0]]
进入step5修改2为1

[ 72 43 3 76 35 33 0 1 0 1 0 24 67 32 65 83 72 0 1 51 80 0 51 87 32 41 0 1 10 28 28 0 86 49 54 10 0 1 5 4 12 2 30 0 1 20 14 42 ] \left[ \begin{matrix} &72& 43 & 3& 76& 35& 33& \color{#00f}0^1\\ & \color{#00f}0^1 & 0 &24& 67 &32 &65& 83\\ & 72 & \color{#00f}0^1& 51 &80& 0& 51 &87\\ & 32& 41 & \color{#00f}0^1& 10& 28& 28 & 0 \\ & 86 &49 &54 &10& \color{#00f}0^1 &5 &4\\ & 12 & 2 &30 &\color{#00f}0^1& 20& 14& 42\\ \end{matrix} \right] 72017232861243001414923245101543076678010100135320280120336551285140183870442

[ 80 50 16 77 36 46 1 15 14 44 75 40 85 91 89 16 73 90 10 73 97 87 95 60 58 76 88 48 95 57 68 12 2 19 6 35 24 58 16 36 42 58 ] \left[ \begin{matrix} &80 &50&16&77&36&46& \color{#00f} 1\\ & \color{#00f}15 &14&44&75&40&85&91\\ & 89& \color{#00f}16&73&90&10&73&97\\ &87&95& \color{#00f}60&58& 76&88& 48\\ &95&57 &68 &12 & \color{#00f}2& 19 & 6\\ &35&24&58 & \color{#00f}16 &36 &42 &58\\ \end{matrix} \right] 801589879535501416955724164473606858777590581216364010762364685738819421919748658

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值