送货路线设计经典版Word文件下载.docx
《送货路线设计经典版Word文件下载.docx》由会员分享,可在线阅读,更多相关《送货路线设计经典版Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
![送货路线设计经典版Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/7/0ee48017-b78b-498c-8853-4491122bf95e/0ee48017-b78b-498c-8853-4491122bf95e1.gif)
设计最快完成路线与方式。
给出结果。
要求标出送货线路。
2.假定该送货员从早上8点上班开始送货,要将1~30号货物的送达时间不能超过指定时间,请设计最快完成路线与方式。
3.若不需要考虑所有货物送达时间限制(包括前30件货物),现在要将100件货物全部送到指定地点并返回。
要求标出送货线路,给出送完所有快件的时间。
由于受重量和体积限制,送货员可中途返回取货。
可不考虑中午休息时间。
二·
问题分析
在路线中,每个目的地看作图中的一个节点,各目的地之间的路看作图中连通节点的边,各条路的长度或行驶时间看作对应边上的权所给的线路网就转化为加权网络图,而所求问题就转化为在给定的加权网络图中寻找从给定点O出发行遍所有顶点至少一次再回到O点,使得总权即时间最短。
对于第一道题前三十个货到达的目的地的节点看作点集V,连接任意两点的路线所需时间作为权值赋给对应边,形成边集E得到加权图G(V,E)(因为32和38两地点通过35的路线比其他路都短所以可以两点直接连起而权值为32
的权值和)。
我们可以采用最小生成树法算出0点到任意一点的最短距离,然后根据最短路线逐次加边加权得到从0点出发回到0点的最短路线。
问题二我们将22个节点按时间限制划分为四个阶段,分别为:
最后得出总距离最短的具体路径
问题三;
我们将50个节点按路程近似三等分将区域分为3个区域,在对每个区域运用最小生成树法进行求解。
三·
问题假设
第一问;
1.假设重复的送货地点仍按一件货物的停留时间算,所以不用考虑主要与次要因素问题。
2.经过某一点停留时,才可以加权,否则不能加权。
3.假设送货员非常熟悉地理位置,送货中途不间断,不考虑中午休息时间。
同时也不考虑装货时间。
4.假设用平均速度代表他的行驶速度。
5。
针对第二问;
定义;
两点间最短距离。
就是在连通的所有路上选最短的路程。
如0-13两地的最短距离即为0-18-13的距离和
6.针对第三问;
(1)以上可大胆假设送货员中途返回两次,即三次送完。
(2)又因为每次送货都不超过50公斤,且货物总重148公斤,总体积为2.98立方米,所以三次送货每次携带的货物总重和总体积必须尽量均衡。
(3)可假设有三个送货员同时送货,结果只需把这三个的总时间加起来即可。
四·
模型的符号说明
m表示货物的重量
v表示货物的体积
t表示到达两个地点的时间
T表示总的时间
五·
模型的建立与求解
问题一若将1—30号货物送到指定地点并返回设计最短时间路线方式
经计算得前30号货物的重量是
=49.5公斤<
50公斤
体积为
0.9立方米<
1立方米
所以送货员可以一次送完,而不用考虑是否返回取货。
本题是图上点的行遍性问题。
只取30个点得到路线图如下所示
图
(1)(前30号货物的目的地除35号地点外)
本题可用最小生成树法求的最小生成树,然后再用模型的改进方案进行初选路线图,最小生成树图如下所示(程序见附录):
图(1.2)最小生成树图
但由于有些连通路线未考虑在内从而走了很多重复路线,所以很可能有比这更短的路径,现在对其改进如下:
(1)最小生成树法的改进模型
对图1的区域采用最小生成树法求出最佳送货路线,但由于其不是完全图所以不一定是最佳解,所以对该算法得到的解需要进一步修正。
在原来算法的基础上改进如下:
当两点之间没有直线连接时,应改进为使其两点的距离最短(两点之间可以经过若干个点).
通过上述修正,可以运用改进的最小生成树算法得到一个不是完全图的最优解H
设送货路线为总长为
,则我们要达到目标可以表示为min
,
为0或者1,即符合0~1规划模型。
这是一个目标规划模型,下面考虑求解模型的方法:
(28为所走的28条路线的路程)
(28为所走的28条路线的时间)
/60
计算结果如下表所示:
路线
所需时间(h)
路线长度(km)
O-18-13-19-24-31-27-39-27-31-
34-40-45-42-49-42-43-38-36-38
-35-32-23-16-14-17-21-26-O.
3.326
54.619
路线图(1.3)
针对问题二。
我们将22个节点按时间限制划分为四个阶段,分别为:
依据各分区域“路径均较短,则总路径较短”的原则。
各个阶段用最小生成树法求出最短路径。
第一阶段(9:
00以前必须完成)的目的地有(13,18,39,27,24)五个,从O点出发。
一共六个点.算出每两点之间的最短距离.(如0-13两地的最短距离即为0-18-13的距离和.)
由最小生成树得到的路线o-18-13-18-31-24-31-27-39;
实际上通过计算有13-18-31-24的路程6997m大于13-19-24的路程5715m。
经过改进得到最优路线为;
O-18-13-19-24-27-39
最短路程为15558m
花费的时间为(38.895+15)=53.895<
60分钟。
故第一阶段能按时完成。
同理第二阶段(9:
30以前必须完成)的目的地有(31,45,34,40)四个。
最优路线为;
39-31-34-40-45
最短路程为10049m
花费的时间为(25.1225+12)=37.1225
到达地点45的时间为9:
29.按时到达。
第三阶段(10:
15以前必须完成)的目的地有(43,42,49,38)四个。
45-42-49-42-43-38
最短路程为8056m花费的时间为32.14min
到达最后目的地的时间是10;
03<
10;
15
第四阶段(12:
00以前必须完成)的目的地有(32,23,16,36,26,21,14,17)八个。
38-36-38-35-32-23-16-14-17-21-26
最短路程为19220(m)
花费的时间为(48.05+24)=72.05(min)
到达的时间为11;
16
、故行走路线为;
O-18-13-19-24-27-39-31-34-40-45-42-49-42-43-38-36-38-35-32-23-16-14-17-21-26
其路程为53226.59m花费时间为3.27h
针对第三问;
用最小生成树法可得如下图所示的结果
物体的总重量为148kg<
150kg总体积为2.98m3<
3m3
所以我们假设三次送完。
将其分为三部分。
再对其分组:
按实际工作的经验以及以上生成树图有以下准则:
准则一:
尽量使同一干支及其分支上的点分在同一组;
准则二:
应将相邻的干支上的点分成一组;
准则三:
尽量将长的干枝与短的干支分在同一组。
由以上分组原则,我们找到两组分组形式
分组一:
(1,2)(3,4)(5,6)
分组二:
(6,1)(2,3)(4,5)
显然第二种分组不可能为最优解,首先从路线上将其排除,从而得到一种近似最优解,路线如图3.3
在各个子区域内,运用最小生成树法,找出该区域的最佳送货路线,近似解如下表所示:
分组
货物总重
货物总体积
路线总长度
总长度
总时间
1,2
0-26-31-34-40-47-40-37-41-44-48-46-33-28-30-22-
20-22-29-25-19-24-31-26-0
49.52
0.8360
44.557
122.407
行走时间
5.1
+
交货时间
2.5=
7.6
3,4
0-26-31-27-39-27-31-18-13-11-12-15-5-2-4-3-8-1-6-1-7-10-9-14-21-0
48.78
0.9890
44.385
5,6
0-2-17-23-16-23-32-35-38-43-42-49-50-45-36-21-0
49.70
0.9750
33.465
六模型检验
对于上述结果,分三个路线三次送货把整个图划分为三个区域比较均横非常符合模型假设;
且由每个路线货物的总重与货物总体积与所给总货物和总体积的限制范围的相对误差为:
因为总货物的总重量与所限制的总重量的相对误差很小,总体积与所限制的总体积的相对误差也很小,所以三中路线比较均横,检验可通过。
所以上述方案可为最优解,我们假设顺利通。
七模型的评价与推广
模型的优点;
(1)运用上述最小生成树法可得到一个图表,可以一目了然的的确定大概路线。
而在实际生活中,即需要这样的粗略路径来达到实际的目的。
(2)使用了准确的算法和适当的假设,使模型的准确性和实用性到达统一.
(3)对最小生成树法进行了改进.使模型更接近最优化.
模型的缺点;
(1)由于数据较多,没法使用工具进行模型的验证,只能一步一步的精化模型.
(2)本题采用最小生成树法,得出基本的路线图,得出具体情况确实费了一番功夫,运算量相对也较大。
(3)所求的最佳送货路线是近似最优解,而类似的近似最优解可以不止一个,未能在理论上证明本问题最优解得情况
模型的推广;
可充分使用到最短路的一系列问题的求解中。
对运输公司实现最优化和节约能源具有现实的意义。
同时也可运用到旅游方面。
八参考文献
(1)《运筹学》刘桂真等高等教育出版社
(2)《数学模型》姜启源谢金星高等教育出版社
附录;
MATLAB求距离的程序
ShapeX=[9185
1445
7270
3735
2620
10080
10025
7160
13845
11935
7850
6585
7630
13405
2125
15365
14165
8825
5855
780
12770
2200
14765
7790
4435
10860
10385
565
2580
1565
9395
14835
1250
7280
15305
12390
6410
13915
9510
8345
4930
13265
14180
3030
10915
2330
7735
885
11575
8010
];
ShapeY=[500
560
570
670
995
1435
2280
2525
2680
3050
3545
4185
5200
5325
5975
7045
7385
8075
8165
8355
8560
8835
9055
9330
9525
9635
10500
9765
9865
9955
10100
10365
10900
11065
11375
11415
11510
11610
12050
12300
13650
14145
14215
15060
14235
14500
14550
14880
15160
15325
N=length(ShapeX);
fori=1:
N
forj=1:
Distance(i,j)=sqrt((ShapeX(i)-ShapeX(j))^2+(ShapeY(i)-ShapeY(j))^2);
end
Distance
A=zeros(N);
Max_Value=zeros(N);
fork=1:
[max_line,column]=max(Distance(k,:
));
A(k,column)=max_line;
Max_Value(k,column)=max(max(A))
[I,J]=find(Max_Value)
point_start=[ShapeX(I)ShapeY(I)]
point_end=[ShapeX(J)ShapeY(J)]
问题1最小生成树法
#include<
stdio.h>
#include"
graph.h"
#defineINF32767//INF表示∞
#defineMAXE100//最多边数
typedefstruct
{intu;
//边的起始顶点
intv;
//边的终止顶点
intw;
//边的权值
}Edge;
voidDispMat(MGraphg)
//输出邻接矩阵g
{
inti,j;
for(i=0;
i<
g.vexnum;
i++)
{
for(j=0;
j<
j++)
if(g.edges[i][j]==INF)
printf("
%3s"
"
∞"
);
else
%3d"
g.edges[i][j]);
printf("
\n"
}
}
voidSortEdge(MGraphg,EdgeE[])//从邻接矩阵产生权值递增的边集
inti,j,k=0;
Edgetemp;
if(g.edges[i][j]<
INF)
{
E[k].u=i;
E[k].v=j;
E[k].w=g.edges[i][j];
k++;
}
for(i=1;
k;
i++)//按权值递增有序进行直接插入排序
temp=E[i];
j=i-1;
//从右向左在有序区E[0..i-1]中找E[i]的插入位置
while(j>
=0&
&
temp.w<
E[j].w)
{
E[j+1]=E[j];
//将权值大于E[i].w的记录后移
j--;
}
E[j+1]=temp;
//在j+1处插入E[i]
voidKruskal(EdgeE[],intn,inte)
inti,j,m1,m2,sn1,sn2,k;
intvset[MAXE];
n;
i++)vset[i]=i;
//初始化辅助数组
k=1;
//k表示当前构造最小生成树的第几条边,初值为1
j=0;
//E中边的下标,初值为0
while(k<
n)//生成的边数小于n时循环
{
m1=E[j].u;
m2=E[j].v;
//取一条边的头尾顶点
sn1=vset[m1];
sn2=vset[m2];
//分别得到两个顶点所属的集合编号
if(sn1!
=sn2)//两顶点属于不同的集合,该边是最小生成树的一条边
{
printf("
(%d,%d):
%d\n"
m1,m2,E[j].w);
k++;
//生成边数增1
for(i=0;
i++)//两个集合统一编号
if(vset[i]==sn2)//集合编号为sn2的改为sn1
vset[i]=sn1;
j++;
//扫描下一条边
voidmain()
inti,j,u=3;
MGraphg;
EdgeE[MAXE];
intA[MAXV][50];
g.vexnum=22;
g.arcnum=25;
A[i][j]=INF;
A[0][1]=1296;
A[0][2]=2182;
A[0][3]=1392;
A[1][6]=1823;
A[2][10]=2103;
A[2][4]=3113;
A[2][5]=5342;
A[3][10]=1537;
A[5][6]=2195;
A[5][7]=2607;
A[6][8]=1771;
A[7][8]=2097;
A[8][9]=1311;
A[10][11]=1780;
A[10][12]=1067;
A[10][20]=2324;
A[12][13]=2203;
A[12][18]=1779;
A[13][14]=1537;
A[13][17]=3182;
A[14][15]=2618;
A[15][16]=917;
A[16][17]=2351;
A[16][21]=1971;
A[17][19]=3217;
A[19][20]=1630;
A[j][i]=A[i][j];
g.edges[i][j]=A[i][j];
SortEdge(g,E);
printf("
图G的邻接矩阵:
DispMat(g);
克鲁斯卡尔算法求解结果:
Kruskal(E,g.vexnum,g.arcnum);
while(k