• 简单的稳定婚姻匹配


    一、相关的定义

    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算法处理流程,改进后算法实现无效匹配请求的预先清除,从而使用后来请求优先的原则对匹配请求进行处理机制,对原有算法的时间空间成本实现了优化,适应了测试资源匹配任务的需求.

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

  • 相关阅读:
    Mysql热备份
    win10 上安装虚拟机
    SpringMVC AJAX向后台传递数组参数/实体集合
    解决eclipse中tomcat不加载web项目的问题
    Python 基础第九天
    Python 基础第8天(文件管理)
    Python 基础第七天
    Python 基础第六天
    Python 基础第五天
    Python 基础第四天
  • 原文地址:https://www.cnblogs.com/lqs-zsjky/p/4401029.html
Copyright © 2020-2023  润新知