当前位置:   article > 正文

最短路+最小费用+线性规划(钢管订购和运输问题)_钢管运输问题数学建模matlab

钢管运输问题数学建模matlab

钢管订购和运输问题题目详情:

 分析:解决本题首先计算运输一单位钢管的费用(最短路),再根据题目的约束条件求得钢管量(0-1规划)。

符号说明:

 

1.求最小运费

(1)构造铁路任意两点间的最小运输费用赋权图

        首先用Floyd算法构造铁路距离赋权图,接着计算两点间最短铁路距离值,再根据题目给出的铁路运价表,得到任意两点间的最小铁路费用。构造铁路距离矩阵c1(matlab代码如下:)

  1. %w为铁路距离矩阵,c1为铁路费用矩阵
  2. w=zeros(39,39);c=zeros(39,39);c2=zeros(39,39);
  3. w(1,29)=20;w(1,30)=202;w(2,30)=1200;w(3,31)=690;w(4,34)=690;w(5,33)=462;
  4. w(6,38)=70;w(7,39)=30;w(23,25)=450;w(24,25)=80;w(25,27)=1150;
  5. w(26,28)=306;w(27,30)=1100;w(28,29)=195;w(30,31)=720;w(31,32)=520;
  6. w(32,34)=170;w(33,34)=88;w(34,36)=160;w(35,36)=70;w(36,37)=320;
  7. w(37,38)=160;w(38,39)=290;
  8. w=w+w';%构造铁路距离邻接矩阵
  9. for i=1:39
  10. for j=1:39
  11. if(i~=j)&& w(i,j)==0
  12. w(i,j)=200000000;%无铁路连接时,元素为充分大的数
  13. end
  14. end
  15. end
  16. for k=1:39
  17. for i=1:39
  18. for j=1:39
  19. if w(i,j)>w(i,k)+w(k,j)
  20. w(i,j)=w(i,k)+w(k,j);%求最短路径
  21. end
  22. end
  23. end
  24. end
  25. c1=w;
  26. for i=1:39
  27. for j=1:39
  28. if c1(i,j)==0
  29. c1(i,j)=0;
  30. end
  31. if c1(i,j)>0 && c1(i,j)<=300
  32. c1(i,j)=20;
  33. end
  34. if c1(i,j)>300 && c1(i,j)<=350
  35. c1(i,j)=23;
  36. end
  37. if c1(i,j)>350 && c1(i,j)<=400
  38. c1(i,j)=26;
  39. end
  40. if c1(i,j)>400 && c1(i,j)<=450
  41. c1(i,j)=29;
  42. end
  43. if c1(i,j)>450 && c1(i,j)<=500
  44. c1(i,j)=32;
  45. end
  46. if c1(i,j)>500 && c1(i,j)<=600
  47. c1(i,j)=37;
  48. end
  49. if c1(i,j)>600 && c1(i,j)<=700
  50. c1(i,j)=44;
  51. end
  52. if c1(i,j)>700 && c1(i,j)<=800
  53. c1(i,j)=50;
  54. end
  55. if c1(i,j)>800 && c1(i,j)<=900
  56. c1(i,j)=55;
  57. end
  58. if c1(i,j)>900 && c1(i,j)<=1000
  59. c1(i,j)=60;
  60. end
  61. %当距离大于1000时,特别注意临界值!!!
  62. if c1(i,j)>1000 && rem(c1(i,j),100)==0
  63. c1(i,j)=(floor((c1(i,j)-1000)/100))*5+60;
  64. end
  65. if c1(i,j)>1000 && rem(c1(i,j),100)~=0
  66. c1(i,j)=(floor((c1(i,j)-1000)/100))*5+65;
  67. end
  68. end
  69. end

