第一问的遍历所有地点的最短路径
代码一:Lingo
model:
n=14; %总共个点14 A=zeros(n,n);
for i=1:n
for j=1:n
if(i==j) A(i,j)=0;
else A(i,j)=100000;
end
end
end
A(1,5)=54;A(1,7)=55;A(1,11)=26;A(2,3)=56;A(2,5)=18;A(3,5)=44;A(4,6)=28;
A(5,6)=51;A(5,7)=34;A(5,8)=56;A(5,9)=48;A(6,9)=27;A(6,10)=42;A(7,8)=36;
A(7,12)=38;A(8,9)=29;A(8,12)=33;A(9,10)=61;A(9,12)=29;A(9,13)=42;A(9,14)=36;
A(10,14)=25;A(11,12)=24;A(13,14)=47;
for j=1:n
for i=1:j-1 A(j,i)=A(i,j); %使对称 end
end
[m,n]=size(A);
B=zeros(m,n);
B=A;
%利用 Floyd 算法计算最短距离矩阵 for k=1:n
for i=1 :n
for j=1:n
t=B(i,k)+B(k,j);
if t<B(i,j) B(i,j)=t; end
end
end
end
%输出距离矩阵 fid=fopen('distance.txt','w');
for i=1:n
for j=1:n
fprintf(fid,'%4d ',B(i,j));
end
fprintf(fid,'\n');
end
fclose(fid);
%初始数据%
D=[0 72 98 133 54 54 55 83 79 140 26 50 121 115
72 0 56 97 18 69 52 74 66 111 98 90 108 102
98 56 0 123 44 95 78 100 92 137 124 116 134 128
133 97 123 0 79 28 113 84 55 70 108 84 97 91
54 18 44 79 0 51 34 56 48 93 80 72 90 84
105 69 95 28 51 0 85 56 27 42 80 56 69 63
55 52 78 113 34 85 0 36 65 126 62 38 107 101
83 74 100 84 56 56 36 0 29 90 84 33 71 65
79 66 92 55 48 27 65 29 0 61 53 29 42 36
140 111 137 70 93 42 126 90 61 0 114 90 72 25
26 98 124 108 80 80 62 57 53 114 0 24 95 89
50 90 116 84 72 56 38 33 29 90 24 0 71 65
121 108 134 97 90 69 107 71 42 72 95 71 0 47
115 102 128 91 84 63 101 65 36 25 89 65 47 0];
L=size(D,1); %求出有几行即有几个城市D c=[9 1 2 3 4 5:6 7 8 10 11 12 13 14 9]; %选择初始圈 %改良圈%
for k=1:L
flag=0; %退出标志 for i=1:L-2
for j=i+2:L
if D(c(i),c(j))+D(c(i+1),c(j+1))<D(c(i),c(i+1))+D(c(j),c(j+1))
c(i+1:j)=c(j:-1:i+1); %替换圈原本的路径 flag=flag+1;
end %即i+1-之间的访问顺序没变j end
end
if flag==0
long=0;
for n=1:L
long =long+D(c(n),c(n+1));
end
circle=c;
break; end
end end
代码二:MATLAB
function [xl,l]=ljpj(d,q,zx) %dqzx %q
if length(q(:,1))>1
q=q';
end
k=length(q); %qzx
for i=1:k
if q(i)==zx
q(i:k-1)=q(i+1:k);
k=k-1;
end
end
q=q(1:k);%
y=zx;
for j=1:k
sum0=inf; %zu for i=1:k-j+1
if d(y,q(i))<sum0
sum0=d(y,q(i));
z=i;
end
end
u(j)=q(z);
y=q(z); %qu
for i=1:k-j+1
if i==z
if i==1
q=q(2:end);
else
q=[q(1:i-1) q(i+1:end)];
end
end
end
end % xl=[zx u zx]';
i=1;
while xl(i+1)==zx xl=xl(2:end);
end
l=0;
for i=1:length(xl)-1 l=l+d(xl(i),xl(i+1));
end
上述两种求解电工杯B题第一问的代码,建议保存,以后求类似遍历所有地点的问题可以直接替换距离矩阵使用。
关注公众号,学习数学建模。