二分图最大匹配算法的应用及Matlab实现+++

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一共有RecuCal.m LockMap.m BuildMatrix.m Edmonds.m GUI1.m 这几个文件,我把它们合到一块粘上去了,你再把他们分开保存就可以了.

其中前三个文件都是为建立邻接矩阵服务的,Edmonds.m是匈牙利算法的主文件,GUI1.m只是调用Edmonds.m做个界面而已。

调用关系是GUI1.m调用Edmonds.m;Edmonds.m调用BuildMatrix.m和LockMap.m ;LockMap.m调用RecuCal.m

最后运行GUI1.m就ok了

#LockMap.m

function [LMA, LMB] = LockMap(n, m)

% LOCKMAP - 求解满足条件锁并设置相应的映射

% 输入参数:n 表槽数,m 表高度数。

% 输出参数:LMA,LMB 分别为二维矩阵表示自然数到满足条件锁之间的映射。

global jiA ouB ary A B mm N

N = n; mm = m;

jiA=0; ouB=0;

A=[]; B=[];

ary = zeros(1, n);

RecuCal(n);

LMA=A; LMB=B;

[lena, n] = size(LMA);

[lenb, n] =size(LMB);

if lena>lenb

temp = LMA; LMA=LMB;LMB=temp;

temp = lena;lena=lenb;lenb=temp;

end

#RecuCal.m

function RecuCal(n)

% RECUCAL - 递归函数

global jiA ouB ary A B mm N

if n ==1

for k=1:mm

% 调用递归函数时要用到的变量所以

% 设为全局

ary(1) = k;

Max = max(ary); Min = min(ary);

num = 0; neighbor = 0;

for i=1:N

num = num + (Max-ary(i))*(ary(i)-Min);

if (i~=N)

neighbor = max(neighbor, abs(ary(i)-ary(i+1)));

end

end

if (neighbor > mm-1.5)&&(num > 0.5)

if mod(sum(ary), 2)

% 奇数,属于 A 类

jiA = jiA+1;

A(jiA,:) = ary;

else

% 偶数,属于 B 类

ouB = ouB+1;

B(ouB,:) = ary;

end

end

end

else

for k=1:mm

ary(n) = k;

RecuCal(n-1);

end

end

#BuildMatrix.m

function AB = BuildMatrix(LMA, LMB)

% BUILDMATRIX - 建立邻接矩阵,若 i 与 j 之间可以互开则 AB(i,j)=1,否则为0。AB = [];

[lena, n] = size(LMA);

[lenb, n] =size(LMB);

for i = 1:lena

for j=1:lenb

tmp = 0;

for k=1:n

tmp = tmp + abs(LMA(i,k)-LMB(j,k));

end

if tmp == 1

AB(i, j)=1;

end

end

end

#Edmonds.m

function str = Edmonds(n, m)

% EDMONDS - Edmonds 算法寻找完美匹配

str = [];

[LMA, LMB] = LockMap(n, m);

AB = BuildMatrix(LMA, LMB);

lena = length(LMA);

lenb = length(LMB);

if lena==0

disp('其中一个分组为空,

无法匹配'); %当 n=m=3 时只有偶数组无奇数组,不能完成

匹配

return;

end

MatA = zeros(1, lena);

MatB = zeros(1, lenb);

X = MatA; Y=MatB; Z=Y;

NumNoMat = 0;

% 无法匹配的点的个数

% 最初匹配,只有一个匹配

j = find(AB(1,:), 1);

MatA(1)=j; MatB(j)=1;

while length(find(MatA==0)) ~= 0

% 存在不匹配的元素

J = find(MatA==0); i = J(1);

% 第 i 个元素未被匹配

init = i; X(i)=0;

J = find(AB(i,:));

% J 为所有与 i 相邻结点

Y(J) = i; j=J(1);

while ~isempty(find(Y~=Z))

if MatB(j) ~= 0

% j 是匹配点

Z(j) = Y(j);

i = MatB(j);

X(i)=j;

J = find(AB(i,:));

Y(J)=i;

J = find(Y);

JJ = find(Z);

相关文档
最新文档