演算法: Perfect Matching
問題描述
這個問題也叫做 Perfect Marriage 問題,是用來相親時候怎麼配對男女都好,比如非誠勿擾裡的每個男嘉賓會對女嘉賓排一個自己喜歡的順序,當然女嘉賓也會對男嘉賓排一個序,作為節點組當然會實現 “兩情相悅” 是對好啦。可是總會有不如意的情況。
比如現在有男女雙方的喜好排序表,有兩個男: m1, m2, 兩個女: w1, w2
男人 | 最喜歡的女人 | 要將就的女人 |
---|---|---|
m1 | w1 | w2 |
m2 | w1 | w2 |
女人 | 最喜歡的男人 | 要將就的男人 |
---|---|---|
w1 | m1 | m2 |
w2 | m1 | m2 |
用二分圖可以畫成這樣

如果現在我們匹配他們為 m1 - w2, m2 - w1,肯定是不好的,也稱為 Unstable Matching,因為 m1 - w1 才是情投意合的 (雙向的)。所以 m1-w1, m2-w2 才更好一點,這種稱為 Stable Matching。
Shapley Algorithm
使用這個演算法可以很容易幫我們找到 Stable Matching。演算法如下
先初始化男人和女人都是可以沒有匹配好的 while (還有男人 m 沒有匹配) { w = 當前男人 m 最喜歡的女人 if(w 還沒有匹配 (m, w) 先匹配成一對 else if 存在 (m', w) if w 更喜歡 m,而不太喜歡m' (m, w) 會組成一對 m' 重置為 “未匹配” else (m', w) 還是一對組合 }
以上面為例子
- 首先我們先看 m2,發現他更喜歡 w1,所以先搞個組合 (m2, w1)
- 再看 m1,發現他更喜歡 w1。而且現在存在組合 (m2, w1),可是 w1 更喜歡 m1,所以
- 將 (m2, w1) 拆散,組合成 (m1, w1)
- 現在 m2 重置為 “未匹配”
- 因為 m2 是未匹配的,所以再看他下一個更喜歡的是誰,是 w2,所以組合他們 (m2, w2) 為一對
- 程式結束