稳定匹配-stablematching(代码片段)

jielongai jielongai     2022-12-21     678

关键词:

这篇文章将会对稳定匹配算法进行介绍及Python代码的实现,第一部分会针对稳定匹配的Gale-Shapley算法进行解析,第二部分就是用Python对该算法进行实现。

一、稳定匹配算法原理

1.1 介绍

稳定匹配(Stable Matching)问题就是假设现在有N个男生和N个女生跳舞选择伴侣,然后最开始的时候男、女生按照下面情况对彼此进行排序选择舞伴(见图1):

  • 每个男生都对女生按照最喜欢到最不喜欢进行排序;
  • 同样的,女生也是按照最喜欢的到最不喜欢对男生进行排序。

技术分享图片

算法目标:每个男都找到唯一一个女舞伴,反之亦如此,从而达到了所谓的稳定匹配。

演示步骤:

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

1.2 伪代码(Gale-Shapley Algorithm)

 1 # 首先初始化所有男生的状态为自由
 2 initialize each person to be free
 3 
 4 # 当男生没有未曾被匹配过并且也没有向所有其他女生寻求舞伴过时不断循环
 5 while some man m is not yet matched:
 6     # 每个男生按照对女生的喜欢程度选择舞伴
 7     w := m‘s most favroite woman to whom he has not yet proposed
 8     # 如果女生未被匹配到,则与男生进行配对
 9     if w is also not yet matched:
10         w and m are paired
11     # 如果女生与已匹配的男生相比更喜欢当前的这个男生,则拆散重新匹配
12     elif w favors m to her current matched m‘:
13         w and m are paired and m‘ is dis-matched
14     # 否则该女生拒绝成为男生的舞伴
15     else:
16         w rejects m
17 # 返回所有匹配成功的舞伴对
18 return matched pairs

二、Python代码实现

 

# -*- encoding: UTF-8 -*-
import copy
 
 
# 男的所期望的对象
manPrefers = dict((m, prefs.split(‘, ‘)) for [m, prefs] in (line.rstrip().split(‘: ‘)
                                for line in open(‘men.txt‘)))
# 女的所期望的对象
womenPrefers = dict((m, prefs.split(‘, ‘)) for [m, prefs] in (line.rstrip().split(‘: ‘)
                                for line in open(‘women.txt‘)))
 
men = sorted(manPrefers.keys())
women = sorted(womenPrefers.keys())

# 定义检测函数检测匹配的伴侣是否稳定
def check(engaged):
    inverseengaged = dict((v,k) for k,v in engaged.items())
    for w, m in engaged.items():
        shelikes = womenPrefers[w]
        shelikesbetter = shelikes[:shelikes.index(m)]
        helikes = manPrefers[m]
        helikesbetter = helikes[:helikes.index(w)]
        for man in shelikesbetter:
            womenOftheMan = inverseengaged[man]
            manLoves = manPrefers[man]
            if manLoves.index(womenOftheMan) > manLoves.index(w):
                print("%s 和 %s 更喜欢彼此相比起他们当前的伴侣: %s 和 %s" % (w, man, m, womenOftheMan))
                return False
        for woman in helikesbetter:
            manOfTheWomen = engaged[woman]
            womanLoves = womenPrefers[woman]
            if womanLoves.index(manOfTheWomen) > womanLoves.index(m):
                print("%s 和 %s 更喜欢彼此相比起他们当前的伙伴:%s 和 %s" % (m, woman, w, manOfTheWomen))
                return False
    return True
 
def stableMatching():
    free_men = men[:]
    engaged  = 
    manPref_temp = copy.deepcopy(manPrefers)
    womenPref_temp = copy.deepcopy(womenPrefers)
    while free_men:
        man = free_men.pop(0)
        manList = manPref_temp[man]
        woman = manList.pop(0)
        fiance = engaged.get(woman)
        if not fiance:
            engaged[woman] = man
            print("  %s 和 %s 成为伴侣" % (man, woman))
        else:
            womenList = womenPref_temp[woman]
            if womenList.index(fiance) > womenList.index(man):
                engaged[woman] = man
                print("  %s 舍弃 %s 而和 %s 成为伴侣" % (woman, fiance, man))
                if manPref_temp[fiance]:
                    free_men.append(fiance)
            else:
                if manList:
                    free_men.append(man)
    return engaged
 
if __name__ == ‘__main__‘:
    print(‘
伴侣匹配:‘)
    engaged = stableMatching()
 
    print(‘
伴侣匹配:‘)
    print(‘  ‘ + ‘,
  ‘.join(‘%s 和 %s 成为伴侣‘ % couple for couple in sorted(engaged.items())))
    print()
    print(‘伴侣稳定性检测通过‘ if check(engaged) else ‘伴侣稳定性检测不通过‘)
 
    print(‘

因交换而产生伴侣搭配错误‘)
    engaged[women[0]], engaged[women[1]] = engaged[women[1]], engaged[women[0]]
    for woman in women[:2]:
        print(‘  %s 现在和 %s 成为伴侣‘ % (woman, engaged[woman]))
    print()
    print(‘伴侣稳定性检测通过‘ if check(engaged) else ‘伴侣稳定性检测不通过‘)

  

匹配算法告诉你为什么要找女(男)朋友一定要主动?(代码片段)

...越好代码实现对于恋爱的启示纯文字描述稳定匹配(stablematching)。定义有这样一个问题,大概意思说是给一群男的和一群女的配对&# 查看详情

稳定婚姻匹配问题(代码片段)

  假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚。如果你已经知道这些女孩在每个男人心目中的排名,以及男孩们在每个女孩心中的排名(1),你应该怎样为他们牵线配对呢?  ... 查看详情

uoj.41.[清华集训2014]矩阵变换(稳定婚姻)(代码片段)

题目链接稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度。给每个人选择配偶。若不存在x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶的完备匹配,则称这是一个稳定... 查看详情

hdu1522marriageisstable稳定婚姻匹配(模板题)(代码片段)

...欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配。解题分析:稳定婚姻问题的模板题,需要用到Gale_Shapley算法,GS算法讲解 >>>这个算法还是很直观的。1#include<iostream>2#include<cstring>3#include<st... 查看详情

稳定婚姻(tarjan)(代码片段)

...个强连通分量中有多于1个点,那么就说明这个婚姻并不稳定(夫妻之间连单向边,所以如果婚姻稳定的话夫 查看详情

marriageisstablehdu1522稳定婚姻问题(代码片段)

...理的匹配要打印名字的话必须有一个名字数组英文名用map稳定婚姻问题:每次循环遍历所有的男的每个男的对目前未被拒绝的并且优先级最高的进行预匹配 如果1女的没有伴侣2女的对该男的好感度比女的伴侣的好感度更高&nbs... 查看详情

roboticslab3——图像特征匹配跟踪与相机运动估计(代码片段)

...、物体材质等的影响严重,在不同图像间的变化大,不够稳定。而图像的特征点一定是具有代表性的点,其在相邻的图像间保持稳定,一般选择图像的角点作为特征点,具有稳定性、易辨认的特征。特征点组成:特征点包括关键... 查看详情

css突出效果(稳定)(代码片段)

查看详情

textyarilabs-车间的稳定性(代码片段)

查看详情

shshell:使用密钥创建用户(不稳定)(代码片段)

查看详情

shnode和npm最新或稳定(代码片段)

查看详情

demystify稳定匹配理论和圈圈图

...里有个人物AlRoth,2012年获得诺贝尔经济奖,获奖领域是稳定匹配理论及其应用。稳定匹配啥意思?考虑一个虚拟的雇佣市场问题,N个企业和N个工人的一对一匹配问题,假设每个企业对每个工人都有一个打分,分数越高代表某企... 查看详情

location匹配(代码片段)

1.按照匹配结果划分1.首先是精准匹配2.是正则匹配3.一般匹配2.按照过程1.精准匹配直接返回结果2.其次,一般匹配记忆命中长度最长3.进行正则匹配,匹配成功,返回匹配结果匹配失败,返回一般匹配命中结果  查看详情

c_cpp计数排序-稳定(代码片段)

查看详情

rabbitmq安装包部署erlang环境安装(代码片段)

下载安装包下载并安装erlang依赖,下载稳定版的,最新的可能会有兼容问题,erlang的版本要注意和rabbitmq相匹配下载erlang包https://www.erlang.org/patches/otp-23.3.4.9查看rabbitmq和erlang的版本匹配https://www.rabbitmq.com/which-erlang.html我当... 查看详情

hdu1914稳定婚姻匹配

TheStableMarriageProblemTimeLimit:5000/1000MS(Java/Others)    MemoryLimit:65535/32768K(Java/Others)TotalSubmission(s):758    AcceptedSubmission(s):389ProblemDes 查看详情

c_cpp计数排序-不稳定(代码片段)

查看详情

slam14讲第七章特征点法(代码片段)

...估计值【一】特征提取与匹配:特征点法——运行稳定,对光照、动态物体不敏感主要问题:根据图像来估计相机运动特征点-路标-有代表性的点-图像信息的一种表达形式-在相机运动之后保持稳定-角点|边缘|区块仅灰度值... 查看详情