电工杯B题小代码分享

17 篇文章 2 订阅
9 篇文章 1 订阅

第一问的遍历所有地点的最短路径

 

代码一: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题第一问的代码,建议保存,以后求类似遍历所有地点的问题可以直接替换距离矩阵使用。


关注公众号,学习数学建模。 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

35℃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值