稳定匹配
在1962年Gale和Shapley发表了一篇论文: College Admissions and the Stability of Marriage,首次提出了婚姻匹配问题(维基百科), 使婚姻和大学招生成为稳定匹配的典型例子.
什么是稳定匹配
以婚姻匹配为例, 假设在当前匹配结果中存在两对(m1, w1)和(m2, w2), 在喜好排名中, m1更喜欢w2, m2也更喜欢w1, 这时我们可以称当前匹配是不稳定的.
如何实现稳定匹配呢 ?
要找到一种稳定匹配, 可使用Gale-Shapley
提出的算法( 用反证法证明其有效性 ), 但有个前提是让男生主动求婚, 主要过程如下:
function stableMatching { |
算法实现
Person.java
, 用来表示male或female.
|
GaleShapley.java
, 主要是算法过程:
public class GaleShapley { |
执行main()中的用例, 得出结果:
Mr.A <--> Miss.B |
有多少稳定匹配结果
上面讨论的前提是男士主动求婚, 而且是先有一个队伍顺序, 如果改变一下这些条件, Gale-Shapley
算法可能得到的是另外一种稳定匹配结果.
那么, 如何获得所有的稳定匹配结果呢 ?
使用穷举法
我们需要对每个male进行穷举, 覆盖所有的male求婚顺序, 这样的问题用递归很方便.
|
测试用例 :
|
最终可以找出两个匹配结果, 如下:
|
二分图和匈牙利算法
其实这个问题还可以用二部图和匈牙利算法来处理, 详细内容请看下一篇博客.
参考
College Admissions and the Stability of Marriage
https://en.wikipedia.org/wiki/Stable_marriage_problem