数学建模运输问题.docx
《数学建模运输问题.docx》由会员分享,可在线阅读,更多相关《数学建模运输问题.docx(28页珍藏版)》请在冰豆网上搜索。
![数学建模运输问题.docx](https://file1.bdocx.com/fileroot1/2023-3/30/96368ec7-f0cc-41db-b407-03e443e2316e/96368ec7-f0cc-41db-b407-03e443e2316e1.gif)
数学建模运输问题
运输问题
摘要
本文主要研究的是货物运输的最短路径问题,利用图论中的Floyd算法、Kruskal算法,以及整数规划的方法建立相关问题的模型,通过matlab,lingo编程求解出最终结果。
关于问题一,是一个两客户间最短路程的问题,因此本文利用Floyd算法对其进行分析。
考虑到计算的方便性,首先,我们将两客户之间的距离输入到网络权矩阵中;然后,逐步分析出两客户间的最短距离;最后,利用Matlab软件对其进行编程求解,运行得到结果:
2-3-8-9-10总路程为85公里。
关于问题二,运输公司分别要对10个客户供货,必须访问每个客户,实际上是一个旅行商问题。
首先,不考虑送货员返回提货点的情形,本文利用最小生成树问题中的Kruskal算法,结合题中所给的邻接矩阵,很快可以得到回路的最短路线:
-9-10-2;然后利用问题一的Floyd算法编程,能求得从客户2到客户1(提货点)的最短路线是:
2-1,路程为50公里。
即最短路线为:
-9-10-2-1。
但考虑到最小生成树法局限于顶点数较少的情形,不宜进一步推广,因此本文建立以路程最短为目标函数的整数规划模型;最后,利用LINGO软件对其进行编程求解,求解出的回路与Kruskal算法求出的回路一致。
关于问题三,是在每个客户所需固定货物量的情况下,使得行程之和最短。
这样只要找出两条尽可能短的回路,并保证每条线路客户总需求量在50个单位以内即可。
因此我们在问题二模型的基础上进行改进,以货车容量为限定条件,建立相应的规划模型并设计一个简单的寻路算法,对于模型求解出来的结果,本文利用Kruskal算法结合题中所给的邻接矩阵进行优化。
得到优化结果为:
第一辆车:
-1,第二辆车:
,总路程为280公里。
关于问题四,在问题一的基础上我们首先用Matlab软件编程确定提货点到每个客户点间的最短路线,然后结合一些限定条件建立一个目标模型,设计一个较好的解决方案进行求解可得到一种很理想的运输方案。
根据matlab运行结果分析得出4条最优路线分别为:
1-5-2,1-4-3-8,1-7-6,1-9-10。
最短总路线为245公里,最小总费用为645。
关键词:
Floyd算法Kruskal算法整数规划旅行商问题
一、问题重述
某运输公司为10个客户配送货物,假定提货点就在客户1所在的位置,从第i个客户到第j个客户的路线距离(单位公里)用下面矩阵中的
位置上的数表示(其中
表示两个客户之间无直接的路线到达)。
1、运送员在给第二个客户卸货完成的时候,临时接到新的调度通知,让他先给客户10送货,已知送给客户10的货已在运送员的车上,请帮运送员设计一个到客户10的尽可能短的行使路线(假定上述矩阵中给出了所有可能的路线选择)。
2、现运输公司派了一辆大的货车为这10个客户配送货物,假定这辆货车一次能装满10个客户所需要的全部货物,请问货车从提货点出发给10个客户配送完货物后再回到提货点所行使的尽可能短的行使路线?
对所设计的算法进行分析。
3、现因资源紧张,运输公司没有大货车可以使用,改用两辆小的货车配送货物。
每辆小货车的容量为50个单位,每个客户所需要的货物量分别为8,13,6,9,7,15,10,5,12,9个单位,请问两辆小货车应该分别给那几个客户配送货物以及行使怎样的路线使它们从提货点出发最后回到提货点所行使的距离之和尽可能短?
对所设计的算法进行分析。
4、如果改用更小容量的车,每车容量为25个单位,但用车数量不限,每个客户所需要的货物量同第3问,并假设每出一辆车的出车费为100元,运货的价格为1元/公里(不考虑空车返回的费用),请问如何安排车辆才能使得运输公司运货的总费用最省?
二、问题分析
关于问题一,是一个两客户间最短路程的问题,因此本文利用Floyd算法对其进行分析。
考虑到计算的方便性,首先,我们将两客户之间的距离输入到网络权矩阵中;然后,逐步分析出两客户间的最短距离;最后,利用Matlab软件对其进行编程求解。
关于问题二,运输公司分别要对10个客户供货,必须访问每个客户,实际上是寻找一条最短的行车路线。
首先,不考虑送货员返回提货点的情形,本文利用最小生成树问题中的Kruskal算法,结合题中所给的邻接矩阵,很快可以得到回路的最短路线:
;然后利用问题一的Floyd算法和程序,能求得从客户2到客户1(提货点)的最短路线是:
,路程为50公里。
但考虑到最小生成树法局限于顶点数较少的情形,不宜进一步推广,因此本文又根据路程最短建立以路程最短为目标函数的整数规划模型;最后,利用LINGO软件对其进行编程求解。
关于问题三,是在每个客户所需固定货物量的情况下,使得行程之和最短。
这样只要找出两条尽可能短的回路,并保证每条线路客户总需求量在50个单位以内即可。
因此我们在问题二模型的基础上进行改进,以货车容量为限定条件,建立相应的规划模型并设计一个简单的寻路算法,对于模型求解出来的结果,本文利用Kruskal算法结合题中所给的邻接矩阵进行优化。
关于问题四,我们首先用Matlab软件编程确定提货点到每个客户点间的最短路线,然后结合一些限定条件建立一个目标模型,设计一个较好的解决方案进行求解可得到一种很理想的运输方案。
三、模型假设
1.假设客户级别平等;
2.假设不考虑装卸车费用;
3.假设货车不发生意外事故;
4.假设运输过程中货物无损失;
四、符号说明
不同的客户
;
从客户
到客户
的距离;
;
;
总路程;
五、模型的建立与求解
问题一模型的建立与求解
问题一是要找出从客户2到客户10的最短路径,本文利用Floyd算法对此文进行求解。
为计算方便,令网络的权矩阵为
的距离。
Floyd算法基本步骤为:
(1)输入权矩阵
。
(2)计算
其中
(3)
中元素
就是
到
的最短路长。
在本文计算中
,对Floyd算法进行编程(程序见附录1),利用Matlab软件进行求解。
运行结果如下:
a=
0405540255530555070
5003045355045556585
5530015553050253555
4045150453050203050
2515454503510304055
5550303035025503555
3025505010250304060
3045252030253001030
2040304035152545020
3520102520403035300
path=
1544577599
1233565333
4234867888
1334568888
12245778810
7234767499
15385678810
9534597899
1101047678910
12335353910
请输入起点2
请输入终点10
2
3
8
9
10
由运行结果可以得出运货员从客户2到客户10的最短路径是:
总路程为85公里。
问题二模型的建立与求解
运输公司为这10个客户配送货物问题实际上是寻找一条最短的行车路线。
当不考虑送货员返回提货点的时候,本文利用最小生成树问题中的Kruskal算法结合题中所给的邻接矩阵,很快可以得到无回路的最短路线。
Kruskal算法基本步骤:
每步从未选的边中选取边
,使它与已选边不够成圈,且
是未选边中的最小权边,知道选够
条边为止。
利用最小生成树问题中的Kruskal算法结合题中所给的邻接矩阵,很快可以得到以下最小生成树:
这两棵生成树不同之处就在于从客户6到达客户8的路径不一样,而实际路程经过计算后是一样的,路线的总行程为175公里。
利用问题一的Floyd算法和程序,能求得从客户2到客户1(提货点)的最短路线是
,路程为50公里。
这样该回路,即最短的行车路线为:
行车路线总行程为225公里。
以最小生成树法解决此问题速度快,结果较精确,但是只适合数目较少时,不适宜推广,因此本文又根据路程最短建立整数规划模型。
为了更好的防止子巡回的产生,根据哈米尔顿回路,须附加一个约束条件:
当访问客户i后必须要有一个即将访问的确切客户;访问客户j前必须要有一个刚刚访问过的确切客户。
依次设立约束条件。
利用Lingo求解模型部分结果(附录2):
Globaloptimalsolutionfound.
Objectivevalue:
Objectivebound:
Infeasibilities:
Extendedsolversteps:
0
Totalsolveriterations:
86
VariableValueReducedCost
X(1,5)
X(2,1)
X(3,4)
X(4,8)
X(5,7)
X(6,3)
X(7,6)
X(8,9)
X(9,10)
X(10,2)
由此可得,行程路线最短的回路:
总路程为225公里。
问题三模型的建立与求解
用两辆容量为50单位的小货车运货,在每个客户所需固定货物量的情况下,要使得行程之和最短。
这样只要找出两条尽可能短的回路,并保证每条线路客户总需求量在50个单位以内。
此问与问题二有相似之处都要考虑回到提货点的情形,因此本文在模型2的基础上进行改进,重新建立相应的整数线性规划模型。
目标函数:
利用Lingo求解模型部分结果(附录3):
Globaloptimalsolutionfound.
Objectivevalue:
Objectivebound:
Infeasibilities:
Extendedsolversteps:
0
Totalsolveriterations:
224
VariableValueReducedCost
X(1,5)
X(2,3)
X(3,6)
X(5,2)
X(6,7)
X(7,1)
Globaloptimalsolutionfound.
Objectivevalue:
Objectivebound:
Infeasibilities:
Extendedsolversteps:
0
Totalsolveriterations:
224
VariableValueReducedCost
X(1,4)
X(4,8)
X(5,1)
X(8,9)
X(9,10)
X(10,5)
由此可得,两辆车的行车路线及路程:
第一辆车:
,包含的客户有2,3,6,7,运货总量为44,路程为155公里。
第二辆车:
,包含的客户有4,8,9,10,5运货总量为42单位,路程为135公里。
总路程为290公里。
对于模型求解出来的结果,本文利用Kruskal算法结合题中所给的邻接矩阵进行优化。
从起始点
处,进行分析,用两辆小的货车配送货物,为了尽可能的减少两辆车的重复路线,
到
、
的路程最短,让两辆车分开运货,先根据货物承载量50的限制让其中的一辆车走完路程,再让另一辆车走剩余城市的最短路线,这样走出两条运货路线:
第一种情况:
第一辆车:
,包含的客户有5,2,3,4,8,从模型1可解得,从
回到
的最短路线是
,运货总量为40单位,路程为145公里。
第二辆车:
,包含的客户有7,6,9,10,运货总量为46,路程为135公里。
这种情况下总路程为280公里。
第二种情况:
第一辆车:
,包含的客户有7,6,3,4,8,从模型1可解得,从
回到
的最短路线是
,运货总量为45单位,路程为150公里。
第二辆车:
,包含的客户5,2,9,10,运货总量为41单位,路程为160。
这种情况下总路程为310公里。
对这两种情况对比,分析,可以看出第一种情况优于第二种情况。
因此选择第一种情况的路线。
问题四模型的建立与求解
题目要求我们运费最省,所以要考虑到需要的车最少,以及每辆车行驶的路程最短,而且还要保证送到每个客户手中。
根据客户总需求量和货车的容量,所以,公司可派4辆货车去送货。
在此,我们假设:
从提货点1到各客户点最短路为
从提货点1到各客户点的最短路程
提货点1到各客户点路径客户所需要货物量的总和
运用matlab程序(见附录4)可得:
从中可以发现:
,所以我们要继续对其进行分析:
首先为了保证送到每个客户手里,所以必须走
,那样就可以删除
;然后考虑到货车的路程最短,所以要走
,删除
;最后,就只能走1-4-3-8路线。
图1四辆货车路线图
经过计算可得下表:
表1:
4辆车的情况表
每辆车的路线
每辆车的路程
每辆车所载的货物量
1-5-2
40
20
1-4-3-8
80
20
1-7-6
55
25
1-9-10
70
21
所以,可得到目标函数:
六、模型的评价与推广
模型的评价
(1)在整个模型的建立过程中,本文考虑的比较全面客观,使模型具有较强的说服力,结果更合理。
(2)根据问题的特点,综合运用了多个软件,如lingo、matlab等等,使得在解决问题的过程中,更方便简单。
这种寻路方法有其局限性,只适用于一些顶点较少的情况,顶点多,寻找起来较为麻烦。
模型的推广
模型的建立比较客观,在现实中也可以广泛的应用,与现实情况紧密相连;比如:
最优路径问题与哈密顿回路问题,这些在现实中应用范围已经很广了。
七、参考文献
[1]胡运权,运筹学教程第四版,北京:
清华大学出版社,2012。
[2]朱道元,数学建模案例精选,北京:
科学出版社,2005。
[3]姜启源,谢金星。
叶俊.数学模型北京:
高等教育出版杜,2004。
I4]吴祈宗.运筹学与最优化方法fM.北京:
机械工业出版社,2003。
附录
附录1:
clear;
clc;
M=10000;%不能直接到达是将距离赋值给M
a(1,:
)=[0,50,M,40,25,M,30,M,50,M];
a(2,:
)=[50,0,30,M,35,50,M,60,M,M];
a(3,:
)=[M,30,0,15,M,30,50,25,M,60];
a(4,:
)=[40,M,15,0,45,30,55,20,40,65];
a(5,:
)=[25,15,M,45,0,60,10,30,M,55];
a(6,:
)=[M,50,30,30,60,0,25,55,35,M];
a(7,:
)=[30,M,50,M,10,25,0,30,45,60];
a(8,:
)=[M,60,25,20,30,55,30,0,10,M];
a(9,:
)=[20,M,M,40,M,15,25,45,0,20];
a(10,:
)=[35,20,10,45,20,M,60,M,30,0];%建立a矩阵
path=zeros(length(a));%建立一个与矩阵a同大小的全零矩阵
fori=1:
10
forj=1:
10
path(i,j)=j;%用path矩阵记录走过的点
end
end
fork=1:
10
fori=1:
10
forj=1:
10
ifa(i,j)>a(i,k)+a(k,j)
a(i,j)=a(i,k)+a(k,j);
path(i,j)=path(i,k);%floyd算法
end
end
end
end
a,path
i1=input('请输入起点');
i2=input('请输入终点');
disp(i1);
whilei1~=i2
i1=path(i1,i2);
disp(i1);
end;
附录2:
MODEL:
SETS:
CUSTOMERS/1..10/:
U;
LINK(CUSTOMERS,CUSTOMERS):
DIST,X;
ENDSETS
DATA:
DIST=
05010000040251000003010000050100000
5003010000035501000006010000100000
1000003001510000030502510000060
4010000150453055204065
251510000045060103010000055
1000005030306002555351000000
301000005010000010250304560
100000602520305530010100000
2010000010000040100000152545020
352010452010000060100000300;
ENDDATA
N=@SIZE(CUSTOMERS);
MIN=@SUM(LINK:
DIST*X);
@FOR(CUSTOMERS(K):
@SUM(CUSTOMERS(I)|I#NE#K:
X(I,K))=1;
@SUM(CUSTOMERS(J)|J#NE#K:
X(K,J))=1;
@FOR(CUSTOMERS(J)|J#GT#1#AND#J#NE#K:
U(J)>=U(K)+X(K,J)-
(N-2)*(1-X(K,J))+
(N-3)*X(J,K)
);
);
@FOR(LINK:
@BIN(X));
@FOR(CUSTOMERS(K)|K#GT#1:
U(K)<=N-1-(N-2)*X(1,K);
U(K)>=1+(N-2)*X(K,1)
);
END
Globaloptimalsolutionfound.
Objectivevalue:
Objectivebound:
Infeasibilities:
Extendedsolversteps:
0
Totalsolveriterations:
86
VariableValueReducedCost
N
U
(1)
U
(2)
U(3)
U(4)
U(5)
U(6)
U(7)
U(8)
U(9)
U(10)
DIST(1,1)
DIST(1,2)
DIST(1,3)
DIST(1,4)
DIST(1,5)
DIST(1,6)
DIST(1,7)
DIST(1,8)
DIST(1,9)
DIST(1,10)
DIST(2,1)
DIST(2,2)
DIST(2,3)
DIST(2,4)
DIST(2,5)
DIST(2,6)
DIST(2,7)
DIST(2,8)
DIST(2,9)
DIST(2,10)
DIST(3,1)
DIST(3,2)
DIST(3,3)
DIST(3,4)
DIST(3,5)
DIST(3,6)
DIST(3,7)
DIST(3,8)
DIST(3,9)
DIST(3,10)
DIST(4,1)
DIST(4,2)
DIST(4,3)
DIST(4,4)
DIST(4,5)
DIST(4,6)
DIST(4,7)
DIST(4,8)
DIST(4,9)
DIST(4,10)
DIST(5,1)
DIST(5,2)
DIST(5,3)
DIST(5,4)
DIST(5,5)
DIST(5,6)
DIST(5,7)
DIST(5,8)
DIST(5,9)
DIST(5,10)
DIST(6,1)
DIST(6,2)
DIST(6,3)
DIST(6,4)
DIST(6,5)
DIST(6,6)
DIST(6,7)
DIST(6,8)
DIST(6,9)
DIST(6,10)1000000.
DIST(7,1)
DIST(7,2)
DIST(7,3)
DIST(7,4)
DIST(7,5)
DIST(7,6)
DIST(7,7)
DIST(7,8)
DIST(7,9)
DIST(7,10)
DIST(8,1)
DIST(8,2)
DIST(8,3)
DIST(8,4)
DIST(8,5)
DIST(8,6)
DIST(8,7)
DIST(8,8)
DIST(8,9)
DIST(8,10)
DIST(9,1)
DIST(9,2)
DIST(9,3)
DIST(9,4)
DIST(9,5)
DIST(9,6)
DIST(9,7)
DIST(9,8)
DIST(9,9)
DIST(9,10)
DIST(10,1)
DIST(10,2)
DIST(10,3)
DIST(10,4)
DIST(10,5)
DIST(10,6)
DIST(10,7)
DIST(10,8)
DIST(10,9)
DIST(10,10)
X(1,1)
X(1,2)
X(1,3)
X(1,4)
X(1,5)
X(1,6)
X(1,7)
X(1,8)
X(1,9)
X(1,10)
X(2,1)
X(2,2)
X(2,3)
X(2,4)
X(2,5)
X(2,6)
X(2,7)
X(2,8)
X(2,9)
X(2,10)
X(3,1)
X(