灾情最优路线设计 1998年数模A题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重大灾情最优巡查路线设计
承诺书
我们仔细阅读了中国大学生数学建模竞赛的竞赛规则.
我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。
我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。
如有违反竞赛规则的行为,我们将受到严肃处理。
我们参赛选择的题号是(从A/B/C/D中选择一项填写):
我们的参赛报名号为(如果赛区设置报名号的话):
所属学校(请填写完整的全名):广东商学院
参赛队员(打印并签名) :1. 邓思文
2. 苏境财
3. 吴妙
指导教师或指导教师组负责人(打印并签名):戴宏亮
日期: 2012 年 8 月11 日赛区评阅编号(由赛区组委会评阅前进行编号):
2010高教社杯全国大学生数学建模竞赛
编号专用页
赛区评阅编号(由赛区组委会评阅前进行编号):
全国统一编号(由赛区组委会送交全国前编号):全国评阅编号(由全国组委会评阅前进行编号):
重大灾情最优巡查路线设计
摘要
灾情巡视对于受灾地的救援工作有着重要意义,快速了解受灾地的情况,有利于加快援救工作,所以研究最佳巡视路线有着重要意义。
本文针对最佳路线及相关问题做出如下解答:
针对问题一,基于MTSP数学模型,运用了遗传算法,建立了最佳巡视路线模型,通过matlab编程,求解得出总路程最短且相对均衡的3组巡视路线,各组巡视路线如下:
第一组:O→P→26→27→28→Q→30→Q→29→R→A→33→31→32→35→34→D→1→O
第二组:O→M→25→20→L→19→J→18→I→15→I→16→17→22→K→21→23→24→N→26→P→O
第三组:O→C→3→D→4→8→E→9→F→10→F→12→H→14→13→G→11→E →7→6→5→2→O
针对问题二,通过估计方法估量组数范围,再利用问题一中所使用模型,对输入矩阵进行加权修改,构成定向时间矩阵,并通过matlab计算出结果,最后针对计算结果中的误差,验证估计结果是否正确,结果显示4组为最少组数。
针对问题三,首先计算出最远结点的最近距离,得到最小时间为6.44小时,再利用“就远原则”,得到最少组数为24组。
关键词:MTSP数学模型遗传算法定向时间矩阵就远原则
一、问题重述
灾情视察是了解受灾地的重要方法,设计合理快速的巡视路线对提高了解灾情的效率非常有帮助,根据下图一,回答以下问题:
图一
1.若分三组(路)巡视,设计路线最短且相对均衡的路线。
2.假定巡视人员在各乡(镇)停留时间T=2小时,在各村停留时间t=1小时,汽车行驶速度V=35公里/小时。
要在24小时内完成巡视,至少应分几组。
3.在上述关于T , t和V的假定下,如果巡视人员足够多,完成巡视的最短时间是多少,设计时间最短下的最佳巡视路线。
二、问题分析
设计最佳的巡视路线有利于提高视察灾情的效率,对尽快找到应对灾情的方案有很大的帮助。
为方便计算和观察,我们将原图制成一下如图二:
图二
针对问题一,题目要求3组总路线最短,且各组路线路程尽量达到均衡。
经初步分析,当只有一组人遍历所有乡镇和村的时候所花的时间最短,而随着人数的增加,总路程会随之增加,因此,我们要达到均衡,才有计算最短路线的意义。
我们可以根据MTSP 数学模型和遗传算法的方法,构造出各乡镇或村之间距离矩阵A 和最小距离矩阵B ,以3组中路程最大的巡视路线路程尽量小为目标,利用matlab 编程,近似设计出3组总路线最短且各组路程最均衡的最佳灾情巡视路线。
针对问题二,问题要求在24小时内,在限定行车速度,巡视停留时间的前提下,寻找最佳巡视路线,此可基于问题一的遗传算法MTSP 数学模型来解决,但比问题一相关问题稍为复杂。
问题二要求在24小时内完成巡视,根据我们的经验可知,时间越短,要完成遍历,只能增加组数,因此,我们将时间定在24小时,就可以保证组数最少。
为了避免运算的繁琐,我们事先对组数进行预计,然后再更改MTSP 数学模型中的矩阵,将矩阵A 改为有向时间矩阵,最后用matlab 计算出最优解。
又由于matlab 在运行时会出现重复路过的结点,从而造成最优解的时间大于24,因此最后我们要对结果进行修正,再得出真正的最优解。
针对问题三,为了确定完成巡视的最短时间,可直接找出距离县政府最远的乡镇或村,并对其沿路返回而不在其它乡镇或村停留,因此其所需的时间即为完成巡视的最短时间。
虽允许巡视人员足够多,但现实灾情考察中希望能设计出各组路线均衡、合情合理的最佳巡视路线,因此可根据由远及近原则,每次在未被巡视的乡镇或村中找出距离县政府最远的乡镇或村,并通过穷举思想选择满足最短时间限制的关联乡镇或村结点,而巡视人员将会在该联乡镇停留,类似不断地进行循环直至回到县政府起点。
这样由远到近不断循环地判断选择路线结点过程,能够设计出各组比较符合现实情况又满足在最短时间范围内的灾情巡视路线。
三、模型假设
(1)假设巡逻过程中没有出现特殊意外。
(2)假设已被访问的点仅被巡逻一次,重复经过的点不作为巡逻结点加入路径。
四、符号说明
符号 符号说明
y
最佳巡视路线最小值
A
距离矩阵
i p
道路被选择的概率
i
q
路线组合的概率 e
关联边权重 E 关联边总权重
N
所有道路与村镇停留总时间
),,,,,m ax (15311312c c c c i
县政府至各乡镇或村所需最短时间的最大值
i d
各结点的权,即在各乡镇或村停留的时间 ij e
结点间连线弧长,即路经各乡镇或村之间的
所需时间
min t
所需的最短时间
ij c
路经任意乡镇或村两两之间所需的最短时间
(不包括停留时间)
五、模型的建立与求解
5.1 基于遗传算法的MTSP 模型
遗传算法是模拟生物界自然选择和遗传机制的一种随机搜索最优解的算法,主要通过随机方式产生若干个数字编码(染色体)从而形成初始种群,并设定一个适应度函数,优胜劣汰并选择适应高的个体进行遗传操作,直到找到最优解。
针对从县政府分三组路线巡视考察灾情并使得总路线最短的情形,结合这两种原理,并考虑各组路线路程的均衡要求,即达到所有最大巡视路线的路程最小,这样能比较快速、准确地寻求出各组巡视路线。
5.1.1问题一的模型建立 (1)初始产生编码
图中起点县政府表示为“1”,乡镇节点“A,B,C,…,R ”分别表示为“2,3,…,18”,村节点“1,2,3,…,35”分别表示为“19,20,21,22,…,53”,则乡镇、村之间的对称距离矩阵为53X53的矩阵,记为A 。
其中,使用一个较大的数“inf ”表示两节点间无直接连接。
因灾情巡视路线分成三条,需再插入两个虚拟点54,55表示路线起点县政府(并没有将其纳入矩阵A 内),从而得到一个55位随机染色体编码,如:1,6,2,7,9,…18,54,3,8,22, …,34,55,8,35,….45。
对此,得到的三条路线可表示为:
1—6—2—7—9—……—18—1; 1—3—8—22—……—34—1;
1—8—35—……—45—1。
同时,矩阵A 的11a 应设为一个较大的数,“inf ”,以防出现“1—1—1”的路线,并且计算任意两节点间最小距离,得到矩阵B 。
(2)建立目标函数 目标函数是使三条巡视路线中路程最大的路线路程最小,满足均衡条件,
即:
y=min(max(321,,y y y ))
其中,
∑∑===53053
)(i j ijk ij k x c y ,
⎩⎨
⎧=j)
(i,k ,0j)
(i,k ,1不经过弧巡视路线经过弧巡视路线ijk x 而ij c 表示弧(i, j)的长度,即为(i, j)的权。
(3)确定适值函数,进行选择
因为以路程最小作为优化目标,因此可将适值函数定为:
)(y e f ⨯-=βα,βα,为正实数
若某个节点i 的适值为i f ,则其被选择的概率为
∑==
53
1i i
i
i f
f p
然后对各染色体编码计算出其累积的概率:
∑==M
i i i p q 1
最后利用轮盘赌选择法进行选择。
为了选择匹配的节点,需进行多轮选, 每一轮产生一个[0,1]均匀随机数,将随机数作为选择指针来确定备选节点。
(4)部分匹配交叉与交换变异
部分匹配交叉操作要求随机选取两个交叉点,由此确定一个匹配段,根据两个交叉点之间的中间段给出映射关系生成两个新节点。
交换变异,即交换随机位置上的基因,变异的概率不宜过高或过低。
(5)解码
将的到的最有染色体进行解码,得出三条适宜的路线。
在根据题目中所给的城镇距离构建一个53⨯53的矩阵,将该矩阵设为D 。
最后利用矩阵D 和三条最优路线解码得出结果。
5.1.2模型的求解
模型的求解过程主要是通过matlab 编程实现,代码见【附录1】。
(1)根据该县的乡镇和村公路网示意图,得出镇村之间距离矩阵A 。
其中,i,j 均表示城镇,ij a 表示镇i 与镇j 的距离。
则有:
⎥⎥⎥⎥⎥⎥⎥⎥
⎥⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=08.220.314.9......Inf Inf Inf Inf 8.20Inf Inf ......Inf 17.611.5Inf 20.3Inf 019......Inf Inf 7.4Inf 14.9Inf 190......Inf Inf Inf Inf ............................................................Inf Inf Inf Inf ......0Inf Inf 11.5Inf 17.6Inf Inf ......Inf 012.2Inf Inf 11.57.4Inf ......Inf 12.20Inf Inf Inf Inf Inf ......11.5Inf Inf 0
A 将矩阵A 输入到matlab 程序中。
(2)将矩阵输入后,程序运行得出结果如下:
由此可知,三组的走的路程如表5.1-1所示:
路线1的分组路线长度 组数 第一组 第二组 第三组 路程
194.9
159.3
215.9
表5.1-1
为比较均衡度,我们利用以上作法,做出多次结果,对其均衡度进行比较,比较根据为:
}
,,{max }
,,{min 321321u u u u u u R
结果如表5.1-2:
多组路线路程和均衡度比较表
组数 总路程 第一组 第二组 第三组 均衡度 路线1 570.1 194.9 159.3 215.9 0.734 路线2 632.2 199.1 228.1 205.1 0.874 路线3 622.9 193.9 236.5 192.5 0.814 路线4
630.7
230.3
202.8
197.6
0.858
表5.1-2
由此可知,路线1的均衡度最低,但是路程最短,因此我们还是选择路线1。
路线如图5.1-3:
路线1三条最短路线示意图
图5.1-3
第一组(红色线):O →P →26→27→28→Q →30→Q →29→R →A →33→31→32
→35→34→D →1→O
第二组(绿色线):O →M →25→20→L →19→J →18→I →15→I →16→17→22
→K →21→23→24→N →26→P →O
第三组(白色线):O →C →3→D →4→8→E →9→F →10→F →12→H →14→13
→G →11→E →7→6→5→2→O
5.1.3 结果分析
由上述结果可知,三组路程分别为194.9,159.3和215.9,总路程为570.1公里,而且三条路线长度相差不远,均衡度较高。
因此这种方案是可取的优化路线。
5.1.4 模型评价
对于问题一的解答,主要运用了遗传算法和MTSP 模型。
而这一个模型存在着随机性,而且得出的结果是近似解,不能保证每一次的结果都是符合实际要求的最优解。
运用matlab 进行求解的过程中,由于matlab 的局限性,求解速度较慢。
模型的求解中求得的是局部优化,求解过程容易导致形成局部最优解,而不是全局最优解,从而得到较大的误差。
5.2 MTSP 数学估计模型
通过对问题一的探究,我们知道了分三组的情况下,利用遗传算法和MTSP 数学模型得出了均衡下的最短总路程的路线。
问题二加入了限制条件,但理论上的内部机制是相同的。
因此我们对第一问的MTSP 数学模型进行修改,将MTSP 中的矩阵A 中的数据改变有向矩阵,将无向图以有向矩阵的形势表现。
5.2.1 问题二的模型建立
(1)将矩阵A 的数据改变,改变规则如下:
i .将矩阵中表示距离的权重改为路程S 除以速度V ,即关联边的权重改为时间。
并将节点的权重加入指向的边中。
即,若i,j 均表示城镇,则ij a 表示从镇i 到镇j 的时间加上镇j 的权重。
更改后的有向矩阵A 如下:
⎥⎥⎥⎥⎥
⎥⎥⎥
⎥⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=01.231.581.43......Inf Inf Inf Inf 1.230Inf Inf ......Inf 1.51.33Inf 1.58Inf 01.23......Inf Inf
1.21Inf 1.43Inf 1.230......Inf Inf Inf Inf ............................................................Inf Inf Inf Inf ......0Inf Inf
2.33Inf 2.5Inf Inf ......Inf 02.35Inf Inf 2.332.21Inf ......Inf 2.350Inf Inf Inf Inf Inf ......0.33Inf Inf 0
A
ii .预测分组数目。
令路线权重为i e ,i =A,B,C,D,…R,1,2,3,…35 求出所有关联边的权重:
E=
∑=35
A
i i
e
=95.13
关联边的总权重表示的是走遍所有的路程所用的总时间,令N 为分组数目,预测N 约为:
24
E
N
=3.96 由此可知,分组数目大约在3至4组。
下面我们将用修改后的MTSP 数学模型进行验证。
iii .利用matlab 程序,将组数定为3和4,分别运行两次,观察结果。
由于遗传算法的特点,导致最短路线有重复停留,计算结果会比实际结果大,因此要根据画出的路线,进行结果修正。
5.2.2 模型的求解
模型的求解主要是利用matlab 程序中的语句达成。
将组数N 定为3和4,分别运行两次。
得到4组的结果如下:
由此可知,四组的分别用的时间如下表5.2-1:
软件求解四组的时间
组数 第一组 第二组 第三组 第四组 时间 30.54 22.03 29.32 26.48
表5.2-1
由得出的结果发现,当组数为3时,不管如何均衡,都无法使时间最长组的最小时间小于24,而组数为4时可以,因此我们认为在问题二的条件下,要在24小时内完成巡逻,至少要分4组。
路线图如图5.2-2:
24时内完成巡逻的四组路线图
图5.2-2
由上图可知,在计算最短路径时易出现重复经过同一个节点,因此要进行结果修正,得出准确的最短时间。
路线如下:
第一组(红色线):O →'M →'25→20→19→J →11→G →12→F →10→'F →9
→E →8→4→D →'5→'M →O
第二组(咖啡色线):O →R →29→Q →30→32→31→33→35→34→A →1→B
→C →O 第三组(白色线):O →'M →25→21→K →18→I →15→14→H →'14→13→'J
→'19→L →7→6→5→2→3→'2→O
第四组(绿色线):O →P →26→27→28→'27→24→23→'22→17→16→'17→
22→'23→N →M →‘
26→P →O
5.2.3 结果分析
由上面结果求解的过程可知,由编程得出的最优解是有重复经过的,因此
我们要将重复经过的节点的权重删去。
上图中的'M ,'25,'F ,'5,'14,'J ,
'19,'2,'27,'22,'17,'23,‘
26
均为重复遍历的结点。
计算得每条路线的时间如下:
第一组:1t =30.54-8=22.54(小时) 第二组:2t =22.03(小时)
t=29.32-8=21.32(小时)
第三组:
3
第三组:
t=26.48-7=19.48(小时)
4
因此,我们至少可以用四组,在24小时内完成巡逻。
时间分配如下表5.2-3:
修改后的四组时间表
组数第一组第二组第三组第四组
时间22.54 22.03 21.32 19.48
表5.2-3
5.2.4 模型评价
第二问的解答是在第一问的基础上,加上了限制的条件,因此第二问计算时也存在着近似最优解的情况,因此需要对结果进行修正。
模型二改造了MTSP数学模型中的矩阵A,将矩阵A变为有向矩阵,方便本题的计算,使最优解的得出得以实现。
模型二利用简单估计的方法,为计算增加了便利性,减少计算中不必要的重复计算。
5.3 “就远原则”优化模型
已知巡视人员在各乡(镇)停留时间T=2小时,在各村停留时间t=1小时,汽车行驶速度V=35公里/小时。
假定允许巡视人数足够多,即对巡视人员分组不作严格要求,但在灾情考察现实情形下,希望巡视效率高的同时每组参与人员也尽量多。
因此,在最短时间内完成巡视并使得每组巡视人员访问的乡镇农村尽可能多,是我们需要寻找的最佳路线。
此处,基于就远原则,对离县政府较远的乡镇或村进行优先巡视,然后在满足最短时间要求下逐次巡视较近的乡镇或村。
5.3.1 模型的建立
(1)算出路线以及乡镇或村的时间权,并运用图论软件画出路线图,如图5.3-1:
图5.3-1
(2)基于上图,直接利用图论软件Floyd 表得出巡视任意乡镇和村之间的所需最小时间(不包括停留时间)矩阵C ,取县政府到任意乡镇或村(不包括停留时间)所需最小时间)53,,4,3,2(1 =i c i ,如表5.3-2:
县政府至各乡(镇)或村之间的所需最小时间(不包括停留时间)表
A B C D E F G H I J K L M 0.46 0.34 0.33 0.63 0.20 1.58 1.80 2.22 1.71 1.56 1.25 1.12 0.57 N P Q R 1 2 3 4 5 6 7 8 9 0.89 1.58 0.83 0.37 0.17 0.26 0.40 0.99 0.50 0.78 0.99 1.43 1.42 10 11 12 13 14 15 16 17 18 19 20 21 22 1.89 1.61 1.93 1.84 2.09 1.96 1.69 1.50 1.48 1.33 1.10 1.13 1.41 23 24 25 26 27 28 29 30 31 32 33 34 35 1.12 1.27 0.91 0.59 0.81 0.64 0.60 1.05 0.63 0.86 0.67 0.79
1.02
表5.3-2
(3)计算出最短时间
将各个乡镇或村记为“53,,4,3,2 ”,则各乡镇或村的权(停留时间)为
=i d 5332,,,d d d ,取=i d ⎩
⎨⎧==53,,19,18,217,,3,2,1 i i .
因此,所需最短时间为:=min t 2*),,,,,m ax (15311312c c c c i +i d 。
(4)寻找路线
i .当k =),,,m ax (1531312c c c 时,表示从起点1到点k 所需最短时间最大,有点1到点k 最短时间路线序列k L ,如:1—4—8—…—k ,并沿路返回且不在其它乡镇或村停留,得到第一条巡视路线为:1—4—8—…45—k —45—…—8—4—1,所需时间为min t 。
Ii .排除k 点,记i c =),,,m ax (1531312c c c ,i ≠k,得到巡视路线序列i L , 此时,所用时间i i d c t +=1。
设⎩⎨⎧=就连接
不与点连接
与点j i ,0j i ,1ij x ,
⎩⎨⎧=不被巡视,,仅仅路过被巡视i i 0i
,1i y ,(i ,j=2,3, (53)
且ij e 表示为从点i 与j (不在i 或j 停留)所需的时间
循环判断过程如下: 假设
k ij ij ij x x x === 21=1,且满足k
j
j j c c c 1112
1
>>> ,即表示点i 与点
k j j j ,,,21 之间可连通并且它们到起点i 所需时间依次从大到小排列。
若1111ij j j e d c t +++≤min t ,
则在序列i L 中点i 后添加点1j ,得1—4—8—…—i —1j 。
此时,已用时间t=111ij j i i
e d d c +++,
1j i y y ==1,
且将点1j y 形如点i 上述步骤按有远到近进行顺序循环。
否则,继续判断222
1ij j j e d c t +++≤min t 是否成立,若成立,如上述循环步骤,
不断增长路线序列i L ,直至回到县政府起点;若不成立,继续判断至k j 。
5.3.2 模型的求解
根据“就远原则”模型循环判断,在保证最短时间内,寻找出各组的最佳巡视路线,如表5.3-3:
最佳巡视路线表
组 数 最远乡镇 或村 路 径 被巡视乡 镇或村 时 间t
1 H 0-2-5-6-7-E-9-F-12-H-12-F-9-E-7-6-5-2-0 H 6.44
2 14 0-2-5-6-L-19-J-13-14-13-J-19-L-6-5-2-0 13,14 6.18
3 15 0-M-25-21-K-18-I-15-I-16-17-K-21-25-M-0 15,16 6.2
4 4 12 0-2-5-6-7-E-9-F-12-G-11-E-7-6-5-2-0 11,12 5.9
5 5 10 0-2-5-6-7-E-9-F-10-F-9-E-7-6-5-2-0 9,10 5.78
6 G 0-2-5-6-7-E-11-G-11-E-7-6-5-2-0 G 5.6
7 I 0-M-25-21-K-18-I-18-K-21-25-M-0 I,1
8 6.42 8 F 0-2-5-6-7-E-9-F-9-E-7-6-5-2-0 F,7 6.16
9 J 0-2-5-6-L-19-J -19-L -6-5-2-0 J,19 6.12 10 17 0-M-25-21-K-17-22-24-N-26-P-0 17,22,24 6.21 11 8 0-2-5-6-7-E-8-4-D-5-2-0 4,5,8 6.19 12 K 0-M-25-21-K-21-25-M-0 K,21 5.5 13 E 0-2-5-6-7-E-7-L-6-5-2-0 E,6 5.94 14 L 0-2-5-6-L-20-25-M-0 L,20 5.24 15 23 0-P-26-N-23-N-26-P-0 N,23,26 6,.24 16 30 0-R-29-Q-30-32-35-34-A-1-0 30,32,35 5.79 17 4 0-2-3-D-4-D-3-2-0 D,4 5.21
18 25 0-M-25-M-0 M,25 4.82
19 Q 0-R-29-Q-28-27-26-P-0 Q,27,28 6.11
20 34 0-1-A-34-A-33-A-1-0 A,33,34 6
21 31 0-R-31-R-1-0 R,31 4.26
22 D 0-2-3-D-3-2-0 D,2,3 4.63
23 29 0-P-29-P-0 P,29 4.44
24 B 0-C-B-1-0 B,C,1 5.88
表5.3-3
5.3.3 结果分析
由上表可看出,在允许巡视人员足够多的情况下,完成巡视的最短时间是6.44小时,并可分成24条巡视路线。
并且,巡视离县政府较远的乡镇或村路线所需的时间比尽可能大,比较接近最短时间6.44;巡视离县政府较远的乡镇或村路线所需的时间反而较小,一般在4-5小时范围内,这是由该“就远原则”由远及近地寻找最佳灾情巡视路线的特点。
5.3.4 模型评价
(1)优点:容易理解,算法简单,能找出比较合适的最佳灾情巡视路线;
(2)缺点:过程繁琐,实质上是按由远及近顺序的穷举法,解答消耗时间大,并
且各路线之间有许多重复的乡镇或村结点,同时有些许路线相比其它
路线并不是很均衡。
5.3.4 模型的改进与推广
针对回答问题三所用的“就远原则”模型,过程繁琐,耗费时间长,出错率高的缺点,我们可以选择利用C++编程实现这个过程。
因为C++运算速度高,准确率高,有利于我们更好完成“就远原则”模型。
本文的求解方法可以适用于交通路线的选择等实际问题。
六、参考文献
[1] 胡运权,《运筹学基础及运用》(第五版),2008
[2] 赵静、但琦,《数学建模与数学实验》(第二版),2006
[3] 韩中庚,《实用运筹学》,2007
[4] 王海龙、周辉仁、魏颖辉,基于遗传算法的一类多旅行商问题,2009
[5] 代坤、鲁士文、蒋祥刚,基于遗传算法的多人旅行尚问题求解,2004
【附录】
function varargout = mtspf_ga(dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res) %dmat 任意两点的最短路径矩阵通过floyed算法求得结果。
%salesmen 考察组组数
%min_tour 每个巡查组访问的村(镇)数
%pop_size 种群个体数
%num_iter 迭代的代数
%show_prog,show_res 显示的参数设定
nargs = 7; %处理输入参数,用来给定一些默认的参数;
for k = nargin:nargs-1
switch k
case 0
dmat = 10*rand(20,20);
case 1
salesmen = 5;
case 2
min_tour = 2;
case 3
pop_size = 80;
case 4
num_iter = 5e3;
case 5
show_prog = 1;
case 6
show_res = 1;
otherwise
end
end
% 检查输入矩阵
[nr,nc] = size(dmat);
if nr ~= nc
error('Invalid XY or DMAT inputs!')
end
n = nr - 1; % 除去起始的点后剩余的城镇的数
% 输入参数的检查
salesmen = max(1,min(n,round(real(salesmen(1)))));
min_tour = max(1,min(floor(n/salesmen),round(real(min_tour(1)))));
pop_size = max(8,8*ceil(pop_size(1)/8));
num_iter = max(1,round(real(num_iter(1))));
show_prog = logical(show_prog(1));
show_res = logical(show_res(1));
% 初始化路线、断点的选择
num_brks = salesmen-1;
dof = n - min_tour*salesmen; % 可以自由访问的点数
addto = ones(1,dof+1);
for k = 2:num_brks
addto = cumsum(addto);
end
cum_prob = cumsum(addto)/sum(addto);
% 初始化种群
pop_rte = zeros(pop_size,n); % 路径集合的种群
pop_brk = zeros(pop_size,num_brks); % 断点集合的种群
for k = 1:pop_size
pop_rte(k,:) = randperm(n)+1;
pop_brk(k,:) = randbreaks();
end
% 选择绘图时的巡查组的颜色可删去;
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0];
if salesmen > 5
clr = hsv(salesmen)
end
% 开始运行遗传算法过程
global_min = Inf; %初始化最短路径
total_dist = zeros(1,pop_size);
dist_history = zeros(1,num_iter);
tmp_pop_rte = zeros(8,n); %当前的路径设置
tmp_pop_brk = zeros(8,num_brks); %当前的断点设置
new_pop_rte = zeros(pop_size,n); %更新的路径设置
new_pop_brk = zeros(pop_size,num_brks);%更新的断点设置
if show_prog
pfig = figure('Name','MTSPF_GA | Current Best Solution','Numbertitle','off'); end
for iter = 1:num_iter
% 评价每一代的种群适应情况并作出选择。
for p = 1:pop_size
d = 0;
p_rte = pop_rte(p,:);
p_brk = pop_brk(p,:);
rng = [[1 p_brk+1];[p_brk n]]';
for s = 1:salesmen
d = d + dmat(1,p_rte(rng(s,1))); % 添加开始的路径
for k = rng(s,1):rng(s,2)-1
d = d + dmat(p_rte(k),p_rte(k+1));
end
d = d + dmat(p_rte(rng(s,2)),1); % 添加结束的的路径
dis(p,s)=d;
%d=d+myLength(dmat,p_rte(rng(s,1):rng(s,2)));%可调用函数处理end
total_dist(p) = d;
%distan(p)=max(dis(p,:));%计算三个人中的最大值
end
% 在每代种群中找到最好的路径
[min_dist,index] = min(total_dist);
dist_history(iter) = min_dist; %+max(distan);
if min_dist < global_min
global_min = min_dist;
opt_rte = pop_rte(index,:); %最优的最短路径
opt_brk = pop_brk(index,:); %最优的断点设置
rng = [[1 opt_brk+1];[opt_brk n]]'; %设置记录断点的方法
end
% 遗传算法算子的操作集合
rand_grouping = randperm(pop_size);
for p = 8:8:pop_size
rtes = pop_rte(rand_grouping(p-7:p),:);
brks = pop_brk(rand_grouping(p-7:p),:);
dists = total_dist(rand_grouping(p-7:p));
[ignore,idx] = min(dists);
best_of_8_rte = rtes(idx,:);
best_of_8_brk = brks(idx,:);
rte_ins_pts = sort(ceil(n*rand(1,2)));
I = rte_ins_pts(1);
J = rte_ins_pts(2);
for k = 1:8 % 产生新的方案
tmp_pop_rte(k,:) = best_of_8_rte;
tmp_pop_brk(k,:) = best_of_8_brk;
switch k
case 2 % 倒置操作
tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J));
case 3 % 互换操作
tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]);
case 4 % 滑动平移操作
tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]);
case 5 % 更新断点
tmp_pop_brk(k,:) = randbreaks();
case 6 % 倒置并更新断点
tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J));
tmp_pop_brk(k,:) = randbreaks();
case 7 % 互换并更新断点
tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]);
tmp_pop_brk(k,:) = randbreaks();
case 8 % 评议并更新断点
tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]);
tmp_pop_brk(k,:) = randbreaks();
otherwise % 不进行操做
end
end
new_pop_rte(p-7:p,:) = tmp_pop_rte;
new_pop_brk(p-7:p,:) = tmp_pop_brk;
end
pop_rte = new_pop_rte;
pop_brk = new_pop_brk;
end
% 返回结果部分
rng = [[1 opt_brk+1];[opt_brk n]]';
dis_e=zeros(1,salesmen) %设置并计算每个巡查组的最短路径
for s = 1:salesmen
dis_e(s)=myLength(dmat,opt_rte(rng(s,1):rng(s,2)));
end
if nargout
varargout{1} = opt_rte;
varargout{2} = opt_brk;
varargout{3} = min_dist;
varargout{4} = dis_e;
end
%做出迭代过程的图示
plot(dist_history)
grid on;xlabel('迭代的代数');ylabel('所走的路径之和')
% 随机产生一套断点的集合
function breaks = randbreaks()
if min_tour == 1 % 一个考察组时,没有断点的设置
tmp_brks = randperm(n-1);
breaks = sort(tmp_brks(1:num_brks));
else % 强制断点至少找到最短的履行长度
num_adjust = find(rand < cum_prob,1)-1;
spaces = ceil(num_brks*rand(1,num_adjust));
adjust = zeros(1,num_brks);
for kk = 1:num_brks
adjust(kk) = sum(spaces == kk);
end
breaks = min_tour*(1:num_brks) + cumsum(adjust);
end
end
end
两点间最短距离程序:
function matrix=floyed(G)
%存储无向图的邻接矩阵
%{
G=[ inf inf 10 inf 30 100;
inf inf 5 inf inf inf;
inf 5 inf 50 inf inf;
inf inf inf inf inf 10;
inf inf inf 20 inf 60;
inf inf inf inf inf inf;];
%}
d(1,:,:)=G;
%处理第一行与第一列对应相加时,可以优化的距离
for i=1:size(G,1)
for j=1:size(G,2)
s(i,j).trace=i;
if d(1,i,j)<=d(1,i,1)+d(1,1,j)
d(1,i,j)=d(1,i,j);
else
d(1,i,j)=d(1,i,1)+d(1,1,j);
end
end
end
%处理从第二到顶点个数个时的路径优化
for k=2:size(G,1)
for i=1:size(G,1)
for j=1:size(G,1)
if d(k-1,i,j)<=d(k-1,i,k)+d(k-1,k,j)
d(k,i,j)=d(k-1,i,j);
else
d(k,i,j)=d(k-1,i,k)+d(k-1,k,j);
end
end
end
end
matrix=zeros(size(G,1),size(G,1));
matrix=d(size(G,1),:,:);
matrix=reshape(matrix,size(G,1),size(G,1));
计算距离:
function len=myLength(D,p)
N=length(p);
len=D(p(1,N),1)+D(1,p(1,1));
for i=1:(N-1)
len=len+D(p(1,i),p(1,i+1));
end
运行程序:
clear all;clc;close all;
load lujing; %其中存储图的邻接矩阵以县政府为起点dmat=floyed(tu); %求图所对应的最短路径矩阵;
n=1
for i=1:1
[x1,x2,x3,x4]=mtspf_ga(dmat,4,16,100) %返回求得最优解。
end。