稳定匹配

问题背景:

  n个男生和m个女生进行匹配约会,当然一个男生至多和一个女生约会,一个女生也至多和一个男生约会,并且每个男生心中都有一个对女生的排名表,即表示了这个男生更愿意与哪个女生约会,不同男生的排名表不一定相同,每个女生也都有一个对男生的排名表。现在要求你求一个匹配,这个匹配不含 不稳定因素。

  不稳定因素:一个男生A,一个女生B,A与A‘匹配,B与B’匹配,但A更愿意与B匹配,B也更愿意与A匹配,具有这种性质的(A,B)就被称为不稳定因素。

数学模型:

  两个点集:M,W,M={m1,m2,m3……,mn},W={w1,w2,w3……,wm},M和W的交集为空集,记M*W为M与的笛卡尔积,也就是所有(m,w)形成的二元有序对所构成的集合。匹配S为M*W的子集,且满足每个M的元素和每个W的元素至多出现在S的一个有序对中。

  每个m对所有的w都有一个排名,每个w也对所有的m有一个排名。

  稳定匹配是不包含不稳定因素的匹配。

  不稳定因素:是一个有序对(m,w‘),且(m,w),(m‘,w‘)属于匹配S,但m对w‘的排队(m所认为的w‘的排名)高于m对w的排名,且w对m的排名高于m对w‘的排名,这样(m,w‘)就是一个不稳定因素。

稳定匹配集求解算法:Gale-Shapley算法

  初始,所有人都是自由的,称所有人的状态为自由。一个男生m向他的排名表上排名最高的女生w发起邀请,待所有男生都发送完邀请后,女生开始筛选邀请,即挑选她认为的排名最高的男生,二人的状变为约会。

  然后那些仍处于自由状态的男生,按照他的排名表 顺序 邀请下一个人(也就是说,如果一个男生上一次邀请了排名为i的女生,这次他将邀请排名为i+1的女生),不管他所邀请的人是否处于约会状态。待所有自由状态的男生发送完邀请后,女生再次筛选邀请。重复此过程,直至所有男生都不再发送邀请,这时所得的匹配即为稳定匹配。

算法的有穷性:

  因为一个男生不会邀请同一个女生两次,邀请次数最多为N*M时算法一定结束。

  另一种思路:让人数少的集合表示男生,人数多的集合表示女生,即N<=M;假设存在一个男生邀请了M次后仍然没有匹配结果,那么此时M个女生都已经匹配(否则这个男生会被没有匹配结果的女生所接受),又每个女生的匹配对象不相同,男生中至少有一个人没有匹配对象,所以M<N,与假设相悖,所以假设错误,所有的男生都已经匹配。

正确性证明:反证法

  假定结束时仍存在不稳定因素(m,w‘),此时m与w匹配,m‘与w‘匹配。分两种情况考虑:

    第一:m在邀请w之前邀请过w‘,但w‘的最终匹配对象变成了m‘,这就说明了w‘认为m‘更加优秀,与我们的假设相悖。

    第二:m没有邀请过w‘,也就直接说明了m认为w‘更加优秀,与我们的假设相悖。

   所以,假设错误,不存在不稳定因素。

结果的唯一性:

  在选定了发起邀请的集合后,算法执行的结果是一定的。

定义匹配状态:执行完某轮邀请筛选后男女生的匹配状况。

证明

  状态转移的唯一性。开始所有人都处于自由状态,匹配状态唯一。进行第一轮,每个男生所邀请的对象都是确定的(他们排名表上的第一名),所以每个女生所接受到的邀请都是一定的,那么她们所接受的邀请也是一定的(她们排名表上靠前的那个)。所以进行完第一轮后匹配状态是一定的,然后第二轮中发送邀请的男生确定(仍处于自由状态的男生),他们邀请的对象确定(排名表上的下一名),因而第二轮结束后匹配状态也一定。重复下去,结束时匹配结果就是确定的。因而该算法执行结果唯一(前提:选定了发出邀请的一方)。

