前言:最近在備戰數模,看到了指派問題,饒有興趣,百度上找了很多關於指派問題的解法,很明顯用的是匈牙利算法,手工的計算,各種各種的博客都很詳盡,大概都瞭解了具體原理(不懂的人可以自行百度),但是基本找不到算法實現,有了也很難去驗證對不對。可能爲了省時間吧(不想重新造輪子,懶),就想找找python有沒有什麼庫函數可以實現,找了很多博客什麼的,還是找不到。想着指派問題也是0-1規劃,線性規劃用的也是scipy.optimize的庫函數,一氣之下,直接去翻scipy.optimize的官網。還是官網無敵啊。廢話不多說了,先看個示例的開銷矩陣:
那麼肉眼看的話就很簡單了,第一行[4 1 3]就選第二列的1,第二行[2 0 5]就選第一列的2,第三行[3 2 2]就選第三列的2,那麼開銷的和就是5。那麼用python解的話,用到scipy.optimize.linear_sum_assignment(cost_matrix)這個函數了。直接貼代碼:
- from scipy.optimize import linear_sum_assignment
-
- cost =np.array([[4,1,3],[2,0,5],[3,2,2]])
- row_ind,col_ind=linear_sum_assignment(cost)
- print(row_ind)#開銷矩陣對應的行索引
- print(col_ind)#對應行索引的最優指派的列索引
- print(cost[row_ind,col_ind])#提取每個行索引的最優指派列索引所在的元素,形成數組
- print(cost[row_ind,col_ind].sum())#數組求和
那麼輸出結果:
- [0 1 2]
- [1 0 2]
- [1 2 2]
- 5
索引從0開始就不多說了,還是多嘴一句,官網纔是無敵的!那麼就貼下這個函數的官網吧https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html#scipy.optimize.linear_sum_assignment
以上。