题目描述
要铺设一条输送天然气的主管道如图1,图1中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原来有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km)。
图1 天然气输送主管道
1km主管道钢管称为1单位钢管,一个钢厂如果承担制造某种钢管,至少要生产500个单位。每个钢厂在指定期限内能生产该钢管的最大数量和钢管出厂销售1单位钢管价格均已给出。1000km以上每增加1至100km,运价增加5万元。公路运输费用为1单位钢管每公里0.1万元(不足整公里部分按整公里计算)。钢管可由铁路、公路运往铺设地点(不只是运到点,而是管道全线)。1单位钢管的铁路运价如表1:
表1 钢管铁路运价表
里程(km) | ≤300 | 301~350 | 351~400 | 401~450 | 451~500 | 501~600 | 601~700 | 701~800 | 801~900 | 901~1000 |
运价(万元) | 20 | 23 | 26 | 29 | 32 | 37 | 44 | 50 | 55 | 60 |
- 制定主管道钢管的订购和运输计划,使总费用最小并给出总费用。
- 就问题一的模型分析——哪个钢厂钢管的销价的变化对购运计划和总费用影响最大,哪个钢厂钢管的产量的上限的变化对购运计划和总费用的影响最大,并给出相应的数字结果。
- 如果要铺设的管道是一个树形图,铁路、公路和管道构成网络,请提出一种解决办法,并对图2按(1)的要求给出模型和结果。
图2 管道树形
题目代码
clc,clear
NN1=strcat('S',cellstr (int2str([1:7]')));
NN2=strcat('A',strtrim(cellstr((int2str([1:15]')))));
NN3=strcat('B',strtrim(cellstr(int2str([1:17]'))));
NN={NN1{:},NN2{:},NN3{:}};
G = graph;G =addnode (G,NN);
L1={‘B1’,’B3’,450;‘B2’, ‘B3’,1150
'B5','B8',1100;'B4','B6',306; 'B6','B7',195
's1','B7',20; 'S1','B8',202;'s2','B8',1200
'B8','B9',720; 'S3','B9',690; 'B9','B10',520
'B10','B12',170;'s4','B12',690;'S5','B11',462
'B11','B12',88;'B12','B14',160;'B13','B14',70
'B14','B15',320; 'B15','B16',160; 'S6','B16',70
'B16','B17',290; 'S7','B17',30 };
G1 =addedge(G,L1(:,1),L1(:,2),cell2mat(L1(:,3)));
d1 = distances(G1); %求所有点对之间的最短距离
c1 = inf * ones (size(d1));
c1(d1==0)=0;c1((d1>0) & (d1<=300))=20;
c1((d1>300) & (d1<=350))=23;
c1((d1>350) & (d1<=400))=26;
c1((d1>400) & (d1<=450))=29;
c1((d1>450) & (d1<=500))=32;
c1((d1>500) & (d1<=600))=37;
c1((d1>600) & (d1<=700))=44;
c1((d1>700) & (d1<=800))=50;
c1((d1>800) & (d1<=900))=55;
c1((d1>900) & (d1<=1000))=60;
ind=(d1>1000)&(d1<inf);
c1(ind)=60+5 * ceil (d1 (ind)/100-10);
L2 = {'A1','A2',104; 'A2','B1',3; 'A2','A3',301
'A3','B2',2;'A3','A4',750;'A4','B5',600
'A4','A5',606;'A5','B4',10;'A5','A6',194
'A6','B6',5;'A6','A7',205;'A7','B7',10
'S1','A7',31; 'A7','A8',201; 'A8','B8',12
'A8','A9',680; 'A9','B9',42; 'A9','A10',480
'A10','B10',70;'A10','A11',300;'A11','B11',10
'A11','A12',220;'A12','B13',10;'A12','A13',210
'A13','B15',62;'A13','A14',420;'S6','A14',110
'A14','B16',30; 'A14','A15',500; 'A15','B17',20
'S7','A15',20};
G2 =addedge(G,L2(:,1),L2(:,2),cell2mat (L2(:,3)));
w2 = full (adjacency (G2,'weighted')); %导出权重邻接矩阵
w2 (w2= =0) = inf; %把0替换为inf
w3 = min(c1,0.1 *w2 ); %对应元素取最小值
G3 = graph (w3); c3 = distances(G3);
c4 = c3 (1:7,8:22) %提出7行15列的运费数据
writematrix(c4,'anli6_1.xlsx')
s = [800,800,1000,2000,2000,2000,3000]';
p = [160,155,155,160,155,150,160]';
b = [104,301,750,606,194,205,201,680,...
480,300,220,210,420,500]';
c=p+c4 %利用矩阵广播,求购运费用
prob =optimproblem;
x =optimvar('x',7,15, 'LowerBound',0 ) ;
y =optimvar ('y',15, 'LowerBound',0);
z =optimvar ('z',15, 'LowerBound',0 );
obj = sum(sum(c.*x))+0.05 * sum(y. ^2+y+z.^2+z) ;
prob.0bjective = obj;
prob.Constraints.con1 = sum(x,2)<=s;
prob.Constraints.con2 = sum(x) = =y'+z'
prob.Constraints.con3 = y(2:end)+z(1:end-1)==b;
prob.Constraints.con4 = [y(1)==0;z(15)==0];
[sol,fval, flag, out] = solve (prob)
Check1 = sum(sol.x,2)
Prob1 = prob; prob2 = prob; prob3=prob; prob4=prob;
Prob1.Constraints.con5 = [sum(x(4,:))==0;sum(x(7,:))==0];
[sol1, fval1,flag1, out1] = solve(prob1)
prob2.Constraints.con5 = [sum(x(4,:))>=500; sum(x(7,:))>=500];
[sol2,fval2,flag2,out2] = solve(prob2)
prob3.Constraints.con5 = sum(x(4,:))>=500;
prob3.Constraints.con6 = sum(x(7,:))==0;
[sol3,fval3,flag3,out3] = solve(prob3)
prob4.Constraints.con5 = sum(x(4,:))==0;
prob4.Constraints.con6 = sum(x(7,:))>=500;
[sol4,fval4,flag,out4] = solve (prob4)
Sol1.x,sx = sum(sol1.x,2)
tx = round(sol1.x),tsx =sum(tx,2) %取整后的解
writematrix([sum(sol1.x,2),sol1.x],'anli6_1.x1sx','Sheet',2)
writematrix([tsx,tx], 'anli6_1.xlsx', 'Sheet', 2, 'Range', 'A9')
我的总结
1.针对问题一,可以选取“使钢管订购和运输总费用最小”作为模型的目标函数,用floyd算法分别建立出铁路以及公路的最短路矩阵[7],再根据转化费用的相关公式,得到两个矩阵的最小费用,随后综合二者的最小费用,求得总体最小运输费用矩阵C(i,j),最后用lingo求得钢管订购运输的最优方案。
针对问题二,可以根据题目要求,改变钢厂钢管的销价和产量上限,再用lingo求解,分析改变条件后总运费及方案受到的影响。
针对问题三,考虑到问题三与问题一很相似,不同之处在于问题三中的钢管铺设路线变成了树形,因此本文仍然采用问题一的建模思路,对于特殊之处进行修改。采用图论中的floyd算法,求得总体最小运输费用矩阵C(i,j),最后用lingo求解得到最优的钢管订购运输方案。
2.Floyd算法能够找到图中任意两个顶点之间的最短路径,而不仅仅是从一个起点到一个终点的最短路径。 它通过对每对顶点进行逐步优化,得到了全局最优解。