环游世界的计划
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
环游世界的计划
评阅专家1 评阅专家2 评阅专家3 评阅专家4 评阅专家5
摘要
1,对这个模型我们运用“Floyd算法”计算最短时路径。
2,结果为从伦敦出发打赌会输。从上海或纽约出发打赌会赢。
正文部分
一、问题重述
环游世界80天
在儒勒·凡尔纳的著名小说《环游世界80天》中,英国绅士福格在伦敦与人打赌能够在80天内环游世界,这在当时的1872年是一个了不起的壮举。当时最快的旅行方式是火车和轮船,然而世界上大部分地区还是靠马车、大象、驴子或者步行来旅行。下面是一个从伦敦环游世界
不同路线的交通网络图,福格选择的是往东走,每段路线所需要的天数显示在图上,旅行的时间基于1872年能采用的旅行方式以及距离。
1.请设计一个算法为福格选择一条最佳路径,即环游世界天数最短,
你选择的路径能让他赢得赌注吗?
2.如果他在别的地方与人打赌,比如纽约或者上海,结果会怎样?
二、问题分析
此题已经简化为了计算从图中一点出发再次回到这一点所需最短时间的问题。由题中题意易知,环游世界时是利用地球做为球体的性质一直朝东或西方向行进最后回到原位置的。观察图中所给点的标号易知由数值小的标号向数值大的标号行进的话则为由西相东行进。
由于要算得最短旅行所需时间,而旅行线路为一首尾相接的折线。所以从地球上方观察的话,顺逆时针的方向并不影响旅行总时间。然而由西向东行进时会经过一次国际日期变更线使得旅行时间在以出发地时间计算时会少一天,即所计算时间会比实际时间少一天。同理如果由东向西旅行的话时间
会比实际时间多一天。因此我们默认旅行者均由西向东来环游世界以算得最短时间。
此题为一个求最短路径的问题,考虑到此题所涉及的数据较多,我们认为应该使用“Floyd算法”。
三、模型假设
1,由问题分析中知,我们假设旅行者除了回到出发地时外均为由标号小的城市向标号数值大的城市运行。
2,在旅行过程中,假设不会发生任何意外影响旅行时间。
3,图中由点15-Minsk到点19-Moscow 的距离未给出。根据历史资料,两城市间最短行进时间为5天。我们以此数据来计算题目。
4,图中由点31-Calcutta到点32-Bangkok的距离未给出。根据历史资料,两城市间最短行进时间为3天。我们以此数据来计算题目。
四、符号说明
为避免计算时城市标号干扰计算数值,及在程序中方便调用,将城市按其标号顺序命名为V1,V2,…。
五、模型建立
我们运用“Floyd算法”计算最短路径,将“Floyd算法”编为一个子函数,然后设置一个TXT文件来输入环游世界图的每个路径长短,我们将每个地点的位置设为v,下标他们的标号以辨别各个位置,比如伦敦标号为1,即伦敦为v1,上海为37,那上海就被表示为v37。
Floyd的核心思路为通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
从图的带权另接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路
径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
算法的过程为:
1,从任意一条单边路径开始。所有两点之间的距离是边的权,或者无穷大,如果两点之间没有边相连。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。
我们用A[i][j]来表示他们每两点之间需要的时间,如A[1][6]=1,表示从v1到v6需要的时间为1天。因为题设中提到,福格选择了向东走,所以我们不妨把图中的距离变为有向线段,即只能从v1走到v6,不能从v6走到v1。为了能准确的表示从一点到另一点是不能走的,我设置了一个MAX_INT=10000,来表示他们间的距离是为无穷大。所以我们可以知道A[1][6]=1,但
A[6][1]= MAX_INT。
在程序中,我将从伦敦,上海和纽约分为3个部分,输入1,2或3就能分别计算从不同的地方出发的不同路径以及时间。
因为我们是将图中的数据输入在TXT文件中的,所以在运用C语言程序的时候,我们要将“INPUT1.txt”“INPUT2.txt”“INPUT3.txt”3个文件都要放入D盘下,这样在读入TXT文件的数据时,程序的寻址才是正确的,TXT文件中的数据才能读入程序中。TXT文件的格式是每3个数一排,分别表示路径的起点终点和路径走过需要的时间。
在伦敦出发时,为了减少运算量,我们不妨计算一些路径长短来时程序变得简易,使数据更加简单,如假设经过v27有条路径,我将它分别计算了一次,结果表明(v1,v9,v14,v18,v27)这条路径是最短的,所以我将别的路径都归了零,如(v1,v10, v15,v19,v27),但由于如(v1,v10),(v10,v15)等有可能有别的路径要经过这里,所以我只能将(v19,v27),(v15,v19),
(v10,v19)归为零,即不将A[19][27],A[15][19],A[10][19]输入到程序中,这样不但大大减少了程序的运算时间,还将需要输入的数据量减少了不少。
当然,在有些只有一条路的路径上我们不妨将他们合并成一条路,如
(v33,v36,v38,v40,v44,v45,v46),我们不如将它合成为(v33,v46),这样能简化一点运算。在得出结果后,我们再将省略的路径补回来。
六、问题解决
从伦敦出发计算得:
所以打赌会输。
从上海出发计算得:
所以打赌会赢。
从纽约出发计算得:
所以打赌会赢。
七、优缺点分析
Floyd算法适用于APSP(All Pairs Shortest Paths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单
缺点:时间复杂度比较高,不适合计算大量数据。
八、附录
参考文献:《Floyd算法的一个通用程序及在图论中的应用》
---《杭州应用工程技术学院学报》 1999.3
程序:
注意,一定要将txt文件放到D盘下。