一、相关的定义
1.有一个男士集合和一个女士集合。每个男士都有一个优先级列表,把女士按潜在结婚对象进行优先级排序。
同样的,女士也有一个对潜在结婚对象的优先级列表。
婚姻匹配:
一个婚姻匹配M是一个包含n个(m,w)对的集合,每一对的成员都按照一对一的模式从两个不相交的n元素集合Y和X中选出。也就是说,Y中的每个男士m都只和X中的一位女士w配对,反正亦然。相当于一个二分图中,边来连接可能结婚的对象,两边的顶点代表X和Y,婚姻匹配也是图中的一个完美匹配。
婚姻的稳定:如果在匹配M中,,男士m和女士w没有匹配,但他们都更倾向对方,而不是M中彼此的伴侣,那么(m,w)称为受阻对,如果婚姻匹配存在受阻对,那么我们说婚姻是不稳定的,如果不存在,则婚姻是稳定的。
二、稳定婚姻算法
输入:含有一个n个男士的集合和一个n个女士的集合,以及各自选择结婚对象的优先级。
输出:一个稳定的婚姻匹配关系
1. 开始所有的男生和女士都是*的。
2. 如果存在*男生,任选一个男生,执行下面步骤:
(1) 求婚:选中的男士m向w求婚。w是优先级最高的,而且没有拒绝过他。
(2) 回应:如果w是*的,她接受求婚,如果w不是*的,她把m和当前的配偶作比较,如果更喜欢m接受求婚,否则拒绝。
3. 返回n个配对的集合。
三、代码的实现
因为这次的实现比较简单,所以用了matlab来编写函数
//dequeue函数
function [Q] = dequeue(Q )
n=size(Q,2);
for i=1:n-1
Q(i)=Q(i+1);
end
Q(n)=[];
end
//enqueue函数
function [ Q] = enqueue( Q ,x)
n=size(Q,2);
Q(n+1)=x;
end
//判断队列否为空
function [ flag] = empty( Q)
flag=false;
if size(Q,2)==0
flag=true;
end
end
//判断男生和女士现有配偶的优先级顺序,如果排在该配偶前面
function [j] = shunxu(B,x,y)
%%输入一个矩阵的第x行,判断输入的值y在这行的位置
n=size(B ,2);
j=1;
for i=1:n
j=j+1;
if (B(x,i)==y)
break;
end
end
end
//婚姻匹配函数
function [ D ] = Match( A,B )
%A,B分别是男女的优先选择矩阵
%返回稳定的匹配
n=size(A,2);
B1=zeros(1,n); %B1女士是否已经匹配,储存匹配的男士编号
for i=1:n
Q(i)=i;
end %Q为待匹配的男士的队列,初始化为全部男士
while(~empty(Q))
m=Q(1);Q=dequeue(Q);
for i=1:n
k=A(m,i); %m男士第i喜欢的是k女士
if(B1(k)~=0) %如果k女士已经匹配了
if(shunxu(B,k,B1(k))>(shunxu(B,k,m))) %且如果第m个男士的优先级比现有配偶要高
Q=enqueue(Q,B1(k));
B1(k)=m;
break;
end
else %如果没匹配
B1(k)=m;
break;
end
end
end
a=1:n;
D=[a;B1]; %%这里输出的是1到n编号女士对应的配偶的编号
End
输入说明:这里的A,B存储的是编号,而不是第一喜欢的人
Matlab的文件输入输出问题:
四、案例的测试
用书上那个例子:见算法设计与分析基础293页
性别 |
编号 |
1 |
2 |
3 |
男士 |
Bob |
Jim |
Tom |
|
女士 |
Ann |
Lea |
Sue |
那么男士的优先级顺序为: 女士的优先级顺序为:
A= [2,1,3 B= [2,3,1
2,3,1 3,1,2
3,2,1] 2,3,1]
A的每一行分别是Bob ,Jim 和Tom心中对理想对象的优先级顺序
同理,B的每一行分别是Ann,Lea和Sue心中对理想对象的优先级顺序。
>> Match(A,B)
ans =
1 2 3
1 3 2
可以从结果分析,女士Ann和Bob结婚,女士Lea和Tom结婚,女士Sue和Jim结婚
和书上的结果是一样的。
五、算法的局限性
1.输出的局限性:该算法显然会输出一个稳定的匹配,在这个匹配中,所有的男生和他们的第一选择相配,但是对女生并不如此。例如上面的从B中知道Ann最喜欢的是2号男生Jim,第三喜欢才是BOb,然后Bob第二喜欢的是Ann,,男生可以不断去表白,选择自己比较喜欢的男生,女生就只能比较男友和更换男友,这样,女生可能等不到最喜欢的男友的表白,游戏就结束了。
如果想要女生占优势,那么需要把女士和男生的输入顺序对换过来。
2.时间的效率性改进:为了快速求出所有的稳定匹配结果,提出了基于先序遍历森林的快速枚举算法。由Gale-Shapley算法的性质得到一个定理及其推论,利用得到的推论对算法做了进一步改进和优化。在满足推论的特定条件下,提高了算法的执行效率
六、具体的应用
应用于测试资源匹配的婚姻稳定算法改进
下一代自动测试系统中将实现测试资源的动态分配,我们使用婚姻稳定(Stable Marriage)算法来解决测试过程中测试资源与被测设备的匹配问题,使用择偶倾向队列缩减模型对求解典型"婚姻稳定"问题的Gale-Shapley(G-S)算法进行优化.该模型中使用择偶倾向队列描述婚姻稳定问题中匹配优先顺序,该队列会随着算法进行逐渐缩短,在简化数据规模的同时优化了处理婚姻稳定问题的G-S算法处理流程,改进后算法实现无效匹配请求的预先清除,从而使用后来请求优先的原则对匹配请求进行处理机制,对原有算法的时间空间成本实现了优化,适应了测试资源匹配任务的需求.
参考文献:孙昱 付少波 张天培 李长安 《应用于测试匹配婚姻算法的优化改进》