二分圖與匈牙利算法,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