KM演算法總結

來源:互聯網
上載者:User

【二分圖】二分圖是一種特殊的圖結構,所有點分為兩類,記做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。

相關關鍵詞:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.