直接進入正題,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+
ly
≥w
e, km 演算法的頂標自始至終滿足這一條件。
接著是相等子圖,相等子圖包含原圖中所有的點,但只包含滿足 l_ + l_ = w_l
x+
ly
=w
e 的所有弧 e(x \rightarrow y)e(
x→y)
,根據定義,這些弧一定是當前最大的弧(不等式已經取到等號),那麼如果相等子圖有完美匹配,那這個完美匹配一定是最大完美匹配。因為相等子圖的權值和為所有點的頂標之和,而隨便乙個匹配中的邊因為受到 w_ \le l_ + l_w
e≤
lx
+l
y 的限制,不可能比所有點的頂標之和大,所以這個極為重要的定理還是很好證明的。
所以演算法的主要矛盾就在於尋找可行頂標,使得相等子圖有完美匹配。可行頂標的修改過程中,每一步都運用了貪心的思想,這樣我們的最終結果一定是最優的。下面是演算法的敘述:
因為有 l_ + l_ = w_l
x+
ly
=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+
ly
=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(
n2
)。因此演算法的複雜度主要取決於修改頂標的時間。
思路一:列舉所有 n^n
2 條邊,看是否滿足條件,滿足條件就更新 d
d 值。最直觀清晰,然而總的複雜度飆公升至 o(n^)o(
n4
)。思路二:對於 t't
′ 的每個點 v
v,定義鬆弛變數 slack(v) = \min\+l_ -w_\ \vert\ x\in s\}sl
ack(
v)=min
,這個鬆弛變數在匹配的過程中就可以更新,修改頂標的過程中 d = \min\d=
min。總複雜度 o(n^)o(
n3
),但不是嚴格的(想一想為什麼)?但實際已經夠用。
km 演算法僅僅只適用於找二分圖最佳完美匹配,如果無完美匹配,那麼演算法很可能陷入死迴圈(如果不存在的邊為 -inf 的話就不會,但正確性就無法保證了),對於這種情況要小心處理。
最後回顧一下總的流程,理一下思路:
初始化可行頂標。
用增廣路定理尋對每個點找匹配。
若點未找到匹配則修改可行頂標的值。
重複2、3步直到所有點均有匹配為止,即找到相等子圖的完美匹配為止。
constintmaxn
=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...