写在前面:
本文属于翻译内容,节选自 Jon Kleinberg及 Eva Tardos所著之算法宝书《Algorithm Design》的第一节“Stable Matching”,由于其影响力大,应该已被翻译成中文版本,但是本人在此承诺,以下的全部内容由我自行翻译(除了借用部分词典工具),绝无抄袭拷贝之行,还请大家监督。
之所以想翻译这一部分内容,是因为匹配算法是一个非常经典而有代表性的问题,我们在实际生活中会遇到许许多多的关于匹配的问题:求职、求偶、买房甚至是日常卖商品文具等等,而我一开始注意到这个算法的特别之处则源自“保研报名”一事,此作后话,暂且按下不表。在接下来的翻译过程中,我将不时加入旁注(自己的思考),并用斜体字表示。
作为一个开放式的话题,我们来看一个能够很好地解释我们将会强调的许多主题的算法问题。它是由一些非常自然和实际的关心所激励而生的,从这些关心(的因素)中,我们会将问题陈述明确地表达,简单而清晰。并且解决这一问题的算法也很清晰,我们的大部分工作将会花费在证明它的正确性和给出一个它算出答案的可以接受的时间界限。
匹配问题的出现,在某种程度上说,是于1962年,当时大卫·盖尔和罗伊德·夏普利两个数学经济学家,问了这样一个问题:能不能够设计一个大学考试流程,使得它是自动实施的(self-enforcing)?他们这么问是什么意思呢?
为了建立这一问题,我们首先来正式地考虑一个可能的情况:一群朋友,或者是一些在大学主修计算机科学的低年级生,开始申请企业的夏季实习生。申请流程的关键之处就在于企业(雇佣者)和学生(申请人)这两种团体间的相互影响。每一个申请人对(不同的)企业有一个喜爱程度的排序,相对地每一个企业,一旦申请者进入之后,便也有了一个对(不同的)申请人的喜爱程度排序。基于喜欢程度(的不同),企业发放一些offer给部分申请人,申请人(如果有多个offer)则选择他要接受哪个offer,然后人们就开始进行夏季实习。
盖尔和夏普利考虑到这类事情会因为这种流程而变得乱套,由于缺乏任何强制现状(得以维持)的机制。假设这样一个例子,你的朋友罗杰刚刚从一个大型电信企业CluNet那接受了一个夏季职位。几天后,一个小型初创公司WebExodes,它正在市场中努力做出最后的财政决策,也提供给了罗杰一个职位。现在,罗杰喜欢WebExodes胜于CluNet——兴许是因为一种闲散的、任何事都可能发生的氛围——因此这种新的(局势)发展可能就会使他撤销对CluNet的offer的接受转而投向WebExodes。突然失去了一个实习生,CluNet提供了一个offer给候选申请人的名单之一,而这个申请人立刻就撤销了他先前对于软件巨头Babelsoft的offer的接受,此时情形开始陷入失控的螺旋中。
事情看起来不太妙,如果还不够糟,那么从另一个方向再来看看。假设罗杰的一个朋友切萨,本打算去BabelSoft但是在听到罗杰的故事后,打电话给WebExodes的人说,“你知道,我真的更愿意花费我的夏日时间在这里而不是在BabelSoft。”他们会发现这很容易相信。而进一步来说,通过审视切萨的申请,他们意识到他们会更愿意雇佣她而不是那些已经被安排要在WebExodes进行暑期实习的学生。在这个案例中,如果WebExodes不是一个那么严肃的公司,它就会找一些方法来撤销对那些录用者的offer并转而雇佣切萨。
像这样的情形会造成许多混乱,而很多人——申请人以及雇佣者,都会因为这样的流程、这样的结果而不悦收场。到底哪里错了呢?一个基本的问题是:这一流程不是自动实施的(self-enforcing)——如果人们被允许可以通过自我兴趣去行动,那么混乱就会瓦解。
我们也许更喜欢如下的更稳定的情形,自我兴趣能够阻止offer被撤销或者重现寄送。考虑另一个学生,他已安排去到CluNet夏日实习但是打电话给WebExodes透漏他更想去那工作。但在这个例子中,基于已经被接受的offer,他们可以回答,”不,结果表明我们更喜欢之前每个我们已经接受了的同学,所以恐怕我们爱莫能助。“或者考虑一个雇佣者,真心地想争取那些顶尖的申请者,却被他们中的每一个都告知,“不,我很高兴我现在所在的地方。”在这样的例子中,所有的结果都很稳定——没有任何外部的交易可以再进行了。
所以盖尔和夏普利问的是这样一个问题:给定一个雇佣者和申请者的喜欢程度的集合,能否分派申请者给雇佣者使得对于每一个雇佣者E,和每一个没有安排给E工作的申请者A,至少其中一方满足以下两种条件之一:
(i)E喜欢每一个他接受的申请者胜于A;
(ii)A喜欢他现在的环境胜于为雇佣者E工作。
如果以上成立,那么这个结果就是稳定的:个人的自我兴趣会阻止任何的申请者/雇佣者在幕后的交易。
译者旁注
我们来谈谈一个作为大学生可能会关心的问题:保研中学生和导师的相互选择。
这个问题很有代表性,因为它目前正陷入某种囚徒困境。我们来详细阐述这一案例:一个具有保研资格的学生S1联系了一个本学科的导师T1,表明自己有意去他那读研。T1对S1感觉还可以,决定留1个位置给他(很多导师因为时间上的不一致性智能采用先来后到留位置的方式收学生)。注意到这一方式的机会风险:假设T1老师有k个名额,当预留给跟他联系的k个学生后,第k+1个学生他不得不拒绝(或者接受第k+1个学生,踢掉前面k个学生中的1个)。而实际上一般来说,S1还会联系导师T2、T3…,如果他得到了多个导师的留位承诺,那么最后他只能选择1个导师,浪费至少1个其他老师的名额;换个视角来看,作为导师,T1有所顾忌,怕给了口头承诺后学生又不报自己这里,就会白白损失名额。因此他一般会选择按兵不动,既不答应也不拒绝。然而这就助长了学生联系更多老师的动力,直到有一个老师愿意接受他为止。在最后由学生做出选择时,老师们有可能遗憾错过了这个自己原本很赏识的学生。结果上的混乱与两位作者在书中举得申请者/雇佣者例子如出一辙。
有没有一种办法来解决这样的问题呢?即是否存在一种自动实施的过程,使得S与T的匹配中,每一对(S,T)都是稳定的呢?这一种匹配过程的细节及流程又是如何呢?
让我们回到原文的内容
为了探讨这一问题的本质,我们把问题描述地越干净简洁越好。实际生活中的企业和申请人包含了许多令人分心的不对称性。每一个申请者要选择一个单一的公司,但是每个公司要招募很多职员。更进一步地说,很有可能申请者的量供大于求,公司没有准备那么多位置。最后,每个申请者不会对每个公司都提交申请。
把问题消除复杂性和进行“骨架式”的简单叙述是一种有用的,至少在最初是这样的方式:n个申请者中的每一个人对n个公司中的每一个提交申请,每个公司只选择1个申请者作为自己的员工。我们将会看到,这样做保留了植根于问题中的基本要素。尤其是我们对于这个简单情形的解决方案可以直接推广到复杂情形。
追随盖尔和夏普利的脚步,我们发现这个特殊的情况可以被看做是设计一种n个男人与n个女人结婚的系统:我们的问题里自然包含两种类似的“性别”——申请者和公司——在这个例子中,我们考虑每一个人都想与一个不同性别的个体结为一对。
现在来考虑一个由n个男人组成的集合M={m1,m2…mn},和一个由n个女人组成的集合W={w1,w2…wn}。让M*N来表示所有形如(m,w)的可能的指定配对集合,其中m∈M,w∈W。一个匹配S就是一个M*W中的有序配对的集合,它具有这样的性质:M中的每一个成员和W中的每一个成员出现在至多一个S中的配对里。一个完美匹配S’就是一种这样的匹配:M中的每个成员和W中的每个成员精确地出现并且只出现在S’中的一个配对中。
现在我们可以把喜爱程度的概念引入这一设计中。每一个男人m∈M对所有女人(按喜欢程度)划级,我们说m喜欢w胜于w’,如果m对w的划级比w’高。我们把m的有序划级成为喜爱程度列表。我们不允许(喜爱程度)同等级。每个女人,相似的,也对所有男人划级。
给定一个完美匹配S’,有什么问题会发生?根据我们最初关于雇佣者和申请者的动机的指导,需要担心如下的情形:在S中有两对配对(m,w)与(m’,w’),它们却又这样的性质:m喜爱w’胜于w,w’喜爱m胜于m’。在这一案例中,没有什么可以阻止m和w’抛弃现在的配偶在一起。我们说这样一个配对(m,w’)对于S是一个不稳定因素:(m,w’)不属于S,但m和w’都喜爱他人胜于S中所指明的现任配偶。
我们的目标是构造出一个没有不稳定因素的婚姻关系集合。我们说一个匹配S是稳定的,如果它满足:
(i)它是完美匹配;
(ii)对于S没有不稳定因素。
既是这样,以下两个问题就会立即涌现在脑海里:
·对于每一个喜爱程度列表都存在一个稳定匹配吗?
·给定一个喜爱程度列表的集合,如果稳定匹配存在,我们能够有效构造一个出来吗?
为了阐述这些定义,先来考虑如下稳定匹配问题中的两种简单实例。
首先,假设我们有一个包含两个男人的集合,{m,m’},和一个包含两个女人的集合{w,w’}。喜爱程度列表如下所示:
m喜爱w胜于w’,
m’喜爱w胜于w’,
w喜爱m胜于m’
w’喜爱m’胜于m。
如果凭直觉去思考这个喜爱程度列表,它表示完全的同意:男人同意对女人的排序,女人也同意对男人的排序。在这里有一个特殊的稳定匹配,包含(m,w)和(m’,w’)。其他的完美匹配,包含(m’,w)和(m,w’),将不是一个稳定匹配,因为(m,w)会成为对于匹配的不稳定因素。
接下来,这里是一个稍微有点复杂的例子,假设喜爱程度列表如下所示:
m喜爱w胜于w’,
m’喜爱w胜于w’,
w喜爱m’胜于m
w’喜爱m胜于m’。
这里有什么不同?两个男人的喜爱程度完美互补,两个女人的喜爱程度也完美互不,但是男人和女人的喜爱程度则完全冲突。
在第二个例子中,有两种不同的稳定匹配:(m,w)与(m’,w’),(m’,w)与(m,w’)。这是我们要记住的重要一点:在一个实例中可能拥有不只一种稳定匹配。
我们已经展示了对于每一个男人和女人间的喜爱程度列表集合,都存在一个稳定匹配。更进一步来说,我们展示这一点的方式也能够回答第二个问题:我们会给出一个有效的算法,来根据喜爱程度列表构造出一个稳定匹配。
让我们考虑如下激励产生算法的基本想法:
·最初,每个人都是未婚的。假设一个未婚男人m选择女人w(w在他的喜爱程度列表上级别最高)求婚。我们能够立即宣称(m,w)就是我们最终的稳定匹配里的一对吗?不一定:在将来的某个时刻,一个男人m’(w更喜欢他)可能也会向w求婚。但是从另外一个角度讲,w立即拒绝m也是危险的,因为接下来w可能再也接受不到她的喜爱列表里比m等级更高的男人的求婚了。一个自然的想法是使(m,w)这一对进入中间状态——订婚。
·假设我们现在处于这样一个状态:一部分男人和女人是自由的——未订婚的——而一些是已经订婚的。下一步便像这样:一个任意的自由男人m选择他尚未求婚的在他的喜爱程度列表里等级最高的女人w求婚。如果w也是自由的,他们订婚。否则,w就是跟另一个男人m’订婚了。在这一例子中,她选择m和m’中在她喜爱程度列表中级别更高的男人并与之订婚,另一个男人则成为自由身。
·最后,这一算法将会在没有自由人时终止;在这一时刻,所有的订婚都是最终的状态——结婚,返回所得到的完美匹配。
下面是这个Gale-Shapley算法的具体描述:
一件迷人的事情是:虽然G-S算法陈述起来十分简单,但它并没有明显地表示返回了一个稳定匹配,甚至是完美匹配。我们接下来就要通过一系列中间事实证明它。
首先从一个女人w的视角来考虑算法的执行。算法开始后一段时间,还没有人向w求婚,她是自由的。然后一个男人m也许会向她求婚,她进入订婚状态。随着时间推移,她可能会得到更多的求婚,并接受那些能够使配偶在喜爱程度列表里级别更高的求婚者。所以我们发现如下事实:
(1.1)w自从她的第一个求婚者开始,就一直是订婚状态;而且与她订婚的配偶(根据她的喜爱程度列表)等级越来越高。
而男人在算法的执行过程中则大不一样。在他向他喜爱程度列表中最高级的女人求婚之前,他都是自由的;在第一次求婚时他可能订婚,也可能不会。随着时间推移,他将会在自由与订婚之间做出转换;然而,下面的性质对他是成立的。
(1.2)m求婚的女人(根据他的喜爱程度列表)等级越来越低。
现在我们来展示程序的终止,以及给出一个为了终止而循环的最大上限。
(1.3)G-S算法将在至多n^2次的While-loop循环后终止(此处证明略)。
(1.4)如果m在算法执行的某个时间点是自由的,那么必定存在一个女人他尚未对其求婚。
证明:假设有一个时间点m是自由的但是还未向每一个女人都求婚。那么根据(1.1),n个女人中的每一个都是订婚状态。由于订婚的集合组成了一个匹配,那么此时也必定有n个订婚的男人。但是总共只有n个男人,而m尚未订婚,因此矛盾,结论成立。
(1.5)集合S结束时返回的是一个完美匹配。
证明:订婚对的集合总是形成一个匹配。让我们假设算法结束时还有一个自由的男人m。那么结束时,必然出现过m已经向每一个女人都求婚的情况,否则While-loop便不会退出。但是这和(1.4)相矛盾。因此结论成立。
最后我们来证明这个算法最主要的性质——它的结果返回的是一个稳定匹配。
(1.6)考虑一个G-S算法的执行返回的配对的集合S,S是一个稳定匹配。
证明:我们已经看到,在(1.5)中,S是一个完美匹配。因此,为了证明S是一个稳定匹配,我们假设对于S有一个不稳定因素并导出矛盾。像之前定义的一样,这样一个不稳定因素会包含两对,(m,w)和(m’,w’),在S中有如下性质:
·m喜爱w’胜于w
·w’喜爱m胜于m’
在这一算法执行到产生S时,m的最后一次求婚,按照定义,应是对w。现在我们问:m在之前早一些的执行过程中是否对w’求婚了呢?如果他没有,那么w在他的喜爱程度列表中必定比w’要高,这与我们的假设m喜爱w’胜于w相矛盾。如果有,那么必定是因为w’有了更喜爱的订婚者m”,他被w’拒绝了。而m’是w’最后的配偶,所以要么有m”=m’或者根据(1.1),w’喜爱m’胜于之前的m”;这两者中的任何一种情况都和我们的假设w’喜爱m胜于m’相矛盾。
因此,S是一个稳定匹配得证。
译者旁注
我们看到,解决稳定匹配问题的算法是相当简单的,但是也相当强悍。其原因不仅仅在于它最后得到的是一个不会再生变数的结果,而且在于不论以何种顺序执行,都能得到相同的稳定匹配。这一点我将不在此处再做叙述,有兴趣的读者可以阅读《Algorithm Design》的原文(从第9页开始的延伸阅读)。
上文中有一句话:对于此简单问题的解决方案可以直接推广到更多复杂的情形。所以,现在我们感兴趣的内容是,针对现实的问题(比如保研中学生与导师之间的博弈)可以不可以设计一个好用的系统或过程,使得它是self-forcing的,并且在给定必要的输入,经过算法执行后,得到唯一的稳定的结果匹配。
针对这一延伸内容,我会在之后的博客中再来详述(毕竟本篇定位为翻译),希望大家多多指点。
附:原书链接:
链接:http://pan.baidu.com/s/1nt9xTmL 密码:k28n