2000B题钢管订购和运输

问题一 

function [D,path] =f1oyd(a)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
n=size(a,1);
D= a; path = zeros (n,n);
for i=1 :n
    for j=1:n
        if D(i,j) ~=inf
            path(i,j)=j;
        end
    end    
end
for k=1 :n
    for i=1:n
        for j=1:n
            if D(i,k) +D(k,j)<D(i,j)
                D(i,j)=D(i,k)+D(k,j) ;
                path(i,j)=path(i,k) ;
            end
        end
    end
end
% 距离转换为费用的程序
D1=D1*0.1;
%把公路最短距离换算成公路最少费用
for k=1 :300.
    m1 (k)={k} ;
end
for k=1 :50
    m2 (k)={300+k} ;
    m3 (k)={350+k} ;
    m4 (k)={400+k} ;
    m5 (k)={450+k} ;
end
for k=1 :100
    m6 (k)={500+k} ;
    m7 (k)={600+k} ;
    m8 (k)={700+k} ;
    m9 (k)={800+k} ;
    m0 (k)={900+k} ;
end
for i=1 :24.
    for j=1:24 %把铁路最短距离换算成铁路最少费用
        switch D (i,j)
            case 0
               D (i,j)=0;
            case m1
               D (i,j)=20;
            case m2
               D (i,j)=23;
            case m3
               D (i,j)=26;
            case m4
               D (i,j)=29;
            case m5
               D (i,j)=32;
            case m6
               D(i,j)=37;
            case m7
               D(i, j)=44 ;
            case m8
               D(i,j)=50;
            case m9
               D(i,j)=55 ;
            case m0
               D(i,j)=60 ;
            otherwise
              D(i,j)=((D(i,j)-1000) /100) *5+60;
        end
   end
end

%c矩阵表示七个钢管生产厂到十五个铺设节点之间的距离,先把它们都设成20000(任意一个钢管厂到任意一个铺设节点之间的距离不会超过20000),然后用for循环求出最小值 

c = 20000*ones(7,15);
for i=1:7 %7个钢管生产厂
    for k=18:32 %15个铺设节点
        for j=8:24 %各7个钢管生产厂和17,个中转点,i=1,表示第一个钢管生产厂,j=8,表示第一个中转点
            if c(i,k-17)>D(i,j) + D1(j-7,k)
                  c(i,k-17) = D(i,j) + D1(j-7,k);
%对于所有中转点,在铁路网和公路网上的下标相差8
            end
        end
    end
end
for i=1:7
    for k=18:32
        if c(i,k-17)>D(i,1)+D1 (33,k)
              c(i,k-17)=D(i,1)+D1 (33,k) ;
%33代表第一个钢管生产厂s1点
        end
        if c(i,k-17)>D(i,6)+D1 (34,k)
              c(i,k-17)= D(i, 6)+  D1(34,k) ;
%34代表第六个钢管生产厂S6点
        end
        if c(i,k-17)>D(i,7) + D1(35,k)
              c(i,k-17) = D(i,7) + D1(35,k) ;
%35代表第七个钢管生产厂S7点
        end
    end
%因为S1,S6,S7这三个钢管厂有公路直接连接到铺设节点,所以把这三个点单独处理.
end
D2=D2*0.1; %把公路最短距离换算成公路最少费用
for k=1 :300.
    m1 (k)={k} ;
end
for k=1 :50
    m2 (k)={300+k} ;
    m3 (k)={350+k} ;
    m4 (k)={400+k} ;
    m5 (k)={450+k} ;
end
for k=1 :100
    m6 (k)={500+k} ;
    m7 (k)={600+k} ;
    m8 (k)={700+k} ;
    m9 (k)={800+k} ;
    m0 (k)={900+k} ;
end
for i=1 :24.
    for j=1:24 %把铁路最短距离换算成铁路最少费用
        switch D(i,j)
            case 0
               D(i,j)=0;
            case m1
               D(i,j)=20;
            case m2
               D(i,j)=23;
            case m3
               D (i,j)=26;
            case m4
               D(i,j)=29;
            case m5
               D(i,j)=32;
            case m6
               D(i,j)=37;
            case m7
               D(i,j)=44 ;
            case m8
               D(i,j)=50;
            case m9
               D(i,j)=55 ;
            case m0
               D(i,j)=60 ;
            otherwise
              D(i,j)=((D(i,j)-1000) /100) *5+60;
        end
   end
end
h = 20000*ones(7,21);
for i=1:7 %7个钢管生产厂
    for k=18:38 %21个铺设节点
        for j=8:24 %各7个钢管生产厂和17个中转点,i=1,表示第一个钢管生产厂,j=8,表示第一个中转点
            if ( k~=33&&k~=34&&k~=35 &&h(i,k-17)>D(i,j)+D2(j-7,k))
                  h(i,k-17) = D(i,j) + D2(j-7,k);
%对于所有中转点,在铁路网和公路网上的下标相差8
            end
        end
    end
end
for i=1:7
    for k=18:38
        if h(i,k-17)>D(i,1) + D2(33,k)
              h(i,k-17)=D(i,1) + D2(33,k) ;
%33代表第一个钢管生产厂s1点
        end
        if h(i,k-17)>D(i,6) + D2(34,k)
              h(i,k-17)= D(i,6) + D2(34,k) ;
%34代表第六个钢管生产厂S6点
        end
        if h(i,k-17)>D(i,7) + D2(35,k)
              h(i,k-17) = D(i,7) + D2(35,k) ;
%35代表第七个钢管生产厂S7点
        end
    end
%因为S1,S6,S7这三个钢管厂有公路直接连接到铺设节点,所以把这三个点单独处理.
end
ab=[1 1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 20 22 23];
bb=[14 15 15 16 19 18 23 24 10 10 11 15 13 14 16 17 19 19 20 21 22 23 24];
w=[20 202 1200 690 690 462 70 30 450 80 1150 1100 306 195 720 520 170 88 160 70 320 160 290];
% ab1=[1 2 4 5 6 7 8 9 10 11 14 15 16 17 18 33 34 35];
% bb1=[19 20 21 22 23 24 25 26 27 28 29 30 31 32 19 24 31 32];

ab1=[1 2 21 22 23 7 25 26 27 28 29 30 16 17 19 33 34 35];
bb1=[19 20 4 5 6 24 8 9 10 11 14 15 31 32 18 24 31 32];
w1= [3 2 600 10 5 10 12 42 70 10 10 62 30 20 104 31 110 20];

ab2=[1 2 4 5 6 7 8 9 10 11 14 15 16 17 18 24 31 32 34 36 36 38];
bb2=[19 20 21 22 23 24 25 26 27 28 29 30 31 31 19 33 34 35 39 37 38 39];
w2=[3 2 600 10 5 10 12 42 70 10 10 62 30 20 104 31 110 20 100 130 190 260]; 

a=sparse(ab,bb,w);
a(24,24)=0;
a=a+a';
a= full(a);
for i=1:24
    for j=1:24
        if(a(i,j)==0&i~=j)
               a(i,j)=inf;
        end
    end
end
[D,path]=f1oyd(a);

a1 = sparse(ab1,bb1,w1);
a1(35,35)=0;
a1=a1 +(a1)';
a1 = full(a1); 
for i=1:35
    for j=1:35
        if(a1(i,j)==0&i~=j)
               a1(i,j)=inf;
        end
    end
end
[D1,path1]=f1oyd(a1);

a2 = sparse(ab2,bb2,w2);
a2(39,39)=0;
a2=a2 +(a2)';
a2 = full(a2); 
for i=1:39
    for j=1:39
        if(a2(i,j)==0&i~=j)
               a2(i,j)=inf;
        end
    end
end
for i=17:20
    a2(i,j+19) = 0;
    a2(i+19,j) = 0;
end
a2(21,34) = 0;
a2(34,21) = 0;
[D2,path2]=f1oyd(a2);

 问题三

%h矩阵表示七个钢管生产厂到21个铺设节点之间的距离,先把它们都设成2000o(任意一个钢管厂到任意一个铺设节点之间的距离不会超过20000),然后用for 循环求出最小值 

h = 20000*ones(7,21);
for i=1:7
   m=1;
   for k=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,24,27,28,29,30,34 ]
      for j=8:24
         if h(i,m)>D(i,j) +D2 (k,j+8)
            h(i,m)=D(i,j)+D2 (k,j+8) ;
         end
      end
      m=m+1 ;
   end
end
for i=1:7
    m=1 ;
    for k= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,24,27,28,29,30,34]
       if h(i,m)>D(i,1) + D2(k,33)
          h(i,m)=D(i,1) + D2(k,33) ;
       end
          if h(i,m)>D(i,6) + D2(k,34)
             h(i,m)=D(i,6) + D2(k,34) ;
          end
          if h(i,m)>D(i,7) + D2(k,35)
             h(i,m)=D(i,7) + D2(k,35) ;
          end
          m = m+1 ;
    end
end

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值