中国邮递员问题matlab

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

%中国邮递员问题:

%step1;

%求出奇点之间的距离;

%求各个点之间的最短距离;

%floyd算法;

clear all;

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);

for k=1:m

for i=1:m

for j=1:m

if c(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);

if isempty(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;

while exit_flag

switch stepnum

case 1

[P_cond,stepnum] = step1(P_cond);

case 2

[r_cov,c_cov,M,stepnum] = step2(P_cond);

case 3

[c_cov,stepnum] = step3(M,P_size);

case 4

[M,r_cov,c_cov,Z_r,Z_c,stepnum] = step4(P_cond,r_cov,c_cov,M);

case 5

[M,r_cov,c_cov,stepnum] = step5(M,Z_r,Z_c,r_cov,c_cov);

case 6

[P_cond,stepnum] = step6(P_cond,r_cov,c_cov);

case 7

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);

for ii = 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);

for ii = 1:P_size

for jj = 1:P_size

if P_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);

if sum(c_cov) == P_size

stepnum = 7;

else

stepnum = 4;

end

%步骤4:找一个未被覆盖的0且从这出发点搜寻星型0覆盖。如果不存在,转步骤5,否%

相关文档
最新文档