二分圖定義
二分圖又稱作二部圖,是圖論中的一種特殊模型。 設G=(V,E)是一個無向圖,如果頂點V可分割為兩個互不相交的子集(A,B),並且圖中的每條邊(i,j)所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集(i in A,j in B),則稱圖G為一個二分圖。簡而言之,就是頂點集V可分割為兩個互不相交的子集,並且圖中每條邊依附的兩個頂點都分屬於這兩個互不相交的子集,兩個子集內的頂點不相鄰。(摘自百度百科)
邊獨立集(即匹配)的定義
截圖摘自:MOOC 集合論與圖論(下)
二分圖(即偶圖)的完全匹配和完美匹配
截圖摘自:MOOC 集合論與圖論(下)
二分圖匹配的條件
匈牙利算法
代碼:
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()) # 最大收益
運行結果: