Stable Matching Problem —— Gale Shapley算法

“一切算法都是从实际问题出发,深入理解问题内在的组合结构,从算法性着手进行设计。”

Problem

学生申请不同的大学,大学接收不同的学生,能否找到一个自我完善的算法来解决这个问题,使得最终的结果是一个稳定的匹配结果?同样的可以用在求职者与公司的招聘工作中。

稳定匹配(Stable Matching)结果:不能找到一个申请方与一个接收方,使得他们各自都更喜欢彼此而胜过他们当前的匹配。

Formalization:

输入:n个男生与n个女生,每个人都对所有的异性有一个排名,共有2个n*n的排名矩阵。

输出:每个男生和女生的匹配结果,结果中不存在不稳定的匹配。

Key Observation:

结果是一个完整的稳定匹配。

Basic idea:

从一小部分的匹配逐步增长到完整的匹配,并保证没有不稳定的匹配出现在增长的过程中。

Inplementation

使用一个“propose-engage”过程,男生:propose,女生:accept或者reject。

伪代码如下:

StableMatching(A, n)
	for i = 1 to n do
		boys[m] = NULL
		girls[m] = NULL
	end for
	while TRUE do
		if there is no boy b such that boys[b] = NULL then
			return;
		end if 
		select such a boy b arbitrarily
		g = the first girl on m's ranking list to whom g have no yet proposed
		if girls[g] == NULL then
			girls[g] = b;
			boys[b] = g;
		else if g is prefer b to state[g] then
			boys[girls[g]] = NULL;
			boys[b] = g;
			girls[g] = b;
		else
			continue; //reject the propose
		end if
	end whil
初始化之后进入循环,如果当前所有的男生都已经匹配了,就退出循环。否则,从未匹配的男生中任意选择一个男生b,从排名矩阵中选择男生b的对所有女生的排名,然后找出排名最好的女生,如果该女生没有匹配就让两者匹配。否则就从这个女生的排名中找出对已匹配的男生和当前男生的排名,如果更喜欢当前男生就拒绝之前匹配的男生并与当前的男生匹配,否则直接拒绝当前男生。

Correctness

首先可以得到下面的结论:

  1. 男生会按照排名降低的顺序去向女生propose
  2. 一旦一个女生匹配了,就不会再不匹配
  3. 当一个男生向女生propose时,可能会破坏之前的匹配
证明1:所有的男生和女生最终都匹配了。
假设有一个男生没有匹配,说明他向所有女生都propose过但是都被拒绝了。同时一定有一个女生也没有匹配,所以从来没有一个男生向她propose,这产生矛盾。
证明2:在while循环中,每次执行的都是稳定匹配,最终产生的结果不包含不稳定匹配。
假设b和g'是一个不稳定匹配,每个都更喜欢g和b'。第一种情况是b从来没有向g' propose过,推出b更喜欢g,那么b和g'是稳定的,矛盾。第二种情况是b想g' propose过,说明g'拒绝了b,从而g' 更加喜欢b' 而不是b,从而g' 和b是稳定的,也矛盾。
算法最多需要O(n^2)的时间,这个较容易看出。


你可能感兴趣的:(算法分析,matching,stable)