Kuhn Munkres 演算法詳細解析

2021-08-15 06:07:22 字數 3618 閱讀 6194

直接進入正題,kuhn-munkres 演算法(下文簡稱 km 演算法)是為了高效求解二分圖最佳完美匹配問題而生的,我們先溫習一下幾個概念,如果你對這幾個概念不是很熟悉的話,建議先去學習。

不要被概念弄的暈了,用最直觀的方式考慮。情景是有乙個班級的學生要結成男女兩兩一組,但每個學生只想自己喜歡的異性結成一組,於是這就會有衝突。由於男男、**不會結成一組,這是乙個二分圖。二分圖最大匹配就是要給出乙個最優方案,使得結成的組數最多。

下面說複習二分圖最大匹配相關:

為了方便敘述,我們將二分圖染色後同顏色的節點放在同一側,形成左側(x

x 集),右側(y

y 集)。

增廣路互換的實質可以這麼考慮,如上圖:從未匹配點 a 出發,a 想與 b 匹配,於是通過未匹配邊找到 b,然而 b 已經是匹配點,於是只能經過匹配邊去問 c 能不能與別人匹配,c 經過未匹配邊找到 d,由於 d 是未匹配點,所以 c 成功與 d 匹配。cd 之間的邊變為匹配邊;bc 之間解除關係,變為未匹配邊;ab 之間建立關係,變為匹配邊。這便是增廣路互換的實質。

回到上面的情景,完美匹配就是可以得到乙個方案,使得所有男女同學都可以結成兩兩一組。

km 演算法是通過給每個頂點乙個標號(叫做頂標)來把求最大權完美匹配的問題轉化為求完美匹配的問題的。可以簡單理解為節點函式就是節點的乙個值。

可行頂標就是對於所有頂點的函式值 l

l,使得對於任意弧 e(x \rightarrow y)e(

x→y)

,都滿足 l_ + l_ \ge w_l​

x​​+

l​y​

​≥w​

e​​, km 演算法的頂標自始至終滿足這一條件。

接著是相等子圖,相等子圖包含原圖中所有的點,但只包含滿足 l_ + l_ = w_l​

x​​+

l​y​

​=w​

e​​ 的所有弧 e(x \rightarrow y)e(

x→y)

,根據定義,這些弧一定是當前最大的弧(不等式已經取到等號),那麼如果相等子圖有完美匹配,那這個完美匹配一定是最大完美匹配。因為相等子圖的權值和為所有點的頂標之和,而隨便乙個匹配中的邊因為受到 w_ \le l_ + l_w​

e​​≤

l​x​

​+l​

y​​ 的限制,不可能比所有點的頂標之和大,所以這個極為重要的定理還是很好證明的。

所以演算法的主要矛盾就在於尋找可行頂標,使得相等子圖有完美匹配。可行頂標的修改過程中,每一步都運用了貪心的思想,這樣我們的最終結果一定是最優的。下面是演算法的敘述:

因為有 l_ + l_ = w_l​

x​​+

l​y​

​=w​

e​​ 恆成立,我們設左側(y

y 集)的所有節點頂標為 0

0,那麼所有 x

x 集的點的頂標就必須為從它出發所有的邊的最大值。

接著求其完美匹配,如果成功,結束演算法,否則必須修改頂標,使得有更多的邊能夠參與進來。

我們求當前相等子圖的完美匹配失敗,是因為對於某個未匹配頂點 u

u,我們找不到一條從它出發的增廣路,這時我們只能獲得一條交替路。我們把 x

x 集中在交替路的點集叫做 s

s, x

x 集中不在交替路的點集叫做 s's​

′​​,同理 y

y 集中在交替路的點集叫做 t

t, y

y 集中不在交替路的點集叫做 t't​

′​​。

如果我們把交替路中 x

x 集頂點的頂標全都減小某個值 dd,y

y 集的頂標全都增加同乙個值 d

d,那麼我們會發現:

也就是說,只有 x

x 集一端在 s

s 中,y

y 端在 t't​

′​​ 中的邊才有可能被選中。繼續貪心,我們只能讓滿足條件的邊權最大的邊被選中,即滿足 l_ + l_ = w_l​

x​​+

l​y​

​=w​

e​​,那麼這個 d

d 值,就應該取 d = \min\ + l_ - w_\ \vert \ x \in s, y \in t'\}d=

min。

於是有新的邊加入相等子圖,我們可以愉快的繼續對於未匹配頂點 u

u 尋找增廣路,這樣的修改最多進行 n

n 次,而一共有 n

n 個點,所以除去修改頂標的時間,複雜度已經達到 o(n^)o(

n​2​

​)。因此演算法的複雜度主要取決於修改頂標的時間。

思路一:列舉所有 n^n​

2​​ 條邊,看是否滿足條件,滿足條件就更新 d

d 值。最直觀清晰,然而總的複雜度飆公升至 o(n^)o(

n​4​

​)。思路二:對於 t't​

′​​ 的每個點 v

v,定義鬆弛變數 slack(v) = \min\+l_ -w_\ \vert\ x\in s\}sl

ack(

v)=min

,這個鬆弛變數在匹配的過程中就可以更新,修改頂標的過程中 d = \min\d=

min。總複雜度 o(n^)o(

n​3​

​),但不是嚴格的(想一想為什麼)?但實際已經夠用。

km 演算法僅僅只適用於找二分圖最佳完美匹配,如果無完美匹配,那麼演算法很可能陷入死迴圈(如果不存在的邊為 -inf 的話就不會,但正確性就無法保證了),對於這種情況要小心處理。

最後回顧一下總的流程,理一下思路:

初始化可行頂標。

用增廣路定理尋對每個點找匹配。

若點未找到匹配則修改可行頂標的值。

重複2、3步直到所有點均有匹配為止,即找到相等子圖的完美匹配為止。

const

intmaxn

=500+3

,inf

=0x3f3f3f3f

;intn,

w[maxn

][maxn

];int

mat[

maxn

];intlx[

maxn

],ly

[maxn

],slack

[maxn

];bools[

maxn],t

[maxn

];inline

void

tension

(int&a

,const

intb

)inline

bool

match

(intu)

}else

tension

(slack[v

],t);}

return

false;}

inline

void

update()}

inline

void

km()

for(

inti=0

;i++i)}

}

參考目錄: & 劉汝佳:《訓練指南》

匈牙利演算法和Kuhn Munkres演算法

內容摘自高隨祥的 圖論與網路流理論 一書 n s 或者 x 或 y 表示的是相應集合的元素的個數。n s 表示與s集合中的頂點相鄰接的頂點,例如,a b c d中,b的鄰接點就是a和c。a b c d是一條增廣路,紅色線表示屬於m匹配,黑色線表示不屬於,圖中,b,c兩點是m飽和的,a,d兩點是非m飽...

Kuhn Munkres演算法 剪輯 (備用)

km演算法是通過給每個頂點乙個標號 叫做頂標 來把求最大權匹配的問題轉化為求完備匹配的問題的。設頂點xi的頂標為a i 頂點yi的頂標為b i 頂點xi與yj之間的邊權為w i,j 在演算法執行過程中的任一時刻,對於任一條邊 i,j a i b j w i,j 始終成立。km演算法的正確性基於以下定...

EM演算法詳細講解

本文試圖用最簡單的例子 最淺顯的方式說明em expectation maximization 演算法的應用場景和使用方法,而略去公式的推導和收斂性的證明。以下內容翻譯自 data intensive text processing with mapreduce maximum likelihood...