G-S性质:发起邀请的一方在算法执行过程中其匹配对象越变越差,接受邀请的一方在匹配过程中其匹配对象越变越好。

注意:稳定匹配存在多种,G-S算法求出的只是其中一种。但G-S算法所求出的匹配对发出邀请方最为有利,对邀请接受方最为不利。

定义:

  有效伴侣:若存在一个稳定匹配使得m是w的匹配对象,则称m是w的有效伴侣。

  最佳有效伴侣:在m的所有有效伴侣中m最满意的伴侣w为最佳有效伴侣,记作best(m)=w;

证明:G-S算法所求出的匹配中,邀请发出方中每个人都与其最佳有效伴侣相匹配。

  假设G-S算法执行结束后存在男生没有和最佳有效伴侣组合,这样的男生叫做倒霉男,倒霉男都被自己的最佳有效伴侣拒绝过,取其中第一个被最佳有效伴侣拒绝的人,记为m,其最佳有效伴侣为w,记算法结束后w和m‘组合。又w是m的最佳有效伴侣,所以存在一个稳定匹配S’,m和w组合,假设在这个匹配中m‘和w‘组合,所以w‘也是m‘的有效伴侣。

  第一种情况:对m‘来说w‘优于w,那么在S中,在m被w拒绝前,m‘被w‘拒绝,这也就说明了m‘早于m被有效伴侣拒绝,那么m‘一定更早的被最佳有效伴侣拒绝了,这与m是第一个被最佳有效伴侣拒绝的相矛盾。

  第二种情况:对m‘来说w由于w‘,那么在S‘中,m‘,w形成不稳定因素,这与S’是一个稳定匹配矛盾。

  综合这这两种情况,G-S算法中不存在倒霉男。

  

扩展:该算法在一对多的时候也适用,即X部可以匹配多个或者Y部可以匹配多个,但当X部和Y部同时可以匹配多个点的时候不适用。

假设Y部点可以匹配多个点。则以X部点作为发出邀请方,Y部点在接收邀请时,检测是否能优化自身目前的选择,(优化:将一个好感度比当前邀请低的舍弃,使得整体的好感度上升)。

资料:http://www.icourses.cn/web/sword/portal/shareDetails?cId=3271#/course/chapter 第四章 时间:39:30 PS:这个老师讲的更加通俗易懂

比较详细的PPT:https://www.docin.com/p-2042973211.html 大力推荐!!!!!!

原文地址:https://www.cnblogs.com/dialectics/p/12373814.html

时间: 2024-10-29 09:54:02

稳定匹配的相关文章

Demystify 稳定匹配理论和圈圈图

你知道这个图的意义吗? 实验经济学里有个人物Al Roth,2012年获得诺贝尔经济奖,获奖领域是稳定匹配理论及其应用. 稳定匹配啥意思?考虑一个虚拟的雇佣市场问题,N个企业和N个工人的一对一匹配问题,假设每个企业对每个工人都有一个打分,分数越高代表某企业在可能的情况下会优先选择那个工人.同样,每个工人也给每个企业打分.现在如何给这些工人和企业做一个一对一的匹配?这是一个双向选择问题,一个公平的匹配应该是稳定匹配,具有如下特性:稳定匹配中的双方,尽管对方未必是最中意的那个,但他(它)又无法和任何

Stable Matching 稳定匹配 婚姻算法 shapley 算法

作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html 稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳定的匹配,即不会出现一个匹配中的人与另一个匹配中的异性对对方的排名均高于目前配对的人的排名. shapley算法: 每次取出一个单身男生,让他向没有拒绝过她的女生中其排名最高人表白,若该女生没有对象则配对成功,否则与其当前的对象排名进行对比,如果当前对象排名较高,则拒绝表白男生,否则dump掉目前对

稳定匹配 - Stable Matching

