0
点赞
收藏
分享

微信扫一扫

算法: 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) 为一对
  • 程序结束
举报

相关推荐

0 条评论