浅谈稳定完备婚姻的算法

  首先说明:本文不是讨论婚姻问题的,而是一篇以日常生活的婚姻问题为例子说明一个有趣的算法:Gale-Shapley算法(延迟认可算法),如果你为此感到失望的话,我将表示我的歉意,但是你如果有兴趣的话,还是建议你看一下,尤其是对于目前还没有个GF或BF的朋友以及就要结婚的朋友,在讲解算法的实现过程中,你会感到大有裨益。

  话说在1962年,两个数学家David Gale 和Lloyd Shapely提出了下面的问题:给定若干个男生和同样多的女生,他们每个人都对所有的异性有一个心理的偏好次序。是否存在一种男女配对组合构成一种稳定的组合关系?这里稳定组合的意思是说,不存在两个非伴侣的异性对彼此的评价比对各自伴侣的评价还要高。(可以理解,这样的异性太容易红杏出墙了,所以是某种不稳定因素。)进一步的问题是,在已知每个人对异性的偏好顺序的情况下,怎样求出这种稳定组合方式(如果它存在的话)?你可以理解为这是数学家们替月老问的问题:给定一群孤男寡女,寻找一种牵红线的方式,以确保把红杏扼杀在摇篮里。。。。

   1、稳定完备婚姻

  上面这一问题被称为稳定婚姻问题。它有很多种可能的解法。为了让大家相信数学家不是真得如此无聊,我要指出它确确实实是一个地道的组合数学问题,有其特定的数学价值。当然啦,它也有很多别的背景和应用,比如用来在若干个公司和应聘者之间进行招聘中介„„但是数学家们怎么会放过如此八卦的一个名字呢?我们看下面的例题:

  某社团中有n位女士和m位男士。假定每位女士按照其对每位男士作为配偶的偏爱程度排名次,无并列。也就是说,这种排列是纯顺序的,每位女士将这些男士的排列成顺序 1,2,3,„ ,n,类似的,每位男士也对这些女士排列成顺序1,2,3,„,n,我们知道,在这个社团里配对成完备婚姻的方式有n!种。假定某种婚姻匹配中存在女士A和 B 及两位男士a和b,使得

  i) A和a结婚;

  ii) B和b结婚;

  iii) A更偏爱b(名次更优先)而非a;

  iv) B更偏爱a而非b。

  那么,我们认为该完备婚姻是不稳定的。因为在这种假设下,A和b可能会背着别人相伴逃跑,他们都认为,与当前配偶相比每个都更偏爱自己的新伴侣。如果完备婚姻不是不稳定的,我们则称其为稳定的完备婚姻。

   2、稳定完备婚姻的算法

   2.1 建立模型

   用二分图来为这个问题建立数学模型。令G=(X,△,Y)是一个二分图,其中 X={w1,w2,w3...wn}为n位女士的集合,而Y = {m1,m2,m3....mn}为n位男士的集合。将每一个女-顶点(女士在左边)连接到每一个男-顶点(男士 在右边)。所得的二分图在包含双方顶点集之间的所有可能边的意义下是完备的。对应每条边(wi,mj)存在一个数对p,q,其中p表示在wi给男士排序中mj的位置,q表示在给女士排序中mj给女士排序中wi的位置。这些女士和男士的完备婚姻对应二分图G的(n条边的)完美匹配。  在记法上,使用优先秩评定矩阵所提供的模型会更方便。该矩阵为一n行n列的阵列,n行对应每一位女士w1,w2,w3....wn,n列对应每一位男士m1,m2,m3...mn。在第i行和第j列交叉位置处放上代表wi给mj排的名次和mj给wi排的名次的数对p,q。一个完备婚姻对应该矩阵上n个位置的集合,该集合恰好包含每一行的一个位置和每一列的一个位置。  例1 令n=3,并令优先秩评定矩阵为:

           m1  m2  m3

       w1  1,3   2,2   3,1

       w2    3,1   1,3   2,2

       w3    2,2   3,1   1,3

  存在3!=6种可能的完备婚姻。一种是

    w1<->m1,w2<->m2,w3<->m3

  由于每一位女士都得到她的第一选择,这个完备婚姻是稳定的,不过每位男士得到的却都是最末位的选择。另一中稳定的完备婚姻是通过是每位男士得到他的第一选择而得到的。

  2.2延迟认可算法的基本思想  

  问题:对于每一个优先秩评定矩阵,都存在稳定的完备婚姻策略。如何找到一个稳定的完备婚姻?

  通过延迟认可算法(Gale-Shapely算法)

   先对所有女士进行落选标记开始。

   当存在落选女士时,进行以下操作

   1)每一位落选女士在所有尚未拒绝她的男士中选择一位被他排名最优先的男士

   2)每一位男士在所有已经选择他,并且他尚未拒绝的女士中挑选被他排名最优先的女士,对她推迟决定,并于此时拒绝其余女士。

   于是,在算法执行期间,由女士向男士求婚,一些男女订婚,但是,如果收到更好的求婚,男士可以悔婚。

   即算法中,一旦男士订婚,他就一直处在订婚状态,但是她的未婚妻可以改变;而且,对他来说每次改变都是一种改进。然而,女士则在算法执行期间订婚若干次;每一次对她来说都讲导致更不理想的伴侣。

  只要不存在被拒绝女士,那么每一位男士恰与一位女士订婚,由于人数相等,每一位女士也恰与男士订婚。

  现在将每一位男士和他订婚的女士配对就可以得到一种完备婚姻,而且可以证明,这种完备婚姻是稳定的。

  考虑女士A和B及男士a和b,是A与a配对,B与b配对,但是A更偏爱b而不是a。我们证明b不可能比起偏爱B来更偏爱A。由于在算法的某个阶段A在a,b间更偏爱b, A选择b,但 A因b将某位女士排得更优先而被b拒接过。但是,在算法过程中与男士b配对的女士实际上至少与他拒接过的任何女士有同等的优先级。既然A被b拒接过,b必然更偏爱B而不是A。因此,不存在不稳定的配对,该完备婚姻是稳定的。

  2.3 延迟认可算法的举例  

  例2 将延迟认可算法用于优先秩评定矩阵

          a    b   c   d

      A   1,2    2,1    3,2    4,1

      B   2,4  1,2    3,1    4,2

      C   2,1    3,3    4,3    1,4

      D   1,3    4,4    3,4    2,3

  算法结果为:

   i) A选择a,B选择b,C选择d,D选择a;a拒绝D。

   ii) D选择d,d拒绝C。

   iii) C选择a;a拒绝A。

   iv) A选择b;b拒绝B。

  v) B选择a;拒绝B。

   vi) B选择 c。

  在ⅵ)中,不存在拒绝,因而

       A<->b  B<->c C<->a  D<->d

  是稳定完备婚姻。

  在延迟认可算法中,如果我们交换男女的角色,让男士按照他们排列的优先级别选择女士,那么我们得到一个稳定的完备婚姻,婚姻可能但不是必须不同于让女士选择男士所得到的稳定完备婚姻。

  例3 将延迟认可算法用于上例中的优先秩评定矩阵,其中男士选择女士。结果为:

   i) a选择C,b选择A,c选择B,d选择A

  ii) A拒绝d,d选择B;B选择d。

  iii) D选择D。

  完备婚姻

      a<->C   b<->A  c<->B  d<->D

  是稳定的,这是以相反的方式利用该算法所得到的相同的完备婚姻。

  在一个稳定完备婚姻中,如果以为女士得到作为配偶的男士比她在每一其他的稳定完备婚姻所得到的配偶在她的排序表中至少有同样高的优先级,那么,这个稳定的完备婚姻叫做是对该女士最优的。换句话说,不存在使得该女士得到在她的排序中具有更高级别排序的配偶的稳定完备婚姻。如果一稳定完备婚姻对每一位女士都是最优的,则称该完备婚姻是对女士最优的。我们用类似的方法定义对男士最优的稳定完备婚姻。然而,存在女士优先的和男士优先的稳定完备婚姻就不是明显的了。事实上,如果每一位女士独立地得到所有稳定完备婚姻中最好的伴侣,结果导致一次男女配对,这个结论是不明显的(可以想象用这种方法的结果有可能会导致两位女士得到相同的男士)。显然,可能只存在一种女士最优的完备婚姻和只存在一种男士最优的完备婚姻。

  2.4 延迟认可算法的性质

  按照 Gale-Shapely 算法,我们一定能得到一个稳定婚姻。也就是说,不管这N个男人和N个女人的优先表是如何分布的,至少存在一个稳定婚姻匹配。在“男优先”算法实现中,得到的一个稳定婚姻匹配具有如下三点性质:

  (1) 男性能够获得尽可能好的伴侣,结果是:如果还存在其他的稳定匹配,那么里面任何一个男性的伴侣排名都不会比“男优先”得到的结果更好,我们说此种情况每个男性获得的是“最好”的伴侣。

  (2) 女性却只能被动地一步步接近她最爱的目标, 但最后往往达不到,结果是:如果还存在其他的稳定匹配,那么里面任何一个女性的伴侣排名都不会比“男优先”得到的结果更差,我们说此种情况每个女性获得是“最差”的伴侣。

  (3) 无论男性们求婚的先后顺序如何,最终得到的是同一个稳定婚姻匹配。

  当然,这个算法的实现也可是:“女优先”,同样,得到的此稳定婚姻匹配具有对应的三点性质:

  (1) 在所有可能的稳定婚姻匹配中,“女优先”得到的结果中每个女性获得的是“最好”的伴侣。

  (2) 在所有可能的稳定婚姻匹配中,“女优先”得到的结果中每个男性获得的是“最差”的伴侣。

  (3) 无论女性们求婚的先后顺序如何,“女优先”最终得到的是同一个稳定婚姻匹配。

  4.结束语  

  历史上,这样的“配对游戏”还真有过实际应用,并且更有意思的是,这个算法的应用居然比算法本身的提出还早 10 年。早在 1952 年,美国就开始用这种办法给医学院的学生安排工作,这被称之为“全国住院医师配对项目”。配对的基本流程就是,各医院从尚未拒绝这一职位的医学院学生中选出最佳人选并发送聘用通知,当学生收到来自各医院的聘用通知后,系统会根据他所填写的意愿表自动将其分配到意愿最高的职位,并拒绝掉其它的职位。如此反复,直到每个学生都分配到了工作。当然,那时人们并不知道这样的流程可以保证工作分配的稳定性,只是凭直觉认为这是很合理的。直到 10 年之后, Gale 和 Shapely 才系统地研究了这个流程,提出了稳定婚姻问题,并证明了这个算法的正确性。  用稳定性来评价配对方案的好坏的确很站得住脚,但有时候我们也会遇到一些别的需求,它们又对应着算法世界中的诸多其它问题。比方说,如果我们已经知道每一对男女之间的“相配度”,如何寻找一种配对方案使得由此产生的总相配度最大?在算法领域中,这被称为二分图的最大权值匹配问题。再比如,如果不考虑性别的差异(比如同桌、搭档的匹配),问题就更加复杂了,这通常被归入一般图匹配的范畴。这些问题现在都已经找到了有效的算法,生活中的算法应用随处可见。我们要做的,就是带领大家从身边熟悉的事物出发,一睹算法的无尽魅力。

时间: 2024-10-08 00:18:38

浅谈稳定完备婚姻的算法的相关文章

Apache Spark源码走读之21 -- 浅谈mllib中线性回归的算法实现

欢迎转载,转载请注明出处,徽沪一郎. 概要 本文简要描述线性回归算法在Spark MLLib中的具体实现,涉及线性回归算法本身及线性回归并行处理的理论基础,然后对代码实现部分进行走读. 线性回归模型 机器学习算法是的主要目的是找到最能够对数据做出合理解释的模型,这个模型是假设函数,一步步的推导基本遵循这样的思路 假设函数 为了找到最好的假设函数,需要找到合理的评估标准,一般来说使用损失函数来做为评估标准 根据损失函数推出目标函数 现在问题转换成为如何找到目标函数的最优解,也就是目标函数的最优化

浅谈PHP5中垃圾回收算法

原文链接:http://www.cnblogs.com/leoo2sk/archive/2011/02/27/php-gc.html PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection).现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.

浅谈12306设计思路和算法

前言 春节期间,在汤哥的ENode QQ群(185916873)里,大家对12306的模型设计的讨论已经炸开了锅,很多大神都参与了讨论.由于我的DDD知识比较弱,和汤哥讨论了3-4个晚上,最后我跪了,在模型设计方面汤哥是相当专业的,汤哥的模型设计是相当正确的.在订票的算法上,和汤哥有点不同,我这篇文章旨在介绍我的设计思路和算法.在模型设计和架构设计上,汤哥的文章已经讲的很详细了.阅读本文之前,先要拜读汤哥的这篇文章. 我是技术性宅男,平时不写文章,我认为有写文章的时间,代码都能实现出来了.汤哥鼓

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

浅谈算法和数据结构: 四 快速排序

原文:浅谈算法和数据结构: 四 快速排序 上篇文章介绍了时间复杂度为O(nlgn)的合并排序,本篇文章介绍时间复杂度同样为O(nlgn)但是排序速度比合并排序更快的快速排序(Quick Sort). 快速排序是20世纪科技领域的十大算法之一 ,他由C. A. R. Hoare于1960年提出的一种划分交换排序. 快速排序也是一种采用分治法解决问题的一个典型应用.在很多编程语言中,对数组,列表进行的非稳定排序在内部实现中都使用的是快速排序.而且快速排序在面试中经常会遇到. 本文首先介绍快速排序的思

浅谈算法和数据结构: 五 优先级队列与堆排序

转载自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是

浅谈Miller-Rabin素数检测算法

浅谈Miller-Rabin素数检测 对于素数判断的操作,我们通常使用的是时间复杂度为\(O(\sqrt N)\)的试除法.按理说这种复杂度已经是较优秀的了,但是假如给定的需要判断的数极其之大,并且给定的时限不够以\(O(\sqrt N)\)的试除法来判断,该怎么办? 题出错了 想得美. 于是,今天的主角出场了:Miller-Rabin素数检测. Miller-Rabin素数检测算法用于在短时间内判断出一个数是否是质数,时间复杂度比试除法优秀,应该是\(O(T\times \log N)\)级别

浅谈欧洲算法——模拟退火

初听说退火这个名词感觉就很(zhuang)帅(A__CDEFG...) 直到学了退火之后,我才发现: 退火不只是帅,而且非常万能 甚至比 D (大) F (法) S (师)还要万能 简直就是骗(de)分神器啊 简介 作为一个计算机算法,它竟然在百度上有物理词条! 当时我看了就懵了,你说计算机一个算法,跟冶炼金属有什么关系啊? 后来我看了算法的词条... 是不是更懵了... 方便大家理解(变得更懵),我搬了百度上的定义: Simulate Anneal Arithmetic (SAA,模拟退火算法

浅谈MySQL索引背后的数据结构及算法

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是 平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为四个部分. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. 第二部分结合MySQL数据库中