简单的稳定婚姻匹配

一、相关的定义

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

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

时间: 2024-10-10 09:18:26

简单的稳定婚姻匹配的相关文章

HDU 1522 Marriage is Stable 【稳定婚姻匹配】(模板题)

<题目链接> 题目大意: 给你N个男生和N个女生,并且给出所有男生和女生对其它所有异性的喜欢程度,喜欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配. 解题分析: 稳定婚姻问题的模板题,需要用到Gale_Shapley算法,GS算法讲解  >>> 这个算法还是很直观的. 1 #include <iostream> 2 #include <cstring> 3 #include <stack> 4 #include <stri

(算法)稳定婚姻匹配

题目: 婚介所登记了N位男孩和N位女孩,每个男孩都对N个女孩的喜欢程度做了排序,每个女孩都对N个男孩的喜欢程度做了排序,你作为月老,能否给出稳定的牵手方案? 稳定的定义:如果男孩i和女孩a牵手,但男孩i对女孩b更喜欢,而女孩b的男朋友j拼不过男孩i,则没有力量阻碍男孩i和女孩b的私奔,这即是不稳定的. 思路: 1962 年,美国数学家 David Gale 和 Lloyd Shapley 发明了一种寻找稳定婚姻的策略.不管男女各有多少人,不管他们各自的偏好如何,应用这种策略后总能得到一个稳定的婚

HDU1914 稳定婚姻匹配

The Stable Marriage Problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 758    Accepted Submission(s): 389 Problem Description The stable marriage problem consists of matching members of two

稳定婚姻匹配问题

一.问题 有N男N女,每个人都按照他对异性的喜欢程度排名.现在需要写出一个算法安排这N个男的.N个女的结婚,要求两个人的婚姻应该是稳定的. 何为稳定? 有两对夫妻M1 F2,M2 F1.M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻是不稳定的, 随时都可能发生M1和F1私奔或者M2和F2私奔的情况.所以在做出匹配选择的时候(也就是结婚的时候),我们需要做出稳定的选择,以防这种情况的发生. 二.算法步骤描述: 第一轮,每个男人都选择自己名

稳定婚姻问题和Gale-Shapley算法(转)

什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在每个女孩儿心中的排名,你应该怎样为他们牵线配对呢? 最好的配对方案当然是,每个人的另一半正好都是自己的“第一选择”.这虽然很完美,但绝大多数情况下都不可能实现.比方说,男1号最喜欢的是女1号,而女1号的最爱不是男1号,这两个人的最佳选择就不可能被同时满足.如果好几个男孩儿最喜欢的都是同一个女孩儿,这

UVALive 3989Ladies&#39; Choice(稳定婚姻问题)

题目链接 题意:n个男生和女生,先是n行n个数,表示每一个女生对男生的好感值排序,然后是n行n列式每一个男生的好感值排序,输出N行,即每个女生在最好情况下的男生的编号 分析:如果是求女生的最好情况下,就要从女生开始选,这样女生都是从最好的到不好的来选,而男生却相反--只能娶那些自己有可能最没好感的女生,因为男生是被动的,他最喜欢的女生不见的会向他求婚. 刘汝佳书上命名错了,so也跟着把男生当成女生了,懒得改命名了, 1 #include <iostream> 2 #include <cs

BZOJ2140: 稳定婚姻

题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v],那么说明v到u有通路,我们把v-u的路以及u-v这条边全部反色,也就是匹配->非匹配,非匹配->匹配.同样还是最大匹配.这说明该边是可行的. 如果该边满流&&scc[u]!=scc[v],那么该边是必须边. 因为如果去掉这条边,最大匹配会减少1(想想看),所以该边必须出现在最大

UVA 1175 - Ladies&#39; Choice(稳定婚姻问题)

UVA 1175 - Ladies' Choice 题目链接 题意:给定n个男人,n个女人,每个人心中对异性都有一个排序,从左往右是最喜欢到最不喜欢,然后现在要求一个稳定匹配,使得n对男女中,不存在男人对其他女人好感度大于配偶且女人对其他男人好感度大于配偶 思路:稳定婚姻问题,算法过程如下: 男人不断求婚,从最喜欢到最不喜欢,女人每次在求婚人中,选择一个最喜欢的配对,然后抛弃现在的配对,这个过程可以用一个队列存放求婚男人,这样直到队列为空,也就匹配完毕了 代码: #include <cstdio

UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完备匹配,则称这是一个稳定匹配. 稳定匹配一定存在,且存在一个\(O(n^2)\)的算法: 任选一个未匹配的男生x,按x的喜爱程度从大到小枚举每个女生,若当前女生没有配偶或喜欢x胜过喜欢当前配偶,则与x匹配.直到所有男生都匹配. 这一题我们用行表示男生,n个数表示女生.喜爱程度为:行更喜欢靠前的数,数