灾情巡视路线.docx
《灾情巡视路线.docx》由会员分享,可在线阅读,更多相关《灾情巡视路线.docx(17页珍藏版)》请在冰豆网上搜索。
灾情巡视路线
灾情巡视路线的优化模型
摘要:
这是一个分组离散的网络图论问题,本文的主要思想是将巡视路线的设计分为两个部分:
首先生成一个可行的巡视路线,然后利用启发式算法对巡视路线进行调整;即利用prim算法得到最小生成树分组,然后将每棵树转化为求旅行商最短回路的MSTP问题,利用Dijkstra算法求得最短回路。
问题一中,首先给出了原图的最小生成树图,再根据树图进行了简单的分组,分别讨论出最短路线,由于题中要药均衡的巡视路线,因此引进均衡度,再进行综合考虑得出最后结论。
问题二中,首先在时间限制要求下,至少需要将原图划分为四个子图,再利用树状图大致划分出这四组,找出最优解。
问题三中,加上上给定的时间参数,完成巡视的最短时间受到单独巡视完离县城最远的乡(镇)或最远村所需时间得限制。
采用一题中图上Dijkstra算法,可以求得从县城到各点的最短距离,进而在分组细分,得出最优模型。
关键词:
灾情巡视路线;优化模型;数学模型;最小生成树
一、问题的提出
98年夏天某县遭受水灾,下图为该县的乡(镇)、村公路网示意图,公路边的数字为该路段的公里数。
为考察灾情、组织自救,县领导决定,带领有关部门负责人到全县各乡(镇)、村巡视。
巡视路线指从县政府所在地出发,走遍各乡(镇)、村,又回到县政府所在地的路线。
问题:
1、若分三组(路)巡视,试设计总路程最短且各组尽可能均衡的巡视路线。
2、假定巡视人员在各乡(镇)停留时间T=2小时,在各村停留时间t=1小时,汽车行驶速度V=35公里/小时。
要在24小时内完成巡视,至少应分几组;给出这种分组下你认为最佳的巡视路线。
3、在上述关于T,t和V的假定下,如果巡视人员足够多,完成巡视的最短时间是多少;给出在这种最短时间完成巡视的要求下,你认为最佳的巡视路线。
若巡视组数已定(如三组),要求尽快完成巡视,讨论T,t和V改变对最佳巡视路线的影响。
4、若巡视组数已定(如三组),要求尽快完成巡视,讨论T,t和V改变对最佳巡视路线的影响。
二、基本假设
(1)各巡视组的车的速度相同,且都为匀速行驶。
(2)各视组经过邻县的村及非本组巡视的乡(镇)或村时都只路过,不停留。
(3)巡视组都是从县政府出发,走遍各乡(镇)、村后,又回到县政府。
(4)巡视人员在各乡(镇)停留2小时,在各村停留1小时,汽车匀速行驶的速度为每小时35千米。
(5)巡视组在巡视时不考虑环境因素的影响,天气正常,无突发事件。
(6)各组在巡视过程中,路面正常、畅通,车均能正常行驶。
三、符号的说明
乡(镇)
A、B、C、...O、P、Q
村
1、2、3、...34、35
巡视组组数
第
组的最短路程
巡视人员在乡(镇)的巡视时间
T
巡视人员在村的巡视时间
t
汽车行驶速度
v
直接巡视完第j点所需要的时间
均衡度
四、建立模型与求解
3.1模型分析
问题一,只从路程上考虑,要使得总的路程最短且尽量分布均匀,即每组所走的路程尽量短且相差尽量小。
对于此问题我们先考虑大致分出各组的巡视路线,寻找较优的一些解;再从这些解中综合考虑使得每组所走路程相差不大的解,从中得出最优解。
由于原图较复杂,对于巡视组的大致划分,我们可以利用原图的最小生成树(县城为树根)原理,首先用破圈法找出从O到各个地方的最短路径的树图。
其次在对树图的树枝进行编号,最后讨论其分组:
将其大致划分为三个部分,得出最优方案找出最小生成树后从中寻求每个部分的最短路,最终比较得出最优解。
问题二,从时间上考虑,已知条件有T=2,t=1,汽车行驶速度V=35公里/小时,全县共17乡(镇)(除O外),34个村,仅停留时间共需
小时,若分为三组,每组平均用时需23小时,加上距离一定会大于24小时,所以用三组不能够在24小时内完成巡视。
故至少需要考虑分为四组,再利用树状图大致划分出这四组,找出最优解。
问题三:
考虑在时间限制条件下的最优解。
事实上是在时间参数条件下给定的,完成巡视的最短时间受到单独巡视完离县城最远的乡(镇)或最远村所需时间得限制。
采用一题中图上Dijkstra算法,可以求得从县城到各点的最短距离,进而在分组细分,得出最优模型。
3.2模型的建立与求解
本题的第一问,要求设计分三组巡视时使总路程最短且各组尽可能均衡的路线。
转化为在给定的加权网络图中寻找从
点出发,行遍所有顶点至少一次再回到
点,使得总路程最小的问题。
记三组的巡视路线长度从小到大分别为
、
、
则需要求解此问题的目标数学表达式关系为:
以及
但是由于这两个目标是相互矛盾的,即不可能同时达到最小;因此在求解时因注意在两者兼顾的条件下寻找最优解。
为了避免繁杂,我们将这两个目标表达式转换成另一个较合理的目标表达式:
根据前面的分析,首先运用破圈法找出从县政府通往各乡(镇)、村的最短路径,并对其分支编号,最后得出下图:
过程见附录程序1
图1
有上图容易将图大致分为三部分,要使得三组巡视时使总路程尽量最短,我们容易找到两种分法如下:
分法1:
(6,1),(2,3),(5,4)
如图:
分法1
对于分法一的求解:
组名
路线
路线长
总路线长
一
O-P-28-27-26-N-24-23-22-17-16-I-15-I-18-K-21-20-25-M-O
191.1
599.8
二
O-2-5-6-7-E-9-F-12-H-14-13-G-11-J-19-L-6-5-2-O
216.4
三
O-E-29-Q-30-32-31-33-35-34-A-1-B-C-3-D-3-2-O
192.3
分法2:
(1,2),(3,4),(5,6)
如下图:
分法2
对于分法二的求解:
组名
路线
路线长
总路线长
一
O-P-28-27-26-N-24-23-22-17-16-I-18-K-21-20-25-M-O
191.1
558.5
二
O-2-5-6-L-11-G-13-14-H-12-F-10-F-9-E-7-E-8-4-D-3-C-O
241.9
三
O-R-29-Q-30-32-31-33-35-34-A-B-1-O
125.5
对他们的求解过程详见附录中程序2
从以上两表可以得出,从总路程长度考虑应当选择方案二,但从路程的均衡方面看,应当选择方案一。
由此,我们引进衡量路程均衡的均衡度:
定义:
均衡度
对于分法一,均衡度
对于分法二,均衡度
显然分法二的均衡度很差,二分法一的均衡度较好,经综合考虑我们最终选择分法一方案。
即每组所走路程分别为:
191.1公里;216.4公里;192.3公里,总路程为599.8公里
对于第二问:
首先还是利用最小生成树的分解法,将原图分解成树图,如上题中的图1;
四组时同三组类似,首先我们把树图分成四部分,使得每组在自己的巡视区域中停留时间尽量相等,且让每组所走区域相对集中。
由于题中共有17个乡镇和35个村,停留时间共需要:
小时,因此每个组大约停留的时间为
小时
那么首先考虑区域的划分,使得每个组停留的时间在17小时左右,由这一条件,经综合分析后将原图大致划分为四个子图,如下图所示:
最后再考虑路程,其方法是通过增边、换边等策略来找尽量短回路,其回路如图所示:
各组巡视情况如下表:
组名
路线
路线长度
停留时间
行走时间
完成总时间
1
O-2-5-6-7-E-11-G-12-H-12-F-10-F-9-E-7-6-5-2-O
195.8
17
5.59
22.59
2
O-(R)-29-Q-30-Q-28-27-26-N-24-23-22-17-16-17-(R)
199.2
16
5.69
21.69
3
O-M-25-20-21-K-18-I-15-14-13-J-19-L-6-O
159.1
18
4.54
22.54
4
O-R-A-33-31-32-35-34-B-I-C-3-D-A-D-3-O
166
38
4.74
22.74
问题三
如下图所示:
在O点至所有点的最短距离中,O到H的距离最长,为77.5公里。
那么,可以从O点出发,沿最短路线到达H点巡视,然后原路返回,沿途经过的点一律不停,所用的时间为:
小时,H离O最远又代表县城,故这是在所给条件下完成的最短时间。
所以完成巡视至少要用6.43小时。
那么,根据这个时间限制再找出最佳巡视路线。
起作法如下:
(1)对于H点按上述最短路方法巡视,记为第一组;
(2)对第二组,从次远点考虑。
次远点为14点,时间为
小时,而
,可见,这一组还可以顺便巡视一个村,在这条路上13与14相邻,那么,巡视13点,时间为6.16小时。
如图:
(3)第三组,再从次远点15考虑,从O到15点的最短时间为
由于
,可见,这组可再巡视一村,从路中的相邻点中找出一伟巡视点18,因此所用时间为5.94小时。
如下图:
(4)第四组,再从次远点10考虑,从O到10点的最短时间为
由于
,可见,这组可再巡视一村,经过综合考虑选择出点8,因此所用时间为6.22小时。
如下图:
以后的各组可以类似地检验得出。
即对点
,计算出
及
,
若
,不再加点:
若
,则可以加一个村;若
,则可加乡或者村。
由此找,最后我们找出22组,其结果如下表:
组号
巡视路线
停留点
所用时间
1
O-2-5-6-7-E-9-F-12-H-12-F-9-E-7-6-5-2-O
H
6.43
2
O-2-5-6-L-19-J-13-14-13-J-19-L-6-5-2-O
14、13
6.16
3
O-M-25-21-K-18-I-15-I-K-21-25-M-O
15、18
5.94
4
O-2-5-6-7-E-8-E-9-F-10-F-9-E-7-6-5-2-O
10、8
6.22
5
O-M-25-21-K-17-16-17-K-21-25-M-O
16、17
5.445
6
O-2-5-6-7-E-9-F-12-6-11-E-7-6-5-2-O
12、11
5.845
7
O-M-25-21-K-21-20-25-M-O
K、20
5.867
8
O-2-5-6-7-E-11-G-11-E-7-6-5-2-O
G
5.582
9
O-M-25-21-K-18-I-18-K-21-25-M-O
I
5.49
10
O-2-5-6-L-19-J-19-L-6-5-2-O
J、19
6.102
11
O-2-5-6-7-E-9-F-9-E-7-6-5-2-O
F、9
6.148
12
O-2-5-6-L-6-5-2-O
L、6、5
6.228
13
O-2-5-6-7-E-7-6-5-2-O
E、7、2
6.382
14
O-M-25-21-25-M-O
21、M、25
6.262
15
O-P-26-N-23-22-23-24-N-26-P-O
22、23、24
6.30
16
O-P-26-N-26-27-26-P-O
27、26、N
6.23
17
O-R-29-Q-30-Q-28-P-O
Q、30、28
6.11
18
O-R-31-32-35-34-A-1-O
31、32、34、35
6.32
19
O-1-A-53-31-R-29-R-O
A、33、29
5.97
20
O-2-3-D-4-D-3-2-O
4、D、3
5.99
21
O-P-Q-R-O
P、R
5.32
22
O-1-B-C-O
1、B、C
5.98
五、模型评价
该模型做出了题中给出要求的一些较优的解,但没有找出每个模型的最优意义解,在寻找解时,采用的是图形,运用的是图论的一些基本方法,没有给出数学表达式的限制条件,而是采取直接从图中寻求优解。
参考文献
[1]钱颂迪主编,运筹学,清华大学出版社,1990年
[2]肖位枢主编,图论及其算法,航空工业出版社,1993年
[3]王树禾主编,数学模型基础,中国科学技术大学出版社,1996年
[4]叶其孝主编,大学生建模竞赛辅导教材,湖南教育出版社,1998年
附录
程序1,求最小生成树:
T=[];l=0;%l记录T的列数
q
(1)=-1;
fori=2:
n
p(i)=1;q(i)=D(i,1);
end
k=1;
while1
ifk>=n
disp(T);
break;
else
min=inf;
fori=2:
n
ifq(i)>0&q(i)min=q(i);
h=i;
end
end
end
l=l+1;
T(1,l)=h;T(2,l)=p(h);
q(h)=-1;
forj=2:
n
ifD(h,j)q(j)=D(h,j);
p(j)=h;
end
end
k=k+1;
end
程序二,求每组的最短路程序:
function[S,D]=minRoute(i,m,W)
%图与网络论中求最短路径的Dijkstra算法M-函数
%格式[S,D]=minroute(i,m,W)
%i为最短路径的起始点,m为图顶点数,W为图的带权邻接矩阵,
%不构成边的两顶点之间的权用inf表示。
显示结果为:
S的每
%一列从上到下记录了从始点到终点的最短路径所经顶点的序号;
%D是一行向量,记录了S中所示路径的大小;
%例如
%clear;w=inf*ones(6);w(1,3)=10;w(1,5)=30;
%w(1,6)=100;w(2,3)=5;w(3,4)=50;w(4,6)=10;
%w(5,4)=20;w(5,6)=60;
%i=1;[s,d]=minroute(i,6,w)
%ByX.D.DingJune2000
dd=[];tt=[];ss=[];ss(1,1)=i;V=1:
m;V(i)=[];dd=[0;i];
%dd的第二行是每次求出的最短路径的终点,第一行是最短路径的值
kk=2;[mdd,ndd]=size(dd);
while~isempty(V)
[tmpd,j]=min(W(i,V));tmpj=V(j);
fork=2:
ndd
[tmp1,jj]=min(dd(1,k)+W(dd(2,k),V));
tmp2=V(jj);tt(k-1,:
)=[tmp1,tmp2,jj];
end
tmp=[tmpd,tmpj,j;tt];[tmp3,tmp4]=min(tmp(:
1));
iftmp3==tmpd,ss(1:
2,kk)=[i;tmp(tmp4,2)];
else,tmp5=find(ss(:
tmp4)~=0);tmp6=length(tmp5);
ifdd(2,tmp4)==ss(tmp6,tmp4)
ss(1:
tmp6+1,kk)=[ss(tmp5,tmp4);tmp(tmp4,2)];
else,ss(1:
3,kk)=[i;dd(2,tmp4);tmp(tmp4,2)];
end;end
dd=[dd,[tmp3;tmp(tmp4,2)]];V(tmp(tmp4,3))=[];
[mdd,ndd]=size(dd);kk=kk+1;
end;S=ss;D=dd(1,:
);