数学建模运输问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华东交通大学数学建模2012年第一次模拟训练题

所属学校:华东交通大学(ECJTU ) 参赛队员:胡志远、周少华、蔡汉林、段亚光、

李斌、邱小秧、周邓副、孙燕青

指导老师:朱旭生(博士)

摘要:

本文的运输问题是一个比较复杂的问题,大多数问题都集中在最短路径的求

解问题上,问题特点是随机性比较强。 根据不同建模类型 针对问题一 ,我们直接采用Dijkstra 算法(包括lingo 程序和手算验证),将问题转化为线性规划模型求解得出当运送员在给第二个客户卸货完成的时,若要他先给客户10送货,此时尽可能短的行使路线为:109832V V V V V →→→→,总行程85公里。

针对问题二,我们首先利用prim 算法求解得到一棵最小生成树:

121098436751V V V V V V V V V V V →→→→→→→→→→

再采用Dijkstra 算法求得客户2返回提货点的最短线路为12V V →故可得到一条理想的回路是:121098436751V V V V V V V V V V V →→→→→→→→→→ 后来考虑到模型的推广性,将问题看作是哈密顿回路的问题,建立相应的线性规划模型求解,最终找到一条满足条件的较理想的的货车送货的行车路线:

121098436751V V V V V V V V V V V →→→→→→→→→→。

针对问题三,我们首先直接利用问题二得一辆车的最优回路,以货车容量为限定条件,建立相应的规划模型并设计一个简单的寻路算法,最终可为公司确定合理的一号运输方案:两辆车全程总和为295公里(见正文);然后建立线性规划模型得出二号运输方案:两辆车全程总和为290公里(见正文); 针对问题四,

一、问题分析

对问题(一)的分析就是求指定两点间的最短路径问题,对此我们可以采用dijkstra算法可以很简单的算出答案,由此延伸一下我们可以推广到可找出第二个客户到任何一个客户的的最短路径,为此我们也将找出此类题目的一般lingo算法。

对问题(二)的分析,由提货点出发再返回到提货点,而且这条路径必须是相对而言最短的,显然这个问题是在模型中找出一条最短的哈密尔顿回路的问题,建立相应的线性规划模型就能最终找到一条满足条件的较理想的的结果对问题(三)的分析,这个问题主要是要把9个客户(1好客户为提货点)分成两个集合,然后依次构建出两个完整的最短的汉密尔顿回路。

对问题(四)的分析

关键字:Dijkstra算法, prim算法, 哈密顿回路

二、模型假设

1、任何两个客户之间的路径长度都是固定的,不存在临时出发状况例如绕道,改道的情况。

2、不考虑任何现实状况中的实际情况,一切按照题目的数据进行求解。

三、符号说明

c表示从第i个客户到第j个客户的路线距离

ij

表示第i个客户到第j个客户的0-1变量

(注:其他变量在模型中定义)

四、模型的建立与求解

问题一、

模型一:

直接求解:

为了简化问题我们用dijistra算法直接求解,然后用表格法简化其操作步骤:

1 2 3 4 5 6 7 8 9 10

2→3→8→9→10(且最短路径为85)

同样从上表格中我们不但可以找出客户2到客户10的最短路径同样可以找出客户到其他任何客户位置的最短路径列表如下:

2→1(最短路径为50) 2→3(最短路径为30) 2→3→4(最短路径为45) 2→5(最短路径为35) 2→6(最短路径为50) 2→5→7(最短路径为45) 2→3→8(最短路径为55

2→3→8→9(最短路径为65)

模型二:

编写出lingo 的算法求解:

定义)(i f 是由i p 点出发至终点N p 的最短路程,由最优化原理可得

⎪⎩⎪⎨⎧=-=+=0)(1,,2,1)},({min )(N f N i j f c i f ij j

这是一个函数方程,用LINGO 可以很方便的解决。

model: data: n=10; enddata sets:

points/1..n/: F; !10个客户点; roads(points,points)/ 1,2

2,3 2,5 2,6 2,8

3,4 3,6 3,7 3,8 3,10

4,5 4,6 4,7 4,8 4,9 4,10

5,6 5,7 5,8 5,10

6,7 6,8 6,9

7,8 7,9 7,10

8,9

9,10

/: D, P;

endsets

data:

D=

50

30 35 50 60

15 30 50 25 60

45 30 55 20 40 65

60 10 30 55

25 55 35

30 45 60

10

20;

enddata

F(n)=0;

@for(points(i) | i #lt# n:

F(i)=@min(roads(i,j): D(i,j)+F(j));

);

!显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i --> j,否则就不是。

由此,我们就可方便的确定出最短路径;

@for(roads(i,j):

P(i,j)=@if(F(i) #eq# D(i,j)+F(j),1,0)

);

End

摘入Lingo的部分显示结果:

P( 1, 2) 1.000000 P( 2, 3) 1.000000 P( 2, 5) 0.000000 P( 2, 6) 0.000000 P( 2, 8) 0.000000 P( 3, 4) 0.000000 P( 3, 6) 0.000000 P( 3, 7) 0.000000 P( 3, 8) 1.000000 P( 3, 10) 0.000000 P( 4, 5) 0.000000

相关文档
最新文档