简单的稳定婚姻匹配

一、相关的定义

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]; %%这里输出的是1n编号女士对应的配偶的编号  

End

输入说明:这里的AB存储的是编号,而不是第一喜欢的人

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,LeaSue心中对理想对象的优先级顺序。

>> Match(A,B)

ans =

     1     2     3

     1     3     2

可以从结果分析,女士AnnBob结婚,女士LeaTom结婚,女士SueJim结婚

和书上的结果是一样的。

五、算法的局限性

1.输出的局限性:该算法显然会输出一个稳定的匹配,在这个匹配中,所有的男生和他们的第一选择相配,但是对女生并不如此。例如上面的从B中知道Ann最喜欢的是2号男生Jim,第三喜欢才是BOb,然后Bob第二喜欢的是Ann,,男生可以不断去表白,选择自己比较喜欢的男生,女生就只能比较男友和更换男友,这样,女生可能等不到最喜欢的男友的表白,游戏就结束了。

如果想要女生占优势,那么需要把女士和男生的输入顺序对换过来。

2.时间的效率性改进:为了快速求出所有的稳定匹配结果,提出了基于先序遍历森林的快速枚举算法。由Gale-Shapley算法的性质得到一个定理及其推论,利用得到的推论对算法做了进一步改进和优化。在满足推论的特定条件下,提高了算法的执行效率

六、具体的应用

应用于测试资源匹配的婚姻稳定算法改进

下一代自动测试系统中将实现测试资源的动态分配,我们使用婚姻稳定(Stable Marriage)算法来解决测试过程中测试资源与被测设备的匹配问题,使用择偶倾向队列缩减模型对求解典型"婚姻稳定"问题的Gale-Shapley(G-S)算法进行优化.该模型中使用择偶倾向队列描述婚姻稳定问题中匹配优先顺序,该队列会随着算法进行逐渐缩短,在简化数据规模的同时优化了处理婚姻稳定问题的G-S算法处理流程,改进后算法实现无效匹配请求的预先清除,从而使用后来请求优先的原则对匹配请求进行处理机制,对原有算法的时间空间成本实现了优化,适应了测试资源匹配任务的需求.

参考文献:孙昱  付少波  张天培  李长安 《应用于测试匹配婚姻算法的优化改进》

原文地址:https://www.cnblogs.com/lqs-zsjky/p/4401029.html