匈牙利算法matlab源程序及实例(适合各种矩阵).txt资料文档下载
《匈牙利算法matlab源程序及实例(适合各种矩阵).txt资料文档下载》由会员分享,可在线阅读,更多相关《匈牙利算法matlab源程序及实例(适合各种矩阵).txt资料文档下载(5页珍藏版)》请在冰豆网上搜索。
P_size=length(P_cond)+cnum;
P_cond=ones(P_size)*Pmax;
P_cond(1:
exit_flag=1;
stepnum=1;
whileexit_flag
switchstepnum
case1
[P_cond,stepnum]=step1(P_cond);
case2
[r_cov,c_cov,M,stepnum]=step2(P_cond);
case3
[c_cov,stepnum]=step3(M,P_size);
case4
[M,r_cov,c_cov,Z_r,Z_c,stepnum]=step4(P_cond,r_cov,c_cov,M);
case5
[M,r_cov,c_cov,stepnum]=step5(M,Z_r,Z_c,r_cov,c_cov);
case6
[P_cond,stepnum]=step6(P_cond,r_cov,c_cov);
case7
exit_flag=0;
end
Matching(x_con,y_con)=M(1:
length(y_con));
Cost=sum(sum(a(Matching==1)));
function[P_cond,stepnum]=step1(P_cond)
P_size=length(P_cond);
forii=1:
P_size
rmin=min(P_cond(ii,:
));
P_cond(ii,:
)=P_cond(ii,:
)-rmin;
stepnum=2;
function[r_cov,c_cov,M,stepnum]=step2(P_cond)
r_cov=zeros(P_size,1);
c_cov=zeros(P_size,1);
M=zeros(P_size);
forjj=1:
ifP_cond(ii,jj)==0&
&
r_cov(ii)==0&
c_cov(jj)==0
M(ii,jj)=1;
r_cov(ii)=1;
c_cov(jj)=1;
end
%Avectorthatshowsifarowiscovered
%Avectorthatshowsifacolumniscovered
stepnum=3;
function[c_cov,stepnum]=step3(M,P_size)
c_cov=sum(M,1);
ifsum(c_cov)==P_size
stepnum=7;
else
stepnum=4;
function[M,r_cov,c_cov,Z_r,Z_c,stepnum]=step4(P_cond,r_cov,c_cov,M)
P_size=length(P_cond);
zflag=1;
whilezflag
row=0;
col=0;
exit_flag=1;
ii=1;
jj=1;
whileexit_flag
ifP_cond(ii,jj)==0&
row=ii;
col=jj;
exit_flag=0;
end
jj=jj+1;
ifjj>
P_size;
ii=ii+1;
end
ifii>
exit_flag=0;
ifrow==0
stepnum=6;
zflag=0;
Z_r=0;
Z_c=0;
else
M(row,col)=2;
ifsum(find(M(row,:
)==1))~=0
r_cov(row)=1;
zcol=find(M(row,:
)==1);
c_cov(zcol)=0;
else
stepnum=5;
zflag=0;
Z_r=row;
Z_c=col;
end
end
function[M,r_cov,c_cov,stepnum]=step5(M,Z_r,Z_c,r_cov,c_cov)
zflag=1;
ii=1;
whilezflag
rindex=find(M(:
Z_c(ii))==1);
ifrindex>
0
ii=ii+1;
Z_r(ii,1)=rindex;
Z_c(ii,1)=Z_c(ii-1);
else
zflag=0;
ifzflag==1;
cindex=find(M(Z_r(ii),:
)==2);
ii=ii+1;
Z_r(ii,1)=Z_r(ii-1);
Z_c(ii,1)=cindex;
end
forii=1:
length(Z_r)
ifM(Z_r(ii),Z_c(ii))==1
M(Z_r(ii),Z_c(ii))=0;
M(Z_r(ii),Z_c(ii))=1;
end
r_cov=r_cov.*0;
c_cov=c_cov.*0;
M(M==2)=0;
stepnum=3;
function[P_cond,stepnum]=step6(P_cond,r_cov,c_cov)
a=find(r_cov==0);
b=find(c_cov==0);
minval=min(min(P_cond(a,b)));
P_cond(find(r_cov==1),:
)=P_cond(find(r_cov==1),:
)+minval;
P_cond(:
find(c_cov==0))=P_cond(:
find(c_cov==0))-minval;
stepnum=4;
functioncnum=min_line_cover(Edge)
[r_cov,c_cov,M,stepnum]=step2(Edge);
[c_cov,stepnum]=step3(M,length(Edge));
[M,r_cov,c_cov,Z_r,Z_c,stepnum]=step4(Edge,r_cov,c_cov,M);
cnum=length(Edge)-sum(r_cov)-sum(c_cov);
��a=[0.94000.97000.86000.97000.96800.94800.96800.9800
0.86000.93000.92000.93000.96800.96800.98800.9600
0.90000.93000.94000.95000.90800.94800.96800.9600
0.94000.93000.94000.95000.96800.90800.98800.9200
0.86000.89000.92000.95000.98800.94800.96800.9200
0.92000.93000.92000.95000.90800.94800.98800.9200
0.94000.97000.90000.93000.96800.94800.96801.0000
0.92000.97000.92000.93000.98800.98800.94800.9600
0.94000.97000.90000.97000.96800.94800.94800.9600
0.92000.95000.92000.97000.94800.94800.94800.9800
];
��[z,ans]=Edmonds(a)
������
z=
00100000
10000000
00001000
00000100
01000000
00000001
00000000
00010000
00000010
ans=
7.2240