KM算法總結

【二分圖】二分圖是一種特殊的圖結構,所有點分爲兩類,記做x和y,所有的邊的兩端分別在x和y,不存在兩端同在x或y的邊。

【最大匹配、完備匹配】

給定一個二分圖(x,y),找到一種匹配數最大的方案,記做最大匹配。|x|=|y|=匹配數時,我們稱該匹配方案爲完備匹配。

顯然,解決了最大匹配也就解決了完備匹配。

解決二分圖的最大匹配可以用網絡流或者匈牙利算法,兩者本質上是相同的,不過不論從編程複雜度還是運行效率來講,匈牙利算法都更加優秀。

關於匈牙利算法,可以參見我以前寫的文章:用匈牙利算法求二分圖的最大匹配

這裏我主要敘述另一類問題:

【最優完備匹配】

對於二分圖的每條邊都有一個權(非負),要求一種完備匹配方案,使得所有匹配邊的權和最大,記做最優完備匹配。(特殊的,當所有邊的權爲1時,就是最大完備匹配問題)

KM算法:(全稱是Kuhn-Munkras,是這兩個人在1957年提出的,有趣的是,匈牙利算法是在1965年提出的)

爲每個點設立一個頂標Li,先不要去管它的意義。

設vi,j­爲(i,j)邊的權,如果可以求得一個完備匹配,使得每條匹配邊vi,j=Li+Lj,其餘邊vi,j≤Li+Lj

此時的解就是最優的,因爲匹配邊的權和=∑Li,其餘任意解的權和都不可能比這個大

定理:二分圖中所有vi,j=Li+Lj的邊構成一個子圖G,用匈牙利算法求G中的最大匹配,如果該匹配是完備匹配,則是最優完備匹配。

(不知道怎麼證明)

問題是,現在連Li的意義還不清楚。

其實,我們現在要求的就是L的值,使得在該L值下達到最優完備匹配。

L初始化:

Li=max{wi,j}(i∈x,j∈y)

Lj=0

建立子圖G,用匈牙利算法求G的最大匹配,如果在某點i (i∈x)找不到增廣軌,則得不到完備匹配。

此時需要對L做一些調整:

設S爲尋找從i出發的增廣軌時訪問的x中的點的集合,T爲訪問的y中的點的集合。

找到一個改進量dx,dx=min{Li+Lj-wi,j}(i∈S,j不∈T)

Li=Li-dx (i∈S)

Li=Li+dx (i∈T)

重複以上過程,不斷的調整L,直到求出完備匹配爲止。

從調整過程中可以看出:

每次調整後新子圖中在包含原子圖中所有的邊的基礎上添加了一些新邊。

每次調整後∑Li會減少dx,由於每次dx取最小,所以保證瞭解的最優性。

複雜度分析:

設m爲邊數,從x中的一個未蓋點出發尋找增廣軌的複雜度最壞是O(m),每次調整後至少添加一條邊,則最多調整m次,每次調整的的複雜度最壞是O(m),所以總的複雜度在最壞情況下是O(m+m2)=O(m2)

擴展:

根據KM算法的實質,可以求出使得所有匹配邊的權和最小的匹配方案。

L初始化:

Li=min{wi,j}(i∈x,j∈y)

Lj=0

dx=min{wi,j-Li-Lj}(i∈S,j不∈T)

Li=Li+dx (i∈S)

Li=Li-dx (i∈T)

【最優匹配】

與最優完備匹配很相似,但不必以完備匹配爲前提。

只要對KM算法作一些修改就可以了:

將原圖轉換成完全二分圖(m=|x||y|),添加原圖中不存在的邊,並且設該邊的權值爲0。

 

轉載地址:http://blog.csdn.net/hqd_acm/article/details/5829682

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章