首页 > 编程语言 >关于GS匹配算法(Gale_shaply)及想法

关于GS匹配算法(Gale_shaply)及想法

时间:2024-09-26 17:51:42浏览次数:3  
标签:GS shaply reviewers self 算法 Gale proposers 匹配 preferences

1.GS匹配算法

首先第一个问题。简单介绍一下GS匹配算法,Gale-Shapley匹配算法是基于“稳定婚姻”问题提出的。假设有n个男性和m个女性,每个男性都有自己的偏好列表,同样,每个女性也有自己的偏好列表。算法的目标是为这n对男女实现稳定匹配。

2.什么是稳定匹配

第二个问题就是什么是稳定匹配?

基于前面提到的n名男孩与m名女孩,每一名男孩对每一名女孩都有一个喜欢程度的评级,那么怎么处理这些男女匹配关系,使得经匹配后对任意a,b满足任一条件:

相对于b,a一定更喜欢当前跟他配对的女孩

相对于a,b一定更喜欢当前跟她配对的男孩

这时就是稳定匹配

那会不会出现不稳定匹配的情况呢?假设男女数量相等,n位男孩和n位女孩间,最大示爱次数是 n2−2n+2 如果某个女孩被示爱过,那么她就有了一个备选对象,且这个对象只会更换不会消失。这意味着,如果 n 位女孩都被示爱过,那么 n 位女孩都有一个备选对象,此时算法就结束了。所以,在算法的进行过程中,除了最后一步,都只有最多 n−1 位女孩被示爱过。

而这 n−1 位女孩最多拒绝过 (n−1)2 个人,因为n个男孩中一定有一个人是不会被拒绝的。算法每一步都至少要拒绝一个人,到目前为止,算法最多运行了 (n−1)2 步。还有最后一次没有拒绝而使得算法终止的示爱,一共是 (n−1)2+1=n2−2n+2 步。

3.算法具体实现

具体算法如何实现呢?

算法步骤

(1)初始化:所有人的状态均为单身。

(2)提议:每个单身男性向其偏好列表中的第一个女性表达爱意。

(3)响应:女性根据自身偏好,从示爱者中选择最满意的一个,若已有示爱者,则比较两者,保留更优的一个。

(4)更新状态:被拒绝的男性更新其偏好列表,继续向下一个女性示爱。

(5)重复步骤4,直到所有人均实现匹配。

4.python代码

下面是我写的代码,已经过测试:

class Person:
    def __init__(self, name):
        self.name = name
        self.preferences = []
        self.engaged_to = None 

    def prefer(self, person1, person2):
        # 确保person1和person2都是Person对象
        if not isinstance(person1, Person) or not isinstance(person2, Person):
            raise ValueError("Both arguments must be instances of the Person class.")
        return self.preferences.index(person1) < self.preferences.index(person2)

class Gale_shapley:
    def __init__(self, proposers, reviewers):
        self.proposers = proposers
        self.reviewers = reviewers
        self.matches = {reviewer: None for reviewer in reviewers}  # initialize

    def run(self):
        free_proposers = self.proposers[:]  
        
        while free_proposers:
            proposer = free_proposers[0]  
            for reviewer in proposer.preferences:
                if self.matches[reviewer] is None:
                    #若未婚,则'口头承诺'
                    self.matches[reviewer] = proposer
                    free_proposers.remove(proposer)
                    break
                else:
                    #若已婚,那就换呗,你总不能阻止我奔向更好的吧
                    current_partner = self.matches[reviewer]
                    if reviewer.prefer(proposer, current_partner):
                        self.matches[reviewer] = proposer  
                        free_proposers.remove(proposer)
                        free_proposers.append(current_partner)  
                        break
                       
        return self.matches

# 爱与被爱
proposers = [Person(f'male {i}') for i in range(4)]
reviewers = [Person(f'female {i}') for i in range(4)]

# 喜好排名
proposers[0].preferences = [reviewers[1], reviewers[2], reviewers[3], reviewers[0]]
proposers[1].preferences = [reviewers[2], reviewers[0], reviewers[1], reviewers[3]]
proposers[2].preferences = [reviewers[0], reviewers[3], reviewers[2], reviewers[1]]
proposers[3].preferences = [reviewers[3], reviewers[2], reviewers[0], reviewers[1]]

reviewers[0].preferences = [proposers[0], proposers[1], proposers[3], proposers[2]]
reviewers[1].preferences = [proposers[2], proposers[3], proposers[0], proposers[1]]
reviewers[2].preferences = [proposers[1], proposers[0], proposers[2], proposers[3]]
reviewers[3].preferences = [proposers[3], proposers[2], proposers[1], proposers[0]]

execute = Gale_shapley(proposers, reviewers)
matches = execute.run()

# 输出匹配结果
for reviewer, proposer in matches.items():
    print(f'{reviewer.name} is matched with {proposer.name}')

这是一个有趣的算法,因为我能从中得出一些结论和道理,哈哈

1.无论执行多少次,结果都是一样的,假设结果会出现变化,这就与稳定匹配相悖,两人间会出现背叛,呃

