中国邮递员问题.docx
- 文档编号:9568994
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:9
- 大小:15.78KB
中国邮递员问题.docx
《中国邮递员问题.docx》由会员分享,可在线阅读,更多相关《中国邮递员问题.docx(9页珍藏版)》请在冰豆网上搜索。
中国邮递员问题
%中国邮递员问题
%中国邮递员问题:
%step1;
%求出奇点之间的距离;
%求各个点之间的最短距离;
%floyd算法;
clearall;
clc;
A=zeros(9);
A(1,2)=3;A(1,4)=1;A(2,4)=7;A(2,5)=4;A(2,6)=9;A(2,3)=2;
A(3,6)=2;
A(4,7)=2;A(4,8)=3;A(4,5)=5;
A(5,6)=8;
A(6,9)=1;A(6,8)=6;A(7,8)=2;
A(8,9)=2;
c=A+A';
c(find(c==0))=inf;m=length(c);
Path=zeros(m);
fork=1:
m
fori=1:
m
forj=1:
m
ifc(i,j)>c(i,k)+c(k,j)
c(i,j)=c(i,k)+c(k,j);
Path(i,j)=k;
end
end
end
end
c,Path
h1=c(2,4);
h2=c(2,6);
h3=c(2,5);
h4=c(4,6);
h5=c(4,5);
h6=c(6,5);
h=[h1,h2,h3,h4,h5,h6]
%step2;
%找出以奇点为顶点的完全图的最优匹配;
%算法函数Hung_Al.m
function[Matching,Cost]=Hung_Al(Matrix)
Matching=zeros(size(Matrix));
%找出每行和每列相邻的点数
num_y=sum(~isinf(Matrix),1);
num_x=sum(~isinf(Matrix),2);
%找出每行和每列的孤立点数
x_con=find(num_x~=0);
y_con=find(num_y~=0);
%将矩阵压缩、重组
P_size=max(length(x_con),length(y_con));
P_cond=zeros(P_size);
P_cond(1:
length(x_con),1:
length(y_con))=Matrix(x_con,y_con);
ifisempty(P_cond)
Cost=0;
return
end
%确保存在完美匹配,计算矩阵边集
Edge=P_cond;
Edge(P_cond~=Inf)=0;
cnum=min_line_cover(Edge);
Pmax=max(max(P_cond(P_cond~=Inf)));
P_size=length(P_cond)+cnum;
P_cond=ones(P_size)*Pmax;
P_cond(1:
length(x_con),1:
length(y_con))=Matrix(x_con,y_con);
%主函数程序,此处将每个步骤用switch命令进行控制调用步骤函数
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
end
Matching(x_con,y_con)=M(1:
length(x_con),1:
length(y_con));
Cost=sum(sum(Matrix(Matching==1)));%下面是6个步骤函数step1~step6
%步骤1:
找到包含0最多的行,从该行减去最小值
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;
end
stepnum=2;
%步骤2:
在P-cond中找一个0,并找出一个以该数0为星型的覆盖function[r_cov,c_cov,M,stepnum]=step2(P_cond)
%定义变量r-cov,c-cov分别表示行或列是否被覆盖
P_size=length(P_cond);
r_cov=zeros(P_size,1);
c_cov=zeros(P_size,1);
M=zeros(P_size);
forii=1:
P_size
forjj=1:
P_size
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
end
end
%重初始化变量
r_cov=zeros(P_size,1);
c_cov=zeros(P_size,1);
stepnum=3;
%步骤3:
每列都用一个0构成的星型覆盖,如果每列都存在这样的覆盖,则M为最大匹配function[c_cov,stepnum]=step3(M,P_size)
c_cov=sum(M,1);
ifsum(c_cov)==P_size
stepnum=7;
else
stepnum=4;
end
%步骤4:
找一个未被覆盖的0且从这出发点搜寻星型0覆盖。
如果不存在,转步骤5,否%
则转步骤6
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&&r_cov(ii)==0&&c_cov(jj)==0
row=ii;
col=jj;
exit_flag=0;
end
jj=jj+1;
ifjj>P_size;jj=1;ii=ii+1;end
ifii>P_size;exit_flag=0;end
end
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
end
%步骤5:
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;
end
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
end
forii=1:
length(Z_r)
ifM(Z_r(ii),Z_c(ii))==1
M(Z_r(ii),Z_c(ii))=0;
else
M(Z_r(ii),Z_c(ii))=1;
end
end
r_cov=r_cov.*0;
c_cov=c_cov.*0;
M(M==2)=0;
stepnum=3;
%步骤6:
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);
%主程序;
clc;
clearall;
a=zeros(4);
a(1,2)=4;a(1,3)=4;a(1,4)=4;a(2,3)=5;a(2,4)=6
a(3,4)=8;
a=a+a';
a(find(a==0))=inf;
[M,cost]=Hung_Al(a)%step3;
%用Fleury方法求出其欧拉回路即为所求的最佳邮差回路。
%Fleury;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国 邮递员 问题