这篇文章将会对稳定匹配算法进行介绍及Python代码的实现,第一部分会针对稳定匹配的Gale-Shapley算法进行解析,第二部分就是用Python对该算法进行实现. 一.稳定匹配算法原理 1.1 介绍 稳定匹配(Stable Matching)问题就是假设现在有N个男生和N个女生跳舞选择伴侣,然后最开始的时候男.女生按照下面情况对彼此进行排序选择舞伴(见图1): 每个男生都对女生按照最喜欢到最不喜欢进行排序: 同样的,女生也是按照最喜欢的到最不喜欢对男生进行排序. 算法目标:每个男都找到唯一一

简单的稳定婚姻匹配

一.相关的定义 1.有一个男士集合和一个女士集合.每个男士都有一个优先级列表,把女士按潜在结婚对象进行优先级排序. 同样的,女士也有一个对潜在结婚对象的优先级列表. 婚姻匹配: 一个婚姻匹配M是一个包含n个(m,w)对的集合,每一对的成员都按照一对一的模式从两个不相交的n元素集合Y和X中选出.也就是说,Y中的每个男士m都只和X中的一位女士w配对,反正亦然.相当于一个二分图中,边来连接可能结婚的对象,两边的顶点代表X和Y,婚姻匹配也是图中的一个完美匹配. 婚姻的稳定:如果在匹配M中,,男士m和女士

HDU 1522 Marriage is Stable 【稳定婚姻匹配】(模板题)

<题目链接> 题目大意: 给你N个男生和N个女生,并且给出所有男生和女生对其它所有异性的喜欢程度,喜欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配. 解题分析: 稳定婚姻问题的模板题,需要用到Gale_Shapley算法,GS算法讲解  >>> 这个算法还是很直观的. 1 #include <iostream> 2 #include <cstring> 3 #include <stack> 4 #include <stri

UVA 1175 - Ladies&#39; Choice(稳定婚姻问题)

UVA 1175 - Ladies' Choice 题目链接 题意:给定n个男人,n个女人,每个人心中对异性都有一个排序,从左往右是最喜欢到最不喜欢,然后现在要求一个稳定匹配,使得n对男女中,不存在男人对其他女人好感度大于配偶且女人对其他男人好感度大于配偶 思路:稳定婚姻问题,算法过程如下: 男人不断求婚,从最喜欢到最不喜欢,女人每次在求婚人中,选择一个最喜欢的配对,然后抛弃现在的配对,这个过程可以用一个队列存放求婚男人,这样直到队列为空,也就匹配完毕了 代码: #include <cstdio

浅谈稳定完备婚姻的算法

首先说明:本文不是讨论婚姻问题的,而是一篇以日常生活的婚姻问题为例子说明一个有趣的算法:Gale-Shapley算法(延迟认可算法),如果你为此感到失望的话,我将表示我的歉意,但是你如果有兴趣的话,还是建议你看一下,尤其是对于目前还没有个GF或BF的朋友以及就要结婚的朋友,在讲解算法的实现过程中,你会感到大有裨益. 话说在1962年,两个数学家David Gale 和Lloyd Shapely提出了下面的问题:给定若干个男生和同样多的女生,他们每个人都对所有的异性有一个心理的偏好次序.是否存在一

UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完备匹配,则称这是一个稳定匹配. 稳定匹配一定存在,且存在一个\(O(n^2)\)的算法: 任选一个未匹配的男生x,按x的喜爱程度从大到小枚举每个女生,若当前女生没有配偶或喜欢x胜过喜欢当前配偶,则与x匹配.直到所有男生都匹配. 这一题我们用行表示男生,n个数表示女生.喜爱程度为:行更喜欢靠前的数,数

G_S男女匹配算法(算法的第一个程序2016.09.19)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int Smallest_numberFree = 0;//记录单身的号码最低的男性 5 int i = Smallest_numberFree, n, k = -1;//n代表有多少对男女 6 7 cout << "请输出有多少对男女:"; 8 cin >> n; 9 int **Man = new int*[n], **Woma