2.恋情中先主动的人有优势。该算法中假设都是男孩主动示爱,男孩获得了自己的最佳的伴侣,但是女孩都获得了自己的最差的伴侣,因为男孩可以根据自己的内心排序去选择,而女孩只能被动选择,而你,我的朋友,你根本不敢出击

3.所有人都能相互匹配,因为算法中的前提是人数有限,男女数量相等,双方正直专一

4.问题强调稳定匹配,不应强调爱情。什么时候爱情已经是充满选择与权衡?好吧,似乎就是这样,我很难相信人们描绘出的美好,但我仍为它们留有一丝幻想。

关于Gale-Shapley匹配算法有哪些应用呢?

  1. 高等教育领域:用于学生与导师的匹配。高考呗
  2. 医疗资源分配:医院与医生的匹配。西西
  3. 企事业单位招聘:企业与求职者的匹配。
  4. 网络广告投放:广告主与广告位的匹配。

结语

Gale-Shapley匹配算法作为一种经典的资源分配算法,具有公平、稳定的特点,在现实生活中具有广泛的应用价值。通过对算法原理的深入了解,可以更好地将其应用于实际场景,解决各种资源分配问题,为生活带来便利。

标签:GS,shaply,reviewers,self,算法,Gale,proposers,匹配,preferences
From: https://blog.csdn.net/2302_76878161/article/details/142494734

相关文章

  • Buildings(AtCoder Beginner Contest 372)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("E:/ProgramFiles/CLion2023.2.2/my/exe/in.txt&quo......
  • 在Centos8安装ThingsBoard
    硬件要求取决于所选数据库和连接到系统的设备数量。要在单台机器上运行ThingsBoard和PostgreSQL,您至少需要4Gb的RAM。本文以Centos8系统为例,演示安装部署ThingsBoard全过程。安装必要的工具#Installwgetsudodnfinstall-ynanowget#AddlatestEPELreleasefor......
  • prometheus学习笔记之服务发现kubernetes_sd_configs
    一、prometheus的服务发现机制prometheus默认是采用pull方式拉取监控数据的,也就是定时去目标主机上抓取metrics数据,每一个被抓取的目标需要暴露一个HTTP接口,prometheus通过这个暴露的接口就可以获取到相应的指标数据,这种方式需要由目标服务决定采集的目标有哪些,通过配......
  • ELK中日志数据采集器Filebeat的安装和使用、Filebeat结合Logstash进行日志处理入Elast
    一、ELK中日志数据采集器Filebeat的安装和使用    Beats是数据采集的得力工具,Beats能够将数据转发至Logstash进行转换和解析。Filebeat是Beats中的一种,Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tailfile),并将它们转发给Elasticsearch或Logstats......
  • 基于STM32单片机的厨房天然气蓝牙手机APP检测GSM短信报警系统
    基于STM32单片机的厨房天然气蓝牙手机APP检测GSM短信报警系统0、毕业设计选题原则说明(重点)1、项目简介1.1系统功能1.2演示视频2、部分电路设计2.1STM32单片机核心板电路设计2.2HC05蓝牙无线通信电路设计2.3sim900AGSM短信报警电路2.4、MQ-4天然气检测电路设计2.5、HC-SR505......
  • ShardingSphere-JDBC垂直分片
    文章目录1、订单库db_order1.2、创建数据库2、用户库db_user2.1、创建atguigu-mysql-user容器2.2、登录atguigu-mysql-user容器2.3、设置密码2.4、创建数据库3、创建实体类TOrder4、创建实体类TUser5、创建TOrderMapper6、创建TUserMapper7、application.yml......
  • cnblogs的GitHub同步markdown文件的blog如何识别文章的唯一性(身份ID如何判定)
    本篇blog是写在GitHub的对应的仓库中的。cnblogs会给终身用户提供一个把GitHub仓库中的markdown文件同步到cnblogs上的一个服务,本文就是使用这个服务同步到个人blog地址的:https://cnblogs.com/xyz问题1:何时触发blogs的同步?当仓库中的markdown文件有更新时,cnblogs会自动同......
  • 如何使用位置参数从 ROS 的 Geometry_msgs 初始化 Pose?
    在文档中,它说我可以使用“完整的字段值集,按.msg顺序”进行初始化。这是什么意思?我如何用Python和C++实现它?谢谢!使用位置参数初始化ROSGeometry_msgs的Pose是对的,ROSGeometry_msgs的Pose消息类型可以通过“完整的字段值集,按.msg顺序”进行初始......
  • windows 整合elk(elasticsearch、kibana、logstash)及 Java maven项目配置logback集成el
    文章目录windows版elk部署文档1、文件准备2、系统配置启动2.1、elasticsarch2.1.1、生成证书2.1.2、生成秘钥2.1.3、移动凭证2.1.4、改配置2.1.5、启动2.1.6、访问运行2.1.7、生成kibana账号2.2、kibana2.2.1改配置2.2.2启动2.2.3访问测试......
  • `std::string_view`(c++17) 和 `std::stringstream` 使用区别·
    std::string_view和std::stringstream都是C++中处理字符串的工具,但它们的设计目标和使用场景非常不同。我们可以通过几方面进行对比。1.设计目的和核心功能std::string_view:设计用于只读访问字符串或字符序列。是一个轻量级的字符串视图,不会持有字符串的数据,仅仅是对......