当前位置:文档之家› 匹配问题与匈牙利算法和较大基数匹配

匹配问题与匈牙利算法和较大基数匹配


3.3 较大基数匹配算法
对于图 G,求其较大基数匹配算法的基本步骤为: 1. 任意取得图 G 中一边,将其存入匹配 M 中; 2. 从图 G 中将与匹配 M 中的每一条边相邻的所有边删除; 3. 直到所剩子图全为孤立顶点,算法结束;否则,转 1 编程对其进行实现,代码如下: (其中,M 表示图 G 的邻接矩阵,S 表示匹配 结束时所有顶点之间的邻接矩阵)
3.1 婚配问题
婚配问题可以说是一个相对经典的图论匹配算法的入门问题。 假设对于 n 个男人的集合和 n 个女人的集合。 在男人女人进行匹配的情况下, 就会产生一个如何进行完美匹配的问题。在这个问题背景下,进一步加入优先的 概念:根据实际情况,每个男人 m 将对所有女人进行排名,如果 m 给 w 的排名高 于, 那么我们就说 m 偏爱 w 超过,因此我们将把 m 的按顺序的排名作为他的优先 表。 依照常理来看, 每个男人都会按照自己的优先表顺序从高向低依次进行求婚, 直到被接受为止。 那么,接下来本文将讨论如何生成一个稳定的完美匹配。 Gale 和 Shapley 两人根据自己对申请人-雇主之间关系的研究,提出了 Gale-Shapley 算法,具体算法描述如下: 初始所有的 while 存在男人 m 是自由的且还没对每个女人都求过婚 选择这样的一个男人 m 令 w 为 m 的优先表中还没有求过婚的最高排名的女人 if w 是自由的 (m,w)变为约会状态 else w 当前与约会 if w 是更加偏爱而不爱 m m 保持自由 else w 更加偏爱 m 而不爱 (m,w)变为约会状态 变为自由 end end end 输出约会状态的所有匹配集合 S 分析 Gale-Shapley 算法,可以得到以下结论: 结论 1: G-S 算法至多在次 while 循环的迭代之后终止; 结论 2: 程序终止时返回的集合 S 为一个完美匹配; 结论 3: 考虑 G-S 算法的一次执行, 结果为一个集合 S, 且 S 是一个稳定匹配; 结论 4: G-S 算法的每次执行最终得到的匹配集合是相同的; 结论 5: 稳定匹配集合 S 中,每个女人与她最差(即排名最低)的有效伴侣
n=size(M,1);%这里 M 表示邻接矩阵 S=zeros(n,n);%S 为程序的输出结果,这里 S 表示较大基数的匹配矩阵 while sum(sum(M))~=0 a=find(M~=0); t1=mod(a(1),n); if t1==0 t1=n; end if a(1)/n>floor(a(1)/n) t2=floor(a(1)/n)+1; else t2=floor(a(1)/n); end S(t1,t2)=1; S(t2,t1)=1;
7/7
3/7
图论-浅谈匹配问题
end end if(M(i,j)) break; end end while(1) for(i=1:m) x(i)=0; end for(i=1:n) y(i)=0; end for(i=1:m) pd=1; for(j=1:n) if(M(i,j)) pd=0; end end if(pd)x(i)=-n-1; end end pd=0; while(1) xi=0; for(i=1:m) if(x(i)<0) xi=i; break; end end if(xi==0) pd=1; break; end x(xi)=x(xi)*(-1); k=1; for(j=1:n) if(A(xi,j)&y(j)==0) y(j)=xi; yy(k)=j; k=k+1; end
6/7
图论-浅谈匹配问题
M(t1,:)=0; M(t2,:)=0; M(:,t1)=0; M(:,t2)=0; end S
同样举例说明其运行过程:
例: 假设图G=(X,Y),其中X、Y的邻接矩阵A为: 0 1 1 0 0 1 0 0 1 1 A = 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 则利用上述代码,进行较大基数匹配可以得到最终的匹配结果S: 0 1 0 0 0 1 0 0 0 0 S = 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
2/7
图论-浅谈匹配问题
匹配。 由结论 5, 在 G-S 算法中,主动进行求婚的一方以最佳可能的稳定匹配结束, 而另一方则以最差可能的稳定匹配结束。
3.2 匈牙利算法
二分图的匹配问题是图的最大匹配问题的特殊类型。对于一个二分图G= (X,Y,E) ,我们可以利用匈牙利算法对其进行最大匹配。其基本的思想为:从G 的任意匹配M开始,对X中所有M的非饱和点,寻找M-增广路。 若不存在M-增广路, 则M为其最大匹配;若存在M-增广路P,则将P中M与非M的边互换得到比M多一边的 匹配,再对重复上述过程。 匈牙利算法具体的运行过程为: 输入:G 的一个初始匹配 M 输出:满足要求的最大匹配 任意给出 G 的一个初始匹配 M if M 饱和了 X 中的所有节点 则 M 是 G 的一个完全匹配 else 找出 X 中的非饱和点 x,令 A={x},B={}; 考察 A 的邻接点 if N(A)=B 计算结束 else 在 Y 中找出一点 y 属于 N(A)-B if y 为 M 的饱和点 在 X 中找出 y 的配对点 z,令,B=B,转 6; else 存在一条从 x 到 y 的可扩路 P,故 M 不是 G 的最大匹配 end end end 令 M=M+E(P),转 2。
4.结束语
本文中仅仅讨论了图论中几个比较典型的算法,其中,婚配问题可以称之为 图论匹配算法的入门问题; 匈牙利算法则可以用来解决众多需要进行最大匹配的 实际问题,例如申请人与雇主之间的匹配、某些指派问题等。由于时间紧促,因 此并没有列出更多的算法, 只是将目前已经熟悉掌握述运行过程,利用matlab可以很方便的进行算法的实现,程序代码 如下: (其中A为X与Y的邻接矩阵,M为X与Y之间的匹配,m为X中顶点个数,n 为Y中顶点个数,最终的最大匹配结果为矩阵M)
m= n= ; ;
M(m,n)=0; for(i=1:m) for(j=1:n) if(A(i,j)) M(i,j)=1; break;
4/7
图论-浅谈匹配问题
end if(k>1) k=k-1; for(j=1:k) pdd=1; for(i=1:m) if(M(i,yy(j))) x(i)=-yy(j); pdd=0; break; end end if(pdd) break; end; end if(pdd) k=1; j=yy(j); while(1) P(k,2)=j; P(k,1)=y(j); j=abs(x(y(j))); if(j==n+1) break; end k=k+1; end for(i=1:k) if(M(P(i,1),P(i,2))) M(P(i,1),P(i,2))=0; else M(P(i,1),P(i,2))=1; end end break; end end end if(pd) break; end end M;
图论-浅谈匹配问题
1.匹配问题的起源
匹配理论起源于组合数学中著名的婚配问题:若在一个团体中有若干待婚的 小伙子和姑娘,所有人都已到结婚年龄,若没有其他条件的限制,为了满足姑娘 的愿望, 唯一的必备条件就是小伙子的人数至少和姑娘的人数一样多。但是在事 实上,所有人都不会草率地处理自己的终身大事,以姑娘为例(与小伙子的情况 是完全相同的) ,每个姑娘往往会排除一些小伙子作为她们可能的配偶,也即每 个姑娘都会有一个有序的可接受的配偶名单。那么会有一个问题出现:在这个团 体中是否每个姑娘都可以嫁给自己认可的小伙子? 显然,上述问题并非是永远可以的,因为或许有几个姑娘手头上的名单是完 全一样的。 而既然上述问题并非永远可行,那么什么条件下可以满足上述要求? 在并满足这些条件的时候,最多会有几位姑娘可以实现自己的愿望?如何配对, 才能使得最终的团体中婚后的家庭更为美满? 为了解决诸如此类的问题,人们发展得到了一种匹配理论和诸多有效算法。
2.图论相关知识
若图 G 的所有顶点能够分为两个非空子集 X 和Y,并且每条边都有一个顶点 在X中,而另一个顶点在 Y 中,则称此图是二分图或者偶图;而如果 X 的每个顶 点都与 Y 的每个顶点相连,则称此图为完全二分图或者完全偶图。 设 M 是图 G=(V,E)的边集 E 的子集,如果 M 的任何两边都不邻接,则称 M 为 G 的一个匹配; 匹配 M 中边元素个数称为此匹配的基数,而在匹配 M 中边的端 点称为 M-饱和点,其他的端点称为 M-未饱和点。 若 G 中的每个顶点都是 M-饱和点, 也即匹配 M 将 G 中的所有顶点进行了配对, 那么称 M 为 G 的完美匹配;而在图 G 中不存在另一个匹配,使得>,则称 M 为最 大匹配,其中称为图 G 的匹配数。 设 M 是 G 的一个匹配, G 的 M 交错路是指其边在 E\M 和 M 中交错出现的路。M 可扩路是指其起点和终点都是 M 未饱和的 M 交错路。 以下结论是在二分图中寻找最大匹配和最佳匹配算法的理论基础: 定理 1: G 的匹配 M 是最大匹配当且仅当 G 不包含 M 可扩路。 定理 2: 设 X,Y 为二分图 G 的二分类,则 G 包含饱和 X 的每个顶点的匹配当 且仅当 其中为 G 中 S 的临集,即为与 S 的顶点相邻的所有顶点的集合。 定理 3: G 有完美匹配当且仅当 其中,为图 G 的奇分支(图的分支根据它有奇数或者偶数个顶点而分别 称为奇分支或偶分支)的个数。
1/7
图论-浅谈匹配问题
3.几个典型的匹配算法
由于刚接触到图论知识,碍于在图论方面能力有限,因此本文在本节中选择 性地介绍了三个图论匹配问题中比较经典的算法:婚配问题的 Gale-Shapley 算 法、 最大匹配的匈牙利算法和图论中的较大基数匹配算法,并且对匈牙利算法和 较大基数匹配算法进行了 matlab 代码实现。
5/7
图论-浅谈匹配问题
相关主题