目录
- 前言
- 稳定匹配
- 不稳定对
- Propose-And-Reject Algorithm
- 最后
前言
文章内容取自http://www.cs.cmu.edu/~arielpro/15896s16/slides/896s16-16.pdf并有所修改, 如有侵权等问题, 请提示删除(手动感谢). 这次主要是开个系列分享分享有趣的算法.
稳定匹配(The Stable Matching Problem)
不稳定对(Unstable pair)
如果:
- 男生x相比现有配对更喜欢女生y
- 女生y相比现有配对更喜欢男生x
这就是一个不稳定对, 很好理解吧.
那么稳定匹配就是不存在不稳定对的匹配.
举个小栗子, 现在给出联谊上3男3女的喜欢表, 提什么男男/女女的, 一对多的, 麻烦关闭页面(手动无奈).
男生\喜欢 | 1st | 2nd | 3rd |
---|---|---|---|
X | A | B | C |
Y | B | A | C |
Z | A | B | C |
女生\喜欢 | 1st | 2nd | 3rd |
---|---|---|---|
A | Y | X | Z |
B | X | Y | Z |
C | X | Y | Z |
这里我们尝试给出一个解, 看是不是稳定匹配. X-C, Y-B, Z-A. 很明显, X, A, B是可能出事情的. 如果X-A, 就出事了, 因为A比起现在匹配的Z更喜欢X; 同理, X-B也出事了, B可是最喜欢X的. 那么GG, 红线崩了.
男生\喜欢 | 1st | 2nd | 3rd |
---|---|---|---|
X | A | B | C |
Y | B | A | C |
Z | A | B | C |
女生\喜欢 | 1st | 2nd | 3rd |
---|---|---|---|
A | Y | X | Z |
B | X | Y | Z |
C | X | Y | Z |
X-A, Y-B, Z-C如何呢? 发现是稳定的, 因为A, B都最不喜欢Z.
男生\喜欢 | 1st | 2nd | 3rd |
---|---|---|---|
X | A | B | C |
Y | B | A | C |
Z | A | B | C |
女生\喜欢 | 1st | 2nd | 3rd |
---|---|---|---|
A | Y | X | Z |
B | X | Y | Z |
C | X | Y | Z |
但是不是每次都这么好运能找到稳定匹配的, 所以需要算法帮助解决问题.
Propose-And-Reject Algorithm
Propose-And-Reject Algorithm(Gale-Shapley 1962)可以解决问题. 贴一下伪代码, 这个算法原本是解决求婚问题的, 但是当成联谊看比较合适, 哪有人日常换未婚夫的(手动滑稽).
Initialize each person to be free.
while (some man is free and hasn't proposed to every woman) {
Choose such a man m
w = 1st woman on m's list to whom m has not yet proposed
if (w is free)
assign m and w to be engaged
else if (w prefers m to her fiancé m')
assign m and w to be engaged, and m' to be free
else
w rejects m
}
那么上面那一题就很快得出答案了, 就是我给的稳定匹配.
但是需要证明一下, 当然我引用的文献证明, 我的证明能力就很佛系了.
- 完整性证明
全部男女都找到了另一半
- 假设Z凉凉, 没有匹配.
- 那么由于一对一的限制, 某个妹子A也没人爱. 换句话说, 没人向A表白.
- 但是Z必须要向全部妹子表白才结束循环.
- 所以反证成功.
- 稳定性证明
没有不稳定对
- 假设A-Z不稳定, 要搞事.
- 情况1: Z没有向A表白
- 说明Z更喜欢现有伴侣而不是A.
- A-Z稳定.
- 情况2: Z有向A表白
- A拒绝了Z(立刻或者之后甩了).
- 那说明A更喜欢现有伴侣.
- A-Z稳定.
- 反证成功.
最后
想要代码实现你要加上数据结构, 复杂度是n的平方, 毕竟程序 = 数据结构 + 算法. 然后的话, 所以想要获得幸福, 要主动出击以及保持好形象(手动捂脸). 还有还有, 我不是标题党哈, 你试试跑个10男10女的匹配, 这个算法绝对渣出天际. 喜欢记得点赞, 有意见或者建议评论区见~