zoukankan      html  css  js  c++  java
  • 婚姻算法笔记

    婚姻算法

      曾经有想过类似的问题,婚姻算法中是关于情侣,我想的也是关于情侣方面。当时的想法是:如果每个人都将自己喜欢的人排出个名次列出,供别人参考,不就少了很多失败的表白和示爱吗。男生可以看在女生的排名中的名次来决定追不追。但只想到这里就结束了,没有想过当工作集从单链变成环时应该如何让每个人幸福。

      婚姻算法是由Gale和Shapley提出,不考虑版本是雇主和员工还是男女情侣,现在我们只讨论男女情侣,讨论另外一种也可以,其中包含的条件都是相似的。要在已知每个人喜好排名的情况下,安排出匹配。使得婚姻稳定,现在就急需一个稳定机制使得每个人都拥有一段稳定婚姻。

    稳定婚姻要求完美匹配且稳定。完美匹配要求每个人最终都会跟某人结婚,没有落单,且一夫一妻。稳定匹配要求在已有的匹配下不能出现以下情况:在匹配中(m1,w1)和(m2,w2)为两对匹配,m1相比于w1更喜欢w2,且w2相比于m2更喜欢m1,否则会出现出轨或者私奔情况。

    在G-S算法中基本思路如下,男女状态都有三个:自由,约会,已婚。根据以下规则构成匹配

    ·起初每个人都是自由,自由男向优先表中排名最靠前的女方表白,此时(m,w)立即成为约会状态。

    ·已约会女方可被其他自由男表白,若此自由男比现有的约会对象在排名上高,则抛弃现有约会对象,与此自由男进入约会关系(m1,w)。自由男会不停的按照排名依次向女方表白,直到最后,但不会抛弃现有的约会对象。

    ·最后所有人都进入约会状态,此时所有的约会对象变成结婚对象,状态变成已婚。

    看起来相当简单的一种算法,若表示成代码形式只需几个循环:

    m∈M,w∈W,分别表示男方,女方。

    初始化所有的m∈M,w∈W为自由

    While存在男士m是自由且还没对所有女方表白

      //若男士m优先表中没有表白的女方排名最高的是女士w

    If 女士w为自由

      (m,w)进入约会状态;

    Else 女士w在与m1约会

      If 女士w更喜欢m1,then 男士m继续单身,(w,m1)恋爱状态不变;

      If 女士w更喜欢m,then男士m1进入单身,(w,m)进入恋爱状态;

      待循环结束,输出所有的匹配结果。

      尽管G-S算法看起来相当简单,但我们不敢确定算法会返回一个完美稳定匹配结果,我们需要证明来肯定我们的观点:

    ①首先要证明G-S算法返回一个完美匹配结果:首先要肯定在男士一次次的表白后,进入约会状态的男女对数只增不减,因为只有更好的男士追求了女方,女方才会抛弃现有的约会对象,所有被表白的女方都是处于约会状态的。不会出现某个男士m是自由的,但所有的女方都被其表白。因为若所有的表白的女方都进入约会状态,需要所有的男士都进入约会状态,与前提有一个男士对所有的女士都表白但还是处于单身相违背。即在所有循环结束后,会得到一个完美匹配结果。

    ②再证G-S算法返回一个稳定匹配结果:首先我们先从已有的约会集合中判断是否稳定。当第一个男士向第一个女士表白后有(m,w),显然是稳定的,因为没有其他的约会对象使得已有的约会对象不稳定。若有新的匹配对象出现(m1,w1),是否还稳定?首先m1没有向w表白,证明男士m1的排名表上w1的排名要高于w;或者m1在向w表白后,w拒绝了m1的表白,因为w的排名表上m的排名比m1的排名高。两种情况都是稳定的因为女方会在现有被追求的男士中挑选最好的,使得匹配稳定。以后的每一次表白也遵循这样的规则使得匹配一直稳定。结合①即算法最后会返回一个完美稳定匹配结果

      在返回了一个完美稳定的算法之后,我们会想是不是完美稳定的匹配结果是唯一的。我们考虑这种情况:

    m1的优先表:w1 w2

    m2的优先表:w2 w1

    w1的优先表:m2 m1

    w2的优先表 : m1 m2

    在G-S算法中给出的完美稳定匹配为(m1,w1),(m2,w2)。但我们看(m1,w2),(m2,w1)也是稳定的。只是G-S算法只会给出多个稳定匹配中的一个。

    没有看到结果前,貌似男士在G-S算法中吃了大亏,因为总会被女士抛来抛去,在女方有了更喜欢的男士表白,就扔下现有的约会对象,跟那个表白的人约会。

    在这个例子中G-S算法给出的匹配结果显示:男士都得偿所愿得跟最喜欢的女士在了一块,但女士却没有了选择权,只能‘嫁鸡随鸡,嫁狗随狗’。男士选择了’我爱的人’,但我爱的人不喜欢我,而女士选择了’爱我的人’,但我不喜欢爱我的人。所以说,G-S算法更偏向于男士,因为女士都是被迫接受的。也不枉男士在这一漫长的表白过程中的艰辛。我们可以考虑一种更为极端的情况,所有的男士的排名表上的第一选择都是不一样的,则不管女士的排名表如何,结果是一定的。因为所有的男士在第一次表白过后都得到了最喜欢的女士,不会再进行表白,也就不会出现匹配结果上的变化。事实是女士才吃了大亏。

    所以要从更深的意义上理解为什么出现这种情况,为何看似男士一直被女方抛弃但算法是偏向男士的。

    在算法中,女士被第一次表白必定成功这是肯定的。这就说明女士的择偶标准没有下限,她的排序表只在被表白的时候才能体现,而在没有被表白的时候,她不能主动的去表白,在所有的匹配结果中女士的主动权几乎丧失。而男士则一直在排序表从上至下的表白,一直寻找到一个最佳的有效约会对象。所有排名比现有的女伴要高的女士都把此男士拒绝过,而且此女士是没有拒绝男士中排名最高的。所以G-S算法对于男士来说所得到的伴侣是所有稳定匹配中最好的。

    事实上G-S算法给出的稳定匹配结果是女士所有可能的匹配的男士结果中最差的,以下给出证明。

    先给出三个定义:有效伴侣,最佳伴侣,最差伴侣。有效伴侣指可以构成稳定匹配的伴侣,最佳伴侣是有效伴侣排名上最高的,最差伴侣是排名最低的。显然G-S算法给出了男士的最佳伴侣。我们用反正法给出证明:假设存在(w,m)使得m不是w的最差有效伴侣,在G-S算法给出的匹配中,男士不是女士的最差伴侣,那么存在一对情侣其中w与比m更不喜欢的m1配对,m与另外一位女士w1配对。因为w是m的最佳有效伴侣, w1是m的有效伴侣,我们可以发现应该要w而不是w1.所以得到(m,w)是一个不稳定的配对。此匹配就是不稳定的。所以G-S算法给出的稳定匹配结果是女士所有可能的匹配的男士结果中最差的。

    G-S算法在现实生活中的意义在于,在得知现有已有人群的需求列表的基础上。把总体的期望值达到最高。而且这是一种非常简单的办法,简单到你不用了解每个人的各种细节的偏好,只需要把他们的排序表拿出来,根据算法肯定可以得到一个大家都满意的稳定结果。

    在G-S算法没有被提出之前,美国就开始用这种办法给医学院的学生安排工作,这被称为”全国住院医师配对项目“。各医院从没有拒绝本学院的学生中选出最佳人选并表示可以聘用,然后同学在收到医院的聘用通知后,系统根据所填写的意愿表将他自动分配到意愿最高的医院并拒绝其他的聘请,直到循环结束。最后便可以使所有学生分配到工作。但当时只是使用了这个算法,并不知道算法的稳定性,只是感觉上算法是合理的。其实算法是真的合理。也确实解决了当时的医师匹配项目问题。

    G-S算法可以真正的用于婚姻中,比如男女相亲栏目,作为栏目的组织者,只需让男女双方在开始的时候了解每一个异性,给异性排名,然后根据算法用男女的排序表自动就可以得出n对稳定情侣。省时省力,几百对情侣估计几秒或者更短的时间就被算法得出。当人们质疑这种算法的优质的匹配效率的时候,G-S算法恰被证实是一种稳定的匹配。

    在整理了关于G-S算法后,我在想是不是此算法可以用来决定高考志愿问题。高考之后,每个人都有了自己的成绩。然后学校给出了所有的学生的排名,因为高考成绩就是学校给学生的默认排名。然后学生根据自己的喜好程度来给大学排名。此时学生充当婚姻算法里的男士,不断地向还没拒绝自己的最喜欢的学校示意表示申请进入该大学。但大学不像婚姻算法里的女士只可以接受一个男士。大学可以根据自己的招生计划来判断可以容纳多少学生。但此举动并没有破环算法。大学在没有招满学生时,只要有学生申请便允许进入。在满员后在所有的申请人中选取最高的n个学生作为该大学的学生(n为大学招生计划学生数),其他的申请被拒绝。然后没有被某个大学录取的学生继续向还没拒绝自己的最喜欢的大学申请。直到最后循环结束,所有的学生都找到了该去的大学(若所有的大学的招生计划总数大于学生总数)。

    在此G-S算法也解决了高考志愿问题,但我们没有考虑学校分专业问题,若我们把学校的每个专业作为婚姻算法中的一个对象也可以解决多专业问题。实际上操作起来便没有那么轻松。因为要收集的信息量激增,每个学生要对所有大学的所有专业做出排名。然后根据G-S算法得出匹配结果。

    虽在收集数据的时候多花费了很多时间,但这完美解决了志愿填写问题,因为现有的志愿填写很大程度上束缚了学生的自由意志。若学生给出了所有选择的排序而不是只有几个志愿,显然使学生的公平性有了质的提升。

    把G-S算法推广到更深,G-S算法可以解决众多的对立的多个体多选择的竞争问题上。其中对立指所有的对象氛围两阵营,如男女,学生和大学,雇主和职员。虽然其中存在着选择与被选择的优劣性问题。多个体指每个阵营中有着不少的个体,有着不少的基数。多选择指每个个体对另外一个阵营的个体有着自己的选择次序。竞争是指在被选择方的要求人数到达上限时,会选择性的把最优的留下,剩下的拒绝。

    不可否认的是G-S算法的不公平性,因为选择方得到的结果是所有匹配结果中最好的,被选择方得到的结果是所有匹配结果中最差的。所以在现实生活中使用此算法应该有所顾忌。但G-S给我们的启示不仅如此。

    在生活中G-S算法不是很普遍的在使用。或者说不是在严格的执行,因为个体在选择和被选择方没有一个很确定的阵营。但这恰使生活充满了未知和奇迹。很少人甘心一辈子愿意作为被选择方,很大程度上放弃自己的选择权。但也没有多少人愿意为自己所有喜欢的东西都追求一遍来确定自己可以达到的最好的选择。或许有些伤感,但这应该就是生活。

    根据G-S算法我们应该想,生活中在追求事物时多尝试,你总是等待机会出现然后选择最好的,但不去自己追求。最后的结果就是在G-S算法中充当被选择方,最后得到的是你可以得到的所有选择中最差的。所有的尝试都不是徒劳的,你在一次次被拒绝后,你身心疲惫,得到的却是最好的。或许你不可能尝试每一个喜欢的选择,但是你每次的尝试都会给你一个更好的定位。

    完。

     

  • 相关阅读:
    container宽度
    NO.14 两个div并排,左边为绝对宽度,右边为相对宽度
    CSS3旋转图片效果收集
    背景图片问题
    CSS动画
    前端比较有用的网址
    JS如何判断IE和火狐与Chrome浏览器
    JAVA多线程面试题目
    JAVA多线程之Semaphore
    阿里多线程笔试题
  • 原文地址:https://www.cnblogs.com/Jacck/p/4579958.html
Copyright © 2011-2022 走看看