(2)构造铁路任意两点间的最小运输费用赋权图

        首先用Floyd算法构造公路距离赋权图,接着计算两点间最短公路距离值,再根据题目给出的公路运价表,得到任意两点间的最小公路费用。构造公路距离矩阵c2(matlab代码如下)

  1. c2(1,14)=31;c2(6,21)=110;c2(7,22)=20;c2(8,9)=104;c2(9,10)=301;c2(9,23)=3;
  2. c2(10,11)=750;c2(10,24)=2;c2(11,12)=606;c2(11,27)=600;c2(12,13)=194;
  3. c2(12,26)=10;c2(13,14)=205;c2(13,28)=5;c2(14,15)=201;c2(14,29)=10;
  4. c2(15,16)=680;c2(15,30)=12;c2(16,17)=480;c2(16,31)=42;c2(17,18)=300;
  5. c2(17,32)=70;c2(18,19)=220;c2(18,33)=10;c2(19,20)=210;c2(19,35)=10;
  6. c2(20,21)=420;c2(20,37)=62;c2(21,22)=500;c2(21,38)=30;c2(22,39)=20;
  7. c2=c2+c2';
  8. for i=1:39
  9. for j=1:39
  10. if(i~=j)&&c2(i,j)==0
  11. c2(i,j)=200000000;%无公路连接是为充分大的元素
  12. end
  13. end
  14. end
  15. for k=1:39
  16. for i=1:39
  17. for j=1:39
  18. if c2(i,j)>c2(i,k)+c2(k,j)
  19. c2(i,j)=c2(i,k)+c2(k,j);%求最短路径
  20. end
  21. end
  22. end
  23. end
  24. c3=c2;%公路距离矩阵
  25. c2=0.1*c2;%求公路费用矩阵

(3)计算任意两点间的最小运输费用

        由于钢管可以用铁路和公路交叉运送,所以任意两点间的最小运输费用为铁路、公路两者最小运输费用的最小值,c=min{c1,c2}

  1. for i=1:39
  2. for j=1:39
  3. if c1(i,j)<c2(i,j)
  4. c(i,j)=c1(i,j);
  5. end
  6. if c1(i,j)>c2(i,j)
  7. c(i,j)=c2(i,j);
  8. end
  9. if c1(i,j)==c2(i,j)
  10. c(i,j)=c2(i,j);
  11. end
  12. end
  13. end
  14. for i=1:39
  15. for j=1:39
  16. for k=1:39
  17. if c(i,j)>c(i,k)+c(k,j)
  18. c(i,j)=c(i,k)+c(k,j);
  19. path2(i,j)=k;
  20. end
  21. end
  22. end
  23. end
  24. for i=1:39
  25. for j=1:39
  26. if (i<=7)&&(j>=8)&&(j<=22)
  27. cf(i,j-7)=c(i,j);%从钢厂到管道节点的距离矩阵
  28. end
  29. end
  30. end

     最终求得最小运费结果:

单位钢管从钢厂S(i)运输到A(I)的运输费用
A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)A(9)A(10)A(11)A(12)A(13)A(14)A(15)
S(1)170.7160.3140.298.63820.53.121.264.29296106121.2128142
S(2)215.7205.3190.2171.611195.58671.2114.2142146156171.2178192
S(3)230.7220.3200.2181.6121105.59686.248.2828696111.2118132
S(4)260.7250.3235.2216.6156140.5131116.284.262516176.28397
S(5)255.7245.3225.2206.6146130.5121111.279.257335171.27387
S(6)265.7255.3235.2216.6156140.5131121.284.262514526.21128
S(7)275.7265.3245.2226.6166150.5141131.299.277665638.2262

在得到最小运费后,利用0-1规划,求最小费用(运费+钢管费+铺设费)模型:

 

由此,我们可建立目标模型如下:(注:此处的c应为cf,cf=c+p)写错啦emmm……

 

约束条件:

根据该模型求解(lingo代码在文末)

最终求得钢管订购的数据如表:

单位钢管从钢厂S(i)运输到A(I)的运输量
A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)A(9)A(10)A(11)A(12)A(13)A(14)A(15)
S(1)000335020026500000000800
S(2)01791881330003000000000800
S(3)003200160006640000001000
S(4)0000000000000000
S(5)00006000000041500001015
S(6)0000000003510863336211651556
S(7)0000000000000000

即厂家S1往A4节点运输335单位钢管,往A6节点运输200单位钢管,往A7节点运输265单位钢管,共计800单位。其它钢厂以此类推…………最小费用为127.8632亿元。

总结:这道题目解题代码

代码1(matlab)

  1. s=[800 800 1000 2000 2000 2000 3000];
  2. path=zeros(39,39);
  3. path1=zeros(39,39);
  4. path2=zeros(39,39);
  5. cf=zeros(7,15);
  6. w=zeros(39,39);c=zeros(39,39);c2=zeros(39,39);
  7. w(1,29)=20;w(1,30)=202;w(2,30)=1200;w(3,31)=690;w(4,34)=690;w(5,33)=462;
  8. w(6,38)=70;w(7,39)=30;w(23,25)=450;w(24,25)=80;w(25,27)=1150;
  9. w(26,28)=306;w(27,30)=1100;w(28,29)=195;w(30,31)=720;w(31,32)=520;
  10. w(32,34)=170;w(33,34)=88;w(34,36)=160;w(35,36)=70;w(36,37)=320;
  11. w(37,38)=160;w(38,39)=290;
  12. w=w+w';
  13. for i=1:39
  14. for j=1:39
  15. if(i~=j)&& w(i,j)==0
  16. w(i,j)=200000000;
  17. end
  18. end
  19. end
  20. for k=1:39
  21. for i=1:39
  22. for j=1:39
  23. if w(i,j)>w(i,k)+w(k,j)
  24. w(i,j)=w(i,k)+w(k,j);
  25. path(i,j)=k;
  26. end
  27. end
  28. end
  29. end
  30. c1=w;
  31. for i=1:39
  32. for j=1:39
  33. if c1(i,j)==0
  34. c1(i,j)=0;
  35. end
  36. if c1(i,j)>0 && c1(i,j)<=300
  37. c1(i,j)=20;
  38. end
  39. if c1(i,j)>300 && c1(i,j)<=350
  40. c1(i,j)=23;
  41. end
  42. if c1(i,j)>350 && c1(i,j)<=400
  43. c1(i,j)=26;
  44. end
  45. if c1(i,j)>400 && c1(i,j)<=450
  46. c1(i,j)=29;
  47. end
  48. if c1(i,j)>450 && c1(i,j)<=500
  49. c1(i,j)=32;
  50. end
  51. if c1(i,j)>500 && c1(i,j)<=600
  52. c1(i,j)=37;
  53. end
  54. if c1(i,j)>600 && c1(i,j)<=700
  55. c1(i,j)=44;
  56. end
  57. if c1(i,j)>700 && c1(i,j)<=800
  58. c1(i,j)=50;
  59. end
  60. if c1(i,j)>800 && c1(i,j)<=900
  61. c1(i,j)=55;
  62. end
  63. if c1(i,j)>900 && c1(i,j)<=1000
  64. c1(i,j)=60;
  65. end
  66. if c1(i,j)>1000 && rem(c1(i,j),100)==0
  67. c1(i,j)=(floor((c1(i,j)-1000)/100))*5+60;
  68. end
  69. if c1(i,j)>1000 && rem(c1(i,j),100)~=0
  70. c1(i,j)=(floor((c1(i,j)-1000)/100))*5+65;
  71. end
  72. end
  73. end
  74. c2(1,14)=31;c2(6,21)=110;c2(7,22)=20;c2(8,9)=104;c2(9,10)=301;c2(9,23)=3;
  75. c2(10,11)=750;c2(10,24)=2;c2(11,12)=606;c2(11,27)=600;c2(12,13)=194;
  76. c2(12,26)=10;c2(13,14)=205;c2(13,28)=5;c2(14,15)=201;c2(14,29)=10;
  77. c2(15,16)=680;c2(15,30)=12;c2(16,17)=480;c2(16,31)=42;c2(17,18)=300;
  78. c2(17,32)=70;c2(18,19)=220;c2(18,33)=10;c2(19,20)=210;c2(19,35)=10;
  79. c2(20,21)=420;c2(20,37)=62;c2(21,22)=500;c2(21,38)=30;c2(22,39)=20;
  80. c2=c2+c2';
  81. for i=1:39
  82. for j=1:39
  83. if(i~=j)&&c2(i,j)==0
  84. c2(i,j)=200000000;
  85. end
  86. end
  87. end
  88. for k=1:39
  89. for i=1:39
  90. for j=1:39
  91. if c2(i,j)>c2(i,k)+c2(k,j)
  92. c2(i,j)=c2(i,k)+c2(k,j);
  93. path1(i,j)=k;
  94. end
  95. end
  96. end
  97. end
  98. c3=c2;
  99. c2=0.1*c2;
  100. for i=1:39
  101. for j=1:39
  102. if c1(i,j)<c2(i,j)
  103. c(i,j)=c1(i,j);
  104. end
  105. if c1(i,j)>c2(i,j)
  106. c(i,j)=c2(i,j);
  107. end
  108. if c1(i,j)==c2(i,j)
  109. c(i,j)=c2(i,j);
  110. end
  111. end
  112. end
  113. for i=1:39
  114. for j=1:39
  115. for k=1:39
  116. if c(i,j)>c(i,k)+c(k,j)
  117. c(i,j)=c(i,k)+c(k,j);
  118. path2(i,j)=k;
  119. end
  120. end
  121. end
  122. end
  123. for i=1:39
  124. for j=1:39
  125. if (i<=7)&&(j>=8)&&(j<=22)
  126. cf(i,j-7)=c(i,j);
  127. end
  128. end
  129. end
  130. % xlswrite('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx',cf,'sheet1','b3:p9');
  131. % xlswrite('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx',w,'sheet2','b4:AN42');
  132. % xlswrite('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx',c1,'sheet2','b54:AN92');
  133. % xlswrite('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx',c3,'sheet3','b4:AN42');
  134. % xlswrite('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx',c2,'sheet3','b54:AN92');
  135. % xlswrite('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx',c,'sheet4','b4:AN42');

代码2(Lingo)

  1. model:
  2. sets:
  3. aa/1..7/:f,p,s;
  4. bb/1..15/:l,r,a,b;
  5. link(aa,bb):cf,x;
  6. endsets
  7. data:
  8. p=160 155 155 160 155 150 160;
  9. s=800 800 1000 2000 2000 2000 3000;
  10. b=104 301 750 606 194 205 201 680 480 300 220 210 420 500 0;
  11. !从文件中导出数据
  12. cf=@ole('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx','data');!data为Excel表的数据,此处需提前在Excel表中设置
  13. 设置过程参考下方步骤
  14. !写入文件 注:x,ll,rr需在Excel表中提前设置
  15. @ole('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx','x')=x;
  16. @ole('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx','ll')=l;
  17. @ole('F:\第三道问题:钢管运输问题\钢管运输问题1.xlsx','rr')=r;
  18. enddata
  19. min=@sum(link(i,j):(cf(i,j)+p(i))*x(i,j))+0.05*@sum(bb(j):l(j)^2+l(j)+r(j)^2+r(j));
  20. @for(aa(i):@sum(bb(j):x(i,j))>=500*f(i));
  21. @for(aa(i):@sum(bb(j):x(i,j))<=s(i)*f(i));
  22. @for(bb(j):@sum(aa(i):x(i,j))=l(j)+r(j));
  23. @for(bb(j)|j#ne#15:r(j)+l(j+1)=b(j));
  24. l(1)=0;r(15)=0;
  25. @for(aa:@bin(f));
  26. @for(bb:@gin(l));
  27. end

PS:Lingo将Excel表中数据导出或将数据写入Excel表,需对Excel表提前设置单元格名称,设置步骤如下:

选定数据写入的合适区域,点击“公式”-“名称管理器”-“新建”名称,此时就可自定义名称啦

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55700?site
推荐阅读
相关标签
  

闽ICP备14008679号