1、基于 Dijkstra 算法的环游世界最佳路径选择数学建模协会编号:69姓名 1 :李明宇 姓名 2:杨军 姓名 3:艾建行指导教师:李学文评阅编号:评阅专家 1 评阅专家 2 评阅专家 3 评阅专家 4 评阅专家 51摘 要本文根据题中所给数据,通过建立基于 Dijkstra 算法的最短路径模型,为著名的80 天环游世界中福格的壮举选取最优路径,从而判断出基于当时的交通环境不能实现该想法,同时解决了当起点发生改变时能否通过寻找最佳路径,达到在一定时间内完成环游世界的目的。在具体求解过程中,我们将从伦敦环游世界的不同路线的交通网络图划分成五个小区域,然后利用 Dijkstra 算法求取出各个区
2、域的不同起点到各个终点的最短路径,然后将五个区域组合,得到简化后的环游世界的交通网络图,最后用同一算法得到从伦敦出发,环游世界的最短天数为 81 天,最佳路径为:1 伦敦 6 Pairs 7 Barcelona 12 Budapest 17 Athens 22 Cairo 23 Aden 28 Bombay 31 Calcutta 33 Singapore 35 Hong Kong 37 Shanghai 39 Yokohama 41 San Francisco 47 Denver 50 Chicago 53 New York 1 伦敦,从而得出他不能赢得赌注的结论,同时,80 天与 81 天
3、相差不多,且注意到题中 31-32 15-19 之间所需天数未给出,若已知该时间且不长,则很有可能所需天数少于 80 天。运用类似方法计算出当环游世界的起点变为上海时,依据同一交通路线图并且在交通环境没有变化的前提下,得到环游世界的最短天数为 77 天,最短路径为:37 Shanghai 39 Yokohama 41 San Francisco 47 Denver 50 Chicago 53 New York 2 Lisbon 4 Madrid 7 Barcelona 12 Budapest17 Athens 22 Cairo 23 Aden 28 Bombay 31 Calcutta 33
4、Singapore 35 Hong Kong 37 Shanghai,从而得到此时他可以赢得赌注的结论。最后,我们对 Diskstra 算法进行了优化,从而提高了求最短路径时的运行速度,增加了算法的执行效率。关键字:Dijkstra 算法 最优路径 分区简化 标号法2一 问题重述在儒勒凡尔纳的著名小说环游世界 80 天中,英国绅士福格在伦敦与人打赌能够在 80 天内环游世界,这在当时的 1872 年是一个了不起的壮举。当时最快的旅行方式是火车和轮船,然而世界上大部分地区还是靠马车、大象、驴子或者步行来旅行。下面是一个从伦敦环游世界不同路线的交通网络图,福格选择的是往东走,每段路线所需要的天数显
5、示在图上,旅行的时间基于 1872 年能采用的旅行方式以及距离。1 请设计一个算法为福格选择一条最佳路径,即环游世界天数最短,你选择的路径能让他赢得赌注吗?2 如果他在别的地方与人打赌,比如纽约或者上海,结果会怎样?交通网络图如下:3二 问题分析1.对问题一的分析:问题一要求通过设计一个算法选择最佳路径,并判断福格是否能在八十天内环游世界。我们可以通过将题中所给的交通网络路线图分区域寻找最佳路径,达到简化的效果,最后得到合并后的简化的交通路线图,从而得到最短路径以及此时所需的时间。2.对问题二的分析:问题二将环游世界的起点改变为上海或纽约,在此我队对从上海出发继续向东旅行的情况利用相似的方法进
6、行求解,从而判断出此时的最短路径及所需最少的时间。三 模型假设与符号说明(一) 模型假设1. 题中所给的交通网络路线图所提供的时间准确。2. 福格在旅行中没有发生意外情况导致旅行路线发生改变。3. 起点改变时其他条件均不变。4. 除出发点外,每个地点只到达一次。(二) 符号说明由顶点 V,弧 A,和权值 W 组成的有向网络DVAW( , , )P D 中从 到 的一条路svtP 中所有弧的权之和w( )到 自身的长度iusvi四 模型建立与求解41 问题一的分析与求解(1)模型的引入:取最短路径问题给定有向网络 ,任意弧 ,有权 ,给定DVAW( , , ) ijaAijijwa( )D 中的
7、两个顶点 , 。设 P 是 D 中从 到 的一条路,定义路 P 的权(长度)svt svt是 P 中所有弧的权之和,记为 。最短路问题就是要在所有从 到 的路w( ) svt中,求一条路 P0 ,使 0P()min()称 是从 到 的最短路。路 P0的权称为从 到 的路长,记为 。0svt svt stuDijkstra 算法思想:将 中 到所有其它顶点的最短路按其路长从小到大排DVAW( , , ) sv列为: 012uun表示 到自身的长度,相应最短路记为: 一定只有一条弧,0usv 012P,n, ,,记取最小值的点为 ,1v。11Psv( , )假定 的值已求出,对应的最短路分别为:0
8、1 ku, , , 122Pv,Pv,ssksk ( ,) ( ) ( )记 12,., Xkksk kXV则 1iXmnw(,)ikkivuv使上式达到最小值的点 可取为 。1k计算过程中可采用标号方法:000 01X, VX ,mis sivXuw则5中的点, 值是 到 的最短路长度,相应的点记“永久”标号;kXiusvi中的点, 值是 到 的最短路长度的上界,相应的点记 “临时”标号,isi供进一步计算使用。前点标号 : 表示点 到 的最短路上 的前一点。如 ,isvj jvim表示 vs到 的最短路上 前一点是 。j jvmDijkstra 算法步骤:第 1 步:令 , 则令 0,sj
9、sj sjuwnaA( 1) 若, , , , sjsXv0VXk0i(0jn)第 2 步:(选永久标号)在 中选一点 ,满足kivX mnKjijvu如果 ,停止,从 到 中各点没有路;否则,转第 3 步。iusk第 3 步:(给点 永久性标号)令iv11 , kkikkivv如果 ,结束,到所有的点的最短路已经求得 ;否则,转kX第 4 步。第 4 步:(修改临时标号) 对所有,1 Xkjv如果 ,令 ijj wuijjiijiuw,否则, 不变,把 k 换成 k+1,返回第 2 步。ij(2)模型的求解:交通网络图如下:6在这张地图上所涉及的共有 54 个点,若再加上周期延拓,该数字将达
10、到60,将这 60 个点之间的关系表现在矩阵中,不仅会造成输入繁琐出错可能性大、移植性差等问题,还由于矩阵所占空间与点的个数成二次曲线,点过多将大幅度提升计算机的负担,延长运算时间,降低模型的效果。因此我们将这个地图分为 5 个模块,每个模块中含有 9 21 个点不等,有效提高了建模的效率。:这 5 个模块分别如下所示:78模块 1 简化后结果:9上图中,以伦敦为出发点,分别以 18(St.Peterburg) 、19(Moscow) 、20(Kiev) 、21(Istanbul) 、17(Athens)为终点,得出了由起点到各终点的最短时间分别为 913131011 天。模块 2 简化后结果
11、:模块 2 以模块 1 的终点:18(St.Peterburg) 、19(Moscow) 、20(Kiev) 、21(Istanbul) 、17(Athens)为起点,以 27(Novosibirsk) 、24(Tehran) 、 23(Aden)为终点,得出了各起点至终点的最短天数。图中数字含义同模块 1.模块 3 简化后结果:10模块 3 以模块 2 的终点:27(Novosibirsk) 、24(Tehran) 、 23(Aden)为起点,以 34(Beijing) 、37(Shanghai) 、35(Hong Kong) 、33(Singapore)为终点,得出由各起点至终点的最短天数
12、。模块 4 简化后结果:11该模块原理同前模块,以 34(Beijing) 、37(Shanghai) 、35(Hong Kong) 、33(Singapore)为起点,以 42(Seattle) 、41(San Francisco) 、43(Los Angeles)45(Panama)为终点。模块 5 简化后结果:12以上为模块 5,以 42(Seattle) 、41(San Francisco) 、43(Los Angeles)45(Panama)为起点,1(伦敦) 、2(Lisbon) 、3(Casablanca)为终点,本模块中本不需要 2(Lisbon)3(Casablanca) ,
13、只需要终点伦敦即可,但考虑到模块的完整性和后面模型的需要将其加入。经过以上模块的分解,我们将一个很大的地图化解为 5 个较小的图,这 5 个模块的起点与终点之间的所有点就可以忽略不计,只考虑起点与终点之间的天数即可,将一个 54 点的图化为了 1+5+3+4+4=17 点的图,再将这个 17 点图带入Dijkstra 算法中求解即可得出最短天数的路径为:1 伦敦 6 Pairs 7 Barcelona 12 Budapest 17 Athens 22 Cairo 23 Aden 28 Bombay 31 Calcutta 33 Singapore 35 Hong Kong 37 Shangha
14、i 39 13Yokohama 41 San Francisco 47 Senver 50 Chicago 53 New York 1伦敦所需最短天数为:81 天。80 天与 81 天相差不多,且注意到题中 31-32 15-19 之间所需天数未给出,若已知该时间且不长,则很有可能所需天数少于 80 天。2 模型二的求解:从上海绕行与从伦敦绕行思路相同,只是模块稍有不同:模块 1:本模型中上海作为起点 34(Beijing)35(Hong Kong)33(Singapore)本不需要,但考虑到模块的完整性这里将其加入,图中数字与前相同。模块 2:14模块 3:15模块 4:16模块 5:17利
15、用 Dijkstra 算法中求解即可得出最短天数的路径为:37 Shanghai 39 Yokohma 41 SanFrancisco 47 Senver 50 Chicago 53 New York 2 Lisbon 4 Madrid 7 Barcelona 12 Budapest 17 Athens 22 Cario 23 Aden 28 Bombay 31 Calutta 33 Singapore 35 Hong Kong37 Shanghai最短天数为 77 天,得出他如果在上海出发,则可以赢得赌注。五 模型优化18由于经典 Dijkstra 算法在节点个数较多时会出现运行效率低,内存
16、占用大,出错率高,灵活性差等缺点,于是我们对经典 Dijkstra 算法进行了优化,对搜索网络进行了分区域处理得到“优化 Dijkstra 算法”从模型的求解过程可以看出,若将该地图分为几个模块,即使要换一个地点来计算最短时间也可以很快解决,直接套用原模块即可,但是若将整个地图全部输入矩阵中,一旦更换地点,将不得不重新输入图矩阵,图的规模越大,这样所浪费的时间越多,出错率越高,分块的优点就充分体现了出来。优化Dijkstra算法与原始Dijkstra算法的搜索范围比较示意图如图22所示。由图22可见,原始Dijkstra算法的搜索过程(见图22a),是以源点为圆心的一系列同心圆,搜索过程没有考
17、虑终点所在的方向或位置,在从源点出发的搜索过程中,其他结点与终点被搜索到的概率是相同的。“优化Dijkstra算法”的搜索过程(见图22b)是以源点和终点为焦点的一系列“同心椭圆”,永久标记点的选取原则为:当前结点距源点的最短距离与此结点到终点的直线距离之和最小者被选取为永久标记点。所以搜索过程趋向于终点,搜索过程到达终点的速度明显快于原始Dikstm算法,搜索到的结点也少于原始Dijkstra算法。六 参考文献1 费培之 图和网络及其应用 四川大学出版社 1996.82 李雷 基于地图分区算法求解动态最佳路径的研究与实现江苏大学硕士学位论文 2004.63 杨长保,王开义,马生密 一种晟短路
18、径分析优化算法的实现吉林大学学报(信息科学版)第20卷,第2期,2002年6月194 柬涛,范东明 OlS 分析中最短路径问题的圈论解决方法 四川测绘,2002 年 04 期七 附录function S,D=minRoute(i,m,W)%图与网络论中求最短路径的 Dijkstra 算法 M-函数% i 为最短路径的起始点,m 为图顶点数,W 为图的带权邻接矩阵,% 不构成边的两顶点之间的权用 inf 表示。显示结果为:S 的每% 一列从上到下记录了从始点到终点的最短路径所经顶点的序号;% D 是一行向量,记录了 S 中所示路径的大小;dd=;tt=;ss=;ss(1,1)=i;V=1:m;V
19、(i)=;dd=0;i;% dd 的第二行是每次求出的最短路径的终点,第一行是最短路径的值kk=2;mdd,ndd=size(dd);while isempty(V)tmpd,j=min(W(i,V);tmpj=V(j);for k=2:nddtmp1,jj=min(dd(1,k)+W(dd(2,k),V);tmp2=V(jj);tt(k-1,:)=tmp1,tmp2,jj;endtmp=tmpd,tmpj,j;tt;tmp3,tmp4=min(tmp(:,1);if tmp3=tmpd, ss(1:2,kk)=i;tmp(tmp4,2);else,tmp5=find(ss(:,tmp4)=0);tmp6=length(tmp5);if dd(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;enddd=dd,tmp3;tmp(tmp4,2);V(tmp(tmp4,3)=;mdd,ndd=size(dd);kk=kk+1;end; S=ss; D=dd(1,:);