edmonds算法matlab,匈牙利算法的matlab实现
匈牙利算法
算法簡介
算法原理
算法實現(附代碼)
測試
算法簡介
下面摘用百度百科中的解釋。
匈牙利算法(Hungarian method)是由匈牙利數學家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性證明的思想,它是二分圖匹配最常見的算法,該算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的算法。
簡單來說,匈牙利算法就是為了解決匹配問題的一種算法。
可以設想這樣一個問題,有三個工人要共同完成三件任務。每個人只能專注完成一件任務。且工人完成不同任務所需要的時間是不一樣的。當然這里可以直接通過枚舉的方式來遍歷所有的分配方式來進行求解。但當求解的問題的維度變得比較大時,這樣處理就顯得不太明智了。所以,為了解決這一類問題,匈牙利算法得以提出。
算法原理
算法的輸入時一個代價矩陣c c,其中cij c i j表示工人i在任務j上的工作時長。
算法總的來說分成幾步。
step1
將矩陣c c化為每行每列都至少有一個0的矩陣。
例如輸入矩陣c=(1243) c = ( 1 4 2 3 )
首先處理行
找到每行中的最小1元素,如第一行中找到的是1,第二行中是2。每行中所有元素都減去該最小元素得(0031) ( 0 3 0 1 )。
之后處理列
這里檢查列發現第二列中沒有0元素。故繼續找到第二列總最小元素,并用第二列中的元素減去該最小元素,得(0020) ( 0 2 0 0 ).
step2
檢查矩陣中是否有相互獨立0的元素。也就是說能否找到與矩陣維度相同數目的0,它們占據不同的行列位置。如上的例子就可以找到這樣的兩個零元素,c11 c 11和c22 c 22。當然也有不是這種情況的例子。如[
????????02090531086005032070620542???????? ( 0 5 0 2 2 2 3 0 0 0 0 10 5 7 5 9 8 0 0 4 0 6 3 6 2 ) ]
如果在該步能找到獨立零,則算法就可在此結束。如上的例子,可以輸出
(1122) ( 1 2 1 2 ) .表示工人1完成任務1,工人2完成任務2。否則繼續執行下面步驟。
step3
以每一個0元素為中心畫十字架(即選中所有零元素所在的行元素和列元素)。找出沒有被選中的元素。然后將沒有被選中的元素所在的行進行標記。然后執行以下兩個步驟
1. 對以標記的行中的零元素所在的列進行標記。
2. 對已標記的列中的零元素所在的行進行標記。
重復進行上述操作,直至不能再進行標記為止。
可以證明,沒有標記的行以及標記了的列可以覆蓋所有的零元素。
step4
對沒有覆蓋的元素,找到里面值最小的一個。將標記了的行中的所有元素減去這個值,將標記了的列中的元素加上這個值。這樣的操作可以確保在未被覆蓋的區域內至少產生一個0,且原本的0元素不會改變。
之后跳轉到step2。
代碼
傳送門
簡要說明一下。Hungarian.m文件是主程序。
兩個輔助程序:
1. fix.m用于查找最佳分配,如果答案則可在all中得到所有最佳匹配。否則all為空,result中保存次最佳匹配。
2. findMin.m用于找到指定下標范圍內的最小元素。
測試結果
輸入
輸出
輸入
輸出
總結
以上是生活随笔為你收集整理的edmonds算法matlab,匈牙利算法的matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为 Matebook X 笔记本降价
- 下一篇: 玫瑰花函数matlab,网上收到的用ma