《算法的乐趣》——稳定匹配与舞伴问题

  这一章我们将探讨有关图论匹配的有关内容。

  首先我们给出具体的问题来并以此进行数学建模。

  我们以男女婚配为例,现有n个元素集合Man:{m1、m2、m3......},n个元素的集合Woman:{w1、w2、w3......}。

  匹配:

  从Man中选择一个元素mi,在Woman中选择一个元素wj形成<mi,wj>,完成一次配对,那么完成k次这样的配对,将得到一个匹配。

  完美匹配:

  基于匹配,但是我们需要完成n次配对,即每个人都有自己的配偶,这便是完美匹配。

  稳定匹配:

  基于完美匹配,其实对于每个元素mi或者wj,他们对于配偶的选择都是有一个排序的,即mi虽然可与与任意的wj进行配对,但是mi自身有一个优先顺序。现在如果出现这样的情况则视为“不稳定”:完成<mi,wi'>、<mj、wj'>的配对后,相对wi',mi更加喜欢wj';相对于mj,wj'更加喜欢mi。那么所谓的稳定匹配,就是既是完美匹配,也不出现这样的不稳定的情况。

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

  能够看到,我们只要不断匹配知道没有一个人落单,便可以满足完美匹配,因此整个匹配的过程我们面临的最大的困难,是如何满足“稳定”。

  基于对所谓稳定性的理解,我们从Man的角度开始选择,选择一个元素mi,我们做一个变而治之当中所谓“表示变更”的操作:将mi选择woman的倾向程度进行排序(由高到低),然后基于mi这个排序,这里给出一个简单的序列w3、w2、w1......那么下面开始模拟mi的配对过程。

  为了尽量满足稳定性,我们显然要让mi从序列的顶部的w3开始选择,为什么呢?先不论w3对mi的满意程度如何,如果配对成功,起码mi的满意程度达到了最大。

  刚才我们满足了man的需求,同样的我们需要满足woman的需求,这样整个匹配的满意度才能达到均衡,就更不容易产生不稳定因素。

  如果w3有配偶,即<w3,mj>,那么我们比较w3对其配偶mj和mi的喜欢程度,如果w3更喜欢mi,那么形成配对<w3、mi>,否则不变。

  采取相同的方法,我们完成对mi的择偶过程。

  同样,我们能完成n个man的择偶过程。

  我们不难归纳出如下的伪代码来描述这个算法过程。

while(存在单身man)
{
     选择单身man,mi;
    尝试进行匹配<w,mi>,w是mi最优先求偶的对象;
       if(w是自由状态)
              完成匹配<w,mi>;
       else
              
             {
                         比较mi和m对于w择偶的优先程度;
                            if(mi > m)
                                    完成匹配<mi,w>;
                            else
                                   保持匹配<m,w>;
             } 
}

  能够看到,上面的算法分析是很模糊和具有启发性质的,并不严谨,那么我们需要更严谨的证明方法。
  证明:

  证明分为两个方面,完美匹配和稳定因素。

  对于完美匹配,我们考虑反证法,假设集合Man中有一个元素mi,那么集合Woman必然存在一个元素wj没有匹配,那么只需形成<mi,wj>,即可形成完美匹配。

  对于稳定性,依然考虑利用反证法,假设存在这样两个不稳定匹配<m1,w1>、<m2、w2>,其中对于m1,他更加倾向选择w2;对于w2,她更加倾向选择m1.这其实与我们的算法过程相悖的,因为m1匹配的时候,会访问w2,如果w2没有被约,那么可完成<m1,w2>的匹配,如果已经形成了<m2,w2>的匹配,那么很显然w2会放弃m2和m1配对,由此可知假设是不成立的。

  由此得证Gale-Shapley算法的正确性。

原文地址:https://www.cnblogs.com/rhythmic/p/5549792.html