1. 程式人生 > >從匈牙利算法到Kuhn-Munkres算法

從匈牙利算法到Kuhn-Munkres算法

是你 結果 訪問規則 工作 匈牙利 void 符號 解釋 忽略

匈牙利算法要解決的是這樣的問題,比如一群男生女生,男生是否有緣可以跟自己喜歡的人在一起。

當然我們簡化成集合符號A和B, A和B的大小可以不同,我們只想知道最後按照喜歡的人在一起的話,最多有幾對。

匈牙利算法從0開始構建匹配的可能性。如果男生Ai喜歡女生Bj而且女生Bj未匹配,那麽她當然可以跟男生Ai在一起了。

但是不要慌,後面的情況還可能變化,Ai可能Bj+1在一起,但是我們保證結果是每次都比原來的成功數要大的。

匈牙利算法當然是解決圖論的問題,這裏不用A,B了——X和Y兩個

從X開始,每次找到一個未配對的點u

抽象的說,是我們在X這邊保存了已經訪問過的點S,在Y這邊類似有T,從u點開始S和T都不斷增大,每次只增大1,增大

的規則是u的鄰接點y如果已經匹配z,就把y加到T,z加到S,下一步的操作,是換個u, 再將T中沒有訪問過的點再次考查

一遍。如果y沒有匹配,那正好,根據你的訪問規則,這個時候u和y肯定可以配對的,這樣就可以增加配對了。

我們的工作是為了讓配對的個數越來越多,直到最後不能再配對。不能配對的判定就是Hall定理,S的鄰接點剛好是T。

由於這個問題實在太過常見,以至於很多人還是像我10分鐘前想的例子一樣老掉牙。我們還是想個其他的抽象吧。

可能有人會希望說我們可以改成公司面試應聘者,多個公司跟多個應聘者匹配啊。對哦,前提是你們不要拿了offer就跑掉了。

 對了你有沒有想到前面說的是男生喜歡女生?如果是這樣的話說明什麽?我們忽略了方向。所以這個也是一廂情願的說。

 好了另外一個例子,如果東南亞n國希望出口椰子島中國各y省,但是一個省只能跟一國簽約(現實中沒有的)。這個也是

一種問題。那好的,我們現在定個價格,讓總的價格最大(餵餵餵),這不是對我們來說的,是對東南亞各國來說的。

 這個就是可以抽象成Kuhn-Munkres算法了。

 對我來說這個問題比較好理解,但是算法比較難證明。看起來就是一個算法的問題。

 我們要設計一個給X,Y標號的函數l,比如 l(x) = 1,然後根據這個函數再多次應用匈牙利算法——多次是感覺得多大?

 當然,這個函數前人已經設計好了。在每次叠代的時候,我們要根據w(xy)跟l(x)+l(y)的關系得到一個生成子圖G(就是滿足條件的x和y和這些邊),然後找最大匹配。當我們經過很多次的匈牙利算法就可以得到最終的結果了。

 文章需要配圖嗎?我隨便寫的。先這樣吧。

關於匈牙利算法,維基百科有很好的解釋,離散數學的課本一般也有介紹。另外Byvoid也有說過。

從匈牙利算法到Kuhn-Munkres算法