二分图与匈牙利算法,Python实现


二分图定义

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。(摘自百度百科)

边独立集(即匹配)的定义

截图摘自:MOOC 集合论与图论(下)

二分图(即偶图)的完全匹配和完美匹配

截图摘自:MOOC 集合论与图论(下)

二分图匹配的条件

匈牙利算法

匈牙利算法——最大匹配问题详解

匈牙利算法-看这篇绝对就够了!

匈牙利算法流程以及Python程序实现

代码:

from scipy.optimize import linear_sum_assignment
import numpy as np

cost = np.array([[4, 1, 3, 6], [2, 0, 5, 1], [3, 2, 2, 8], [4, 3, 2, 9]])
row_ind, col_ind = linear_sum_assignment(cost)
print('row_ind:')
print(row_ind)   # 开销矩阵对应的行索引
print('col_ind:')
print(col_ind)   # 对应行索引的最优指派的列索引
print('cost:')
print(cost[row_ind, col_ind])   # 提取每个行索引的最优指派列索引所在的元素,形成数组
print('cost_sum:')
print(cost[row_ind, col_ind].sum())   # 最小开销

运行结果:

上述代码是把矩阵当做开销矩阵,希望求得最小开销;如果把矩阵当做收益矩阵,则希望得到最大收益,这时可以矩阵前面添加一个负号,以求得最大收益的分配。

from scipy.optimize import linear_sum_assignment
import numpy as np

cost = np.array([[4, 1, 3, 6], [2, 0, 5, 1], [3, 2, 2, 8], [4, 3, 2, 9]])
cost = -cost
row_ind, col_ind = linear_sum_assignment(cost)
print('row_ind:')
print(row_ind)   # 收益矩阵对应的行索引
print('col_ind:')
print(col_ind)   # 对应行索引的最优指派的列索引
print('benefit:')
print(-cost[row_ind, col_ind])   # 提取每个行索引的最优指派列索引所在的元素,形成数组
print('benefit_sum:')
print(-cost[row_ind, col_ind].sum())   # 最大收益

运行结果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM