送货路线的最优设计方案Word格式.docx
《送货路线的最优设计方案Word格式.docx》由会员分享,可在线阅读,更多相关《送货路线的最优设计方案Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
现有一快递公司,库房在图1中的O点,一送货员需将货物送至城市内多处,请设计送货方案,使所用时间最少。
该地形图的示意图见图1,各点连通信息见表3,假定送货员只能沿这些连通线路行走,而不能走其它任何路线。
各件货物的相关信息见表1,50个位置点的坐标见表2。
假定送货员最大载重30公斤,所带货物最大体积0.8立方米。
送货员的平均速度为24公里/小时。
假定每件货物交接花费3分钟,为简化起见,同一地点有多件货物也简单按照每件3分钟交接计算。
现在送货员要将100件货物送到50个地点。
请完成以下问题。
1.假定只有一个送货员,若不需要考虑所有货物送达时间限制,现在要将100件货物全部送到指定地点并返回。
设计最快完成路线与方式。
要求标出送货线路,给出送完所有快件所需要的时间。
2.假定有3个送货员,并且不需要考虑货物送达时间限制,将100件货物全部送到指定地点并返回。
3.若需要将100件货物在指定时间之前全部送到指定地点并返回,至少需要几个送货员?
给出此时各个送货员的送货路线与送货总时间,使得各个送货员的工作强度尽可能均衡.
图1
一、基本假设
1.不考虑货物与货物之间的间隙,即送货员所带货物的总体积等于每个货物体积之和。
2.送货员在行走过程中保持24km/h的平均速度不变,不考虑天气、道路状况、体力消耗、突发意外等因素对速度的影响。
3.送货员只能在库房取货,也只能在货物送达的指定地点卸货。
三、符号约定
:
送货员行走的平均速度(km/h)。
送货员的最大载重量(公斤)。
送货员所带货物的最大体积(立方米)。
单件货物交接所花费的时间(min)。
需送达第i个城市的货物数量(i=1,2,…50)。
问题i所需要的总时间(i=1,2,3)(min)。
第i个货物的重量(i=1,2…100)(公斤)。
第i个货物的体积(i=1,2…100)(立方米)。
赋权连通图。
的第i个子图。
子图
的最佳回路。
边e的边权。
点v的点权,且
:
相互之间可直接到达地点之间的距离矩阵(i,j=1,2…51)。
问题i送货员走过的总路程(i=1,2,3)(米)。
路线i所花的总时间(h)。
路线组合i的时间重量积。
四、模型的建立与求解
1.模型的准备
下面为了讨论问题的方便,我们提前介绍接下来要用到的一些定义和结论。
定义1:
最小生成树
连通的无圈图叫做树,记之为T。
若图G满足V(G)=V(T),
则称T是G的生成树。
赋权图的具最小权的生成树叫做最小生成树。
定义2:
经过图G的每个顶点正好一次的圈,称为G的哈密顿环路,也称为Hamilton圈。
定义3:
在加权图G=(V,E)中
(1)权最小的Hamilton圈称为最佳Hamilton圈;
(2)经过每个顶点至少一次且权最小的闭通路称为TSP回路问题。
算法1:
Dijkstra算法
基本思想:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组。
第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径v,…vk,就将vk加入到集合S中,直到全部顶点都加入到S中,算法就结束了)。
第二组为其余未确定最短路径的顶点集合(用U表示)。
按最短路径长度的递增次序依次把第二组的顶点加入S中。
在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。
此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
我们使用了dijkstra.m来实现该算法(详见附录)。
算法2:
Floyd算法
递推产生一个矩阵序列
其中
表示从顶点
到顶点
的路径上所经过的顶点序号不大于k的最短路径长度。
计算时用迭代公式:
其中k是迭代次数,i,j,k=1,2,…n。
最后,当k=n时,
即是各顶点之间的最短通路值。
我们使用了floyd.m来实现该算法(详见附录)。
算法3:
模拟退火算法
从一给定解开始,从邻域中随机产生另一个解,接受Metropolis准则允许目标函数在有限范围内变坏,它由一控制参数t决定,其作用类似于物理过程中的温度T,对于控制参数的每一取值,算法持续进行“产生—判断—接受或舍去”的迭代过程,对应着固体在某一恒定温度下的趋于热平衡的过程,当控制参数逐渐减小并趋于0时,系统越来越趋于平衡态,最后系统状态对应于优化问题的全局最优解,该过程也称为冷却过程,由于固体退火必须缓慢降温,才能使固体在每一温度下都达到热平衡,最终趋于平衡状态,因此控制参数t经缓慢衰减,才能确保模拟退火算法最终优化问题的整体最优解。
我们使用了annealing.m来实现该算法(详见附录)。
算法4:
prim算法
假设
是一个连通网,U是V的一个非空子集。
若
是一条具有最小权值的边,其中
,则必存在一棵包含
的最小生成树。
2.模型的建立
把快递公司的送货地点抽象为一加权图G=(V,E),在G中,
,
对应于图1中快递公司的库房以及送货地点(所有城市)(i=1,2…,50,51其中,i=51对应于库房)。
,对应于图1中的路径(j=1,2,…77)。
边权
对应于图1中的路径长度。
建立的数学模型如下:
3.问题的分析
对于问题一,只有一个送货员,不考虑货物送达的时间限制,要求设计送货路线,是送货员在最短时间内将所有货物送出。
由于在某一城市交接货物的时间只与货物数量有关,故不管如何设计路线,花费在交接货物上的总时间是固定的,而送货员的平均速度不变,因此,要使送完所有货物所花的总时间,实际上就是要使送货员恰好能遍历所有城市走过的距离最短。
由定义2可知,这实际上是TSP问题,即问题一可转化为寻求最佳Hamilton圈问题。
对于问题二,与问题一的区别在于多了两个送货员,共有三个,则完成送货的最短时间取决于三个送货员当中所花时间最长者,这间接要求我们尽可能均衡地去为每个送货员分配任务,可考虑将问题一得到的分组以时间为划分标准分成三组,如有可能,进行微调,以使所花时间尽可能地短。
对于问题三,比前两个问题多了时间限制,解决起来更为困难,这就需要我们以不同思路去寻求解决问题的办法,与前两问不同的是,我们在设计路线时考虑问题的优先级从高到低应改为为时间、载重量、总体积。
由于事先并不知道送货员个数的最小值,可先设法定出上下界,尽可能地缩小上下界的范围,然后在该范围内由简到繁地寻求符合要求的路线,在找到一种路线方案后,试着去找更小的逼近下界的送货员个数的路线,最终确定最优解。
4.模型的求解
4.1问题一的求解
估计粗略的下界:
先不考虑送货员的最大载重及总体积的限制,让送货员仅跑一趟就将所有城市遍历,这实际上就是最佳推销员问题。
容易看出在本问题中要想遍历所有城市而每一顶点仅经过一次是不可能的(因顶点中存在奇次点),由于仅是粗略估计下界,我们不打算求出此最佳推销员问题的精确解,仅作近似计算,故我们采用了模拟退火算法来进行计算机模拟。
由于该算法主要用来处理强连通图,与我们要处理的实际地图有所不同,因此我们先用Floyd算法求出各顶点之间最短路径的邻接矩阵,对本不连通的两点以最短路径代替,从而解决了这一问题。
我们进行了多次模拟运行,将运行结果(总时间(包括交接货物时间))取平均得到了10.39h。
据此,我们得到了粗略的下界:
10.39h。
估计较为精确的下界:
1.用prim算法得出G(V,E)的最小生成树(如下图所示);
2.仍不考虑送货员的载重总量,一趟遍历所有城市,沿以下路线行走:
O-26-31-27-39-27-31-18-31-34-40-47-40-50-40-37-41-44-48-46-33
-28-30-22-20-22-15-22-29-25-19-24-18-13-12-11-12-8-3-4-2-5-2
-4-3-1-6-7-10-9-14-17-21-23-16-23-32-35-38-36-43-42-49-45.
计算可知总路程为147850米,送货员所花总时间(包括交接货物时间)为11.16h。
故可将下界提高到11.16h。
估计更为精确的下界:
1.仍是用prim算法得出G(V,E)的最小生成树;
2.对路线进行分组,深度优先,只考虑前三趟需返回库房取货物,但仍不受最大载重限制,共分成四组,具体路线如下所示:
路线1:
O-21-17-14-9-10-7-1-6-1-3-8-12-13-12-11-12-8-3-4-2-5-2-4-3
-1-7-10-9-14-17-21-O.
路线2:
O-26-31-18-31-24-19-25-29-22-30-28-33-28-30-22-15-22-20
-22-29-25-19-24-31-26-O.
路线3:
O-26-31-27-39-27-31-34-40-47-40-50-40-37-41-44-48-46-48
-44-41-37-40-34-31-26-O.
路线4:
O-21-17-23-16-23-32-35-38-36-43-42-49-42-45.
计算可知总路程为205206米,所花总时间为13.55h。
故又可将下界提高到13.55h。
可以想象,随着分组的增加,将载重量的限制考虑进来后,势必会使所花总时间增加。
通过表1我们可计算出货物总重量为233.79公斤,总体积4.5166立方米,送货员的最大载重量为30公斤,
,即送货员至少要跑8趟才能将所有货物送出。
我们尝试把城市分成若干组,使送货员每趟遍历其中一组的所有城市,且满足以下分组原则:
原则1:
我们希望每一组中包含尽可能多的城市,且从O点出发经过该组所有城市后回到O点的路程尽可能地短。
原则2:
在不超过最大载重量和最大体积的前提下,应优先考虑携带重量大、体积大的货物。
原则3:
在同一组中,相互到达的两点间的距离应避免过长。
考虑到点数较多(共51个点),如一下子将所有原则考虑进来会使问题变得较为复杂,因此,为了减小分组的阻力,我们的做法是第一步仅把原则1考虑进来,得到一粗略分组后,再逐渐将原则2、原则3考虑进来,一步一步地把模型优化。
首先,我们希望送货员在每一趟中至少有一个点走得足够远,这样他经过的点相对就会越多,一次能送完的货物数量就会越多。
作为准备工作,我们用Dijkstra算法计算出各点与O点之间的最短路径及距离,对这些距离进行排序(从远到近依次为):
5、2、48、33、46、28、4、44、20、30、22、49、41、15、6、1、42、50…。
接下来我们的做法是,先让送货员分别沿着从O点到以上各点的最短路径送货,在不超过最大载重量即最大体积的前提下,尽可能多地带上应送达在路径上各点的货物,O点到每一点的最短路径作为该组行走的主要路线,至少应找8条这样的路线,我们取了有18个离O点较远的点,得到了大概十几条(实际上小于18条)路线。
其次,进行必要的局部调整,以减少分组数。
通过实际操作我们发现,上述按距离远近来分组的做法不能保证不同组间的点能分得足够开,或者说归属于不同组两点可能是相邻的(如图中的5和2),显然访问其中一点顺带访问另一点比分别访问这两点要来得合理,能节省不少路程,因此应该将它们划为同一组;
受最大载重量限制,有些点可能只能单独一趟送达,如地图中的点49,总货物重量为29.85公斤,带上送达该处的货物后送货员很难再带上送至别处的货物;
综合考虑以上两种情形后,我们初步将城市分为10组,暂将将各组行走的路线列于下表:
编号
送货路线
1
O-18-13-11-12-15-5-2-4-3-8-1-6-1-7-18-O
2
O-26-31-34-40-47-40-37-41-46-48-44-50-40-34-31-26-O
3
O-26-31-24-19-25-29-22-29-25-19-24-31-26-O
4
O-26-31-24-19-25-29-22-20-22-30-28-33-28-30-22-29-
25-19-24-31-26-O
5
O-21-36-45-50-40-34-31-27-39-27-31-26-O
6
O-21-36-38-43-42-49-42-43-38-36-21-O
7
O-21-36-38-43-42-43-38-36-21-O
8
O-21-17-23-17-O
9
O-21-36-38-35-32-23-17-21-O
10
O-21-17-23-16-14-9-10-18-O
通过计算,总路程
=245080(米),故所需总时间
上述做法显然不是最合算的走法,事实上,该做法仅考虑了原则1的要求,这就导致了有些路线虽走得足够远(包含的点足够多),但受最大载重量的限制,往往是原路返回(保证路程最短),这浪费了不少路程(时间)。
如路线3和4,有将近一半的路程是重复的,这显然是不应该的。
再比如说路线1,15和5之间的距离长了些,同时访问这两点多走一些路程,把15归于与22同组更为合理些。
按照上述思路,我们在第一次分组的基础上进一步进行优化,下面具体到每一组进行详细讨论。
(1)我们考虑将原路线1中的5和15划分到不同的两组,减少路程,在通过25时绕到15再去22,虽绕了路,在整体上确应比原方案访问到15节省一些路程;
同理,也考虑原路线1中7不直接走到18,在到达7后,沿原路线1依次访问1、6、1、3、4、2、5、2、4、3、8、12、11、13、18,看似重复了一些路程,却实际上比原方案节省了一些路程(因5和15、7和18之间的距离远大于重复的路程),为了区分出送货员在某一点处是否有作停留,我们在序号外加圆括号表示送货员在该点有停留(卸货),否则不作停留,则优化后路线1为O-(21)-(14)-(9)-(10)-(7)-
(1)-(6)-1-(3)-(4)-
(2)-(5)-2-4-(3)-(8)-(12)-(11)-13-18-O。
(2)原方案基本上都在第一次经过某点时将货卸下,看似合理,但实际上并非如此,由于货物重量各不相同,有些时候先把远处的点的货带上而只经过近处的点有可能能使送货员单次完成送达货物任务的点数更多,如原路线8和9,由于点23的货物总重为24.26公斤,附近的点14、16、17等与其明显不可能一趟就能送完,因此我们考虑将靠近O点的点21在原路线8中改为不停留,将前述各点包括进来,于是,原路线8改为O-21-(17)-(23)-(16)-23-17-21-O,对此路线需做较为特殊的处理,因此时送货员需带上货物31.16公斤,超过了最大载重量,处理办法是送达点23的货物分成两批,本路线携带除了8号货物(1.40公斤)外的其他货物,8号货物由另外一趟携带,后面将会知道,仅有该点需进行这种特殊处理。
(3)前面提到由于最大载重量的限制,对于点49只能单独划为一组,即原路线6保持不变仍为O-21-36-38-43-42-(49)-42-43-38-36-21-O。
(4)对于原路线2,走到点44后,受最大载重量限制,无法带上送达点50的货物,故只能经过点50,沿着40、34、31、26回到O点。
为了将货物送达点50,需另外跑一趟,但又得重走40、34、31、26之间的路程,如能先放弃26、31这两点,由另外一趟送达,先把50包括进来,这就避免了多走一些路程,再综合考虑点27、39的情况,将原路线2改进为O-26-31-(34)-(40)-(47)-40-(37)-(41)-(30)-(28)-(33)-(46)-(48)-(44)-(50)-40-34-31-26-O。
(5)前面提到将点5和点15分到不同的两组,其中已将点5分到新的路线1,这里稍微改动原路线3采取画圈的方式将点15包括进来,虽然路程比原来的稍长(原路径为最短路径),但却访问了更多的点,缩减了总组数,总效果为减小了路程,修改后的路线为O-(18)-(13)-12-(15)-(22)-20-22-(29)-25
-19-24-31-26-O。
类似地,可对其余原路线进行优化或删减,最终我们得到8条新路线,比原来少了2条,即送货员需要分8趟才能将所有货物送达指定地点,由前面分析可知,这已经是最少的分组了。
为直观起见,我们将所设计的路线及其各种参数列于下表以供参考,
号
总重量
(公斤)
总体积
(立方米)
O-(26)-(31)-(27)-(39)-27-(36)
-38-(35)-(32)-(23)1-17-21-O
29.76
0.5575
O-21-36-(38)-(43)-(42)-(45)
-36-21-O
29.42
0.5001
O-(21)-(14)-(9)-(10)-(7)-
(1)
-(6)-1-(3)-(4)-
(2)-(5)-2-4
-(3)-(8)-(12)-(11)-13-18-O
29.46
0.6129
O-(18)-(13)-12-(15)-(22)-20
-22-(29)-25-19-24-31-26-O
29.24
0.6096
O-26-31-(24)-(19)-(25)-19-24
-31-26-O
26.65
0.6368
O-26-31-(34)-(40)-(47)-40-(37)
-(41)-(30)-(28)-(33)-(46)-(48)
-(44)-(50)-40-34-31-26-O
29.65
0.5462
O-21-36-38-43-42-(49)-42-43-38
29.85
0.5804
O-21-(17)-(23)2-(16)-23-17-21-O
0.4731
表4
上图为我们所设计的送货路线。
=216540(米),故所需总时间
由于
,说明按照以上思路的确能使模型得到优化,
最快完成路线如表4所示,特别说明,表中(23)1表示送货员在路线1中仅携带8号货物,(23)2表示送货员在路线8中仅携带29,53,84号货物。
4.2问题二的求解
由前面对问题二的分析可知,我们可以在问题一结论的基础上为三个送货员进行任务分配。
下界的估计:
根据问题一,
可估计三个送货员所需的最短时间下界为
,这也是三个送货员的平均花费时间,问题二所求的最短时间应该略大于4.67h,因为既然是平均值,那就表明至少有一个送货员花费时间大于等与4.67h,而最短时间由三个送货员当中所花费的最长时间决定,故4.67h是问题二的下界。
为了分组方便,我们先计算出每一条路线所花的总时间分别为
分组时应使每一组所花费的总时间接近于4.67h,通过多次计算我们得到以下最佳分法:
表5
所走路线
总时间(h)
路线1+路线3
4.8102
路线2+路线5+路线7+路线8
4.6274
路线4+路线6
4.5848
可以看出,1号送货员所花时间最长,根据最短时间由三者中的最大值决定的原理,应设法缩短1号送货员所花费的时间,同时修改后的时间最大值小于修改前的值。
可以有以下两种思路:
第一种是调整1号送货员所走的路线,但这势必会造成3个送货员路线的变化;
从对问题一的讨论可知,目前路线几乎是最为合算的走法,稍一改动很可能引起总时间整体增加,但也不排除能缩短总时间的可能性,但修改的难度系数较大。
第二种是调整1号送货员所带货物数量,减少停留时间,这种做法并不改变三个送货员的行走路线,但只要处理得当,能较容易缩短1号所花费总时间,从而缩短所求的总时间。
这里我们采用后者的做法,具体思路是,找出1号送货员所走路线的与另外两个送货员所走路线的交点,通过考察在交点处的货物重量、体积,结合表4给出的每条路线的货物总重量,计算所能携带的剩余重量,综合考虑,若满足由1号携带的货物改为由2号、3号携带后,使各条路线总重量不超过30公斤,总体积不超过0.8立方米的条件,则可使1号送货员携带的货物减少,其所花费的总时间自然就减少了,从而使总时间减少,达到了最初的目的。
通过观察法,经仔细计算可以发现:
路线1与路线5都经过点26,故1号送货员可将56号货物交由2号送货员,此时1号送货员走路线1时载重量和总体积显然小于最大值,2号送货员走路线5时载重量为27.91公斤,总体积为0.6427立方米,也符合要求。
路线3与路线4都经过点12,故1号送货员可将本应自己携带的98号货物交由3号送货员,此时1号送货员走路线1时载重量和总体积显然小于最大值,3号送货员走路线4时载重