基于Floyd算法的道路指示牌解决方案_第1页
基于Floyd算法的道路指示牌解决方案_第2页
基于Floyd算法的道路指示牌解决方案_第3页
基于Floyd算法的道路指示牌解决方案_第4页
基于Floyd算法的道路指示牌解决方案_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于Floyd算法的道路指示牌解决方案绪论 中国拥有13亿人口,960万平方公里的国土面积,仅次于加拿大又略大于美国;中国公路通车里程达185万公里,铁路里程达7.43万公里。在过去的20年里,我们在经济领域取得了巨大的成就,保持了强劲快速的增长态势。在中国经济增长的带动下,中国公路客运交通获得了快速发展,并以每年78的速度持续增长。与此同时,中国汽车拥有量和驾车者也都有爆发性增长;而物流运输、集装箱运输在过去的10年里增长了30。由此可以看出,汽车产业和交通运输在中国的迅猛增长。 为了满足不断增长的交通运输,高速公路系统的建设就迫在眉睫。随着高速公路系统的不断完善,指示牌的作用十分重要。指示

2、牌为用户指明了前往各个城市的距离。选择最短的路径,方便用户是指示牌的主要目的。 本文是基于Floyd算法,来找出设置合适的指示牌来指示用户,从而使得用户可以更加快速的到达目的地。第一章 问题模型 我们可以在每一个十字路口都设置指示牌,但这样一种方式并不是最好。为了选择哪些城市应该在指示牌上列出,我们使用如下策略:如果在指示牌前锋的十字路口上有一条路是到城市X的最短路,则城市X被标上指示牌。我们假设在没对十字路口之间只有一条最短路径。 输入: 输入包括一个问题实例,描述了高速公路系统,接着是一组指示牌的位置。高速公路系统定义为一组十字路口和一组与十字路口相连的道路。第一行是是哪个正整数n、m、k

3、:n表示十字路口的数量,m表示连接各个十字路口之间道路的数量,k表示既是城市也是十字路口的数量。接下来m行,格式是i1、i2、d,表示十字路口i1和 i2直接有一条双行道,其距离为d。接下来k行,格式是i、name,表示十字路口i是一个城市,其名字为name。在这之后的一行,有一个正整数s,表示应防止在高速公路系统上的指示牌的数量。接下来的s行,格式是i1、i2、d,表示从i1到 i2应放置一个指示牌,从i1开始的距离是d。对于所有的问题实例,名字的长短18个字符,5n30.所有的距离大于0,并精确到百分之一。 输出: 每个指示牌的输出格式如下: name1 d1 name2 d2 . nam

4、ei应该左对齐,宽度为20;距离dj应四舍五入到整数。没对“namedistance”应该按四舍五入后的距离排序;相同距离的依字幕顺序输出。指示牌输出顺序应该与指示牌的输入顺序一致,每个指示牌之间有一个空行,你可以假设每个指示牌上至少列出一个城市。第二章 算法简介 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。1.核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=a(i,j) n×n开始,递归地进行

5、n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n3); 其状态转移方程如下: mapi,j:=minmapi,k+mapk,j,mapi,j mapi,j表示i到j的最短距离 K是穷举i,j的断点 mapn,n初值应该为0,或者按照题目意思来做。 当然,如

6、果这条路没有通的话,还必须特殊处理,比如没有mapi,k这条路。2.算法描述a) 初始化:Du,v=Au,vb) For k:=1 to n For i:=1 to n For j:=1 to n If Di,j>Di,k+Dk,j Then DI,j:=DI,k+Dk,j;c) 算法结束:D即为所有点对的最短路径矩阵3.算法过程1.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。2.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。 把图用邻接距阵G表示出来,如果从Vi到Vj有路

7、可达,则Gi,j=d,d表示该路的长度;否则Gi,j=无穷大。 定义一个距阵D用来记录所插入点的信息,Di,j表示从Vi到Vj需要经过的点,初始化Di,j=j。 把各个顶点插入图中,比较插点后的距离与原来的距离,Gi,j = min( Gi,j, Gi,k+Gk,j ),如果Gi,j的值变小,则Di,j=k。 在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。 比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为V5,V3,V1,如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。4.优缺点分

8、析 Floyd算法适用于APSP(All Pairs Shortest Paths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。 优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单 缺点:时间复杂度比较高,不适合计算大量数据。第三章 算法分析1.样例分析 该样例有8个十字路口,17条道路,4个城市和3个指示牌。如图。 输出结果分别是三个指示牌上的城市列表。例如从路口3到路口2,在距离路口3为0.45英里处立一块指示牌,表示到Bobtown还有7英里。2.数据结构 使用邻接矩阵存储

9、高速公路系统图: double graphMaxNMaxN; 对于样例数据,数组graph的内容如图所示: 数组的下表与十字路口的编号一致。0123456700.007.128.345.335.360.000.000.0017.120.004.210.000.000.006.9910.2628.344.210.002.740.000.005.040.0035.330.002.740.004.127.725.710.0045.360.000.004.120.008.9410.290.0050.000.000.007.728.940.005.478.5560.006.995.045.7110.29

10、5.470.006.0170.0010.260.000.000.008.556.010.00 数组city表示城市: char cityMaxNMaxN; 对于样例数据,数组city的内容如图所示:下标0123城市AllentownBobtownCharlestownDownville 下标是城市编号。 数组citylocation表示城市在十字路口的位置: int citylocationMaxN; 对于样例数据,数组citylocation的内容如图所示:下标01234567城市编号01-1-1-1-123下标是十字路口编号,值为-1时表示该路口没有城市。3.使用Floyd方法计算所有路口

11、之间的最短路径 采用数组path存储最短路径: double pathMaxNMaxN; 对于样例数据,数组path的内容如下: 注意表中阴影部分的单元格,其数值没有变化,表示这些路口之间没有最短路径。4.计算最短路径经过的十字路口 采用数组shortpath存储最短路径经过的十字路口: int shortpathMaxNMaxN;0123456700.007.128.075.335.3613.0511.0417.0517.120.004.216.9511.0712.466.9910.2628.074.210.002.746.8610.465.0411.0535.336.952.740.004

12、.127.725.7111.7245.3611.076.864.120.008.949.8315.84513.0512.4610.467.728.940.005.478.55611.046.995.045.719.835.470.006.01717.0510.2611.0511.7215.848.556.010.00 对于样例数据,数组shortpath的内容如图所示:012345670-11-1-1-1-13310-1-1-1-1-167231-1-1-1-166302-1-1-1-166403-1-1-1-133536-1-1-1-167631-1-1-1-1-17761-1-1-1-16

13、-1 当路口没有城市时,就不必计算,令其值为-1.表中的阴影单元与path表示对应的,表示没有最短路径通往其他城市。单元(i,j)(i,j=0n-1)的值为k(k-1,j)时,表示从路口i到路口j有最短路径,且经过路口k。5.计算指示牌 有了shortpath表,计算只是牌列表就容易了。如从路口i到路口k,在shortpath表中,扫描i行,其值为k时,所对应的列号j就是要列表显示的城市。列表的数据结构如下: struct sign int cityname,distance; sighlistMaxN; 输出时要排序,采用标准函数qsort(),排序算法为函数cmp():首先按里程的大小升序

14、,在里程相等的情况下,按城市名称的字幕排序。附:程序源代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>const int MaxN = 31;const double Zero = 0.0001;/指示牌上要显示的城市列表struct signint cityName, distance; signListMaxN;char cityMaxNMaxN; /城市名称/比较函数int cmp(const void *a1,const void *b1

15、)sign *a = (struct sign*)a1;sign *b = (struct sign*)b1; /首先按里程的大小升序if (a->distance > b->distance) return 1; /在里程相等的情况下,按城市名称的字幕顺序排序else if (a->distance = b->distance) return strcmp(citya->cityName, cityb->cityName);else return -1;int main()double pathMaxNMaxN; /存储最短路径double grap

16、hMaxNMaxN; /存储高速公路系统图int shortPathMaxNMaxN; /存储最短路径经过的十字路口int cityLocationMaxN; /存储城市在十字路口的位置int cases; /测试例数scanf("%d", &cases);int iCase;for (iCase = 1; iCase <= cases; iCase+)int i, j, k;int a, b;double d;char nameMaxN;int n, m, cross; /路口数量,道路数量,城市数量scanf("%d %d %d", &

17、amp;n, &m, &cross);memset(graph, 0, sizeof(graph);memset(cityLocation, 255, sizeof(cityLocation);/构造邻接矩阵for (i = 1; i <= m; i+)scanf("%d %d %lf", &a, &b, &d);graphab = graphba = d;/读取城市信息for (i = 0; i < cross; i+)scanf("%d", &a);cityLocationa = i;sca

18、nf("%signNum", name);strcpy(cityi, name);/使用Floyd方法计算所有路口之间的最短路径memcpy(path, graph, sizeof(graph);for (k = 0; k < n; k+)for (i = 0; i < n; i+)if (pathik > Zero)for (j = 0; j < n; j+)if (pathkj > Zero && i != j)d = pathik+pathkj;if (pathij < Zero | pathij > d) p

19、athij = d;/对角线是路口自身,清除掉for (i = 0; i < n; i+) pathii = 0;/计算最短路径经过的十字路口memset(shortPath, 255, sizeof(shortPath);for (i = 0; i < n; i+)for (j = 0; j < n; j+)/该路口有城市才计算if (cityLocationj >= 0)for (k = 0; k < n; k+)if (graphik >= Zero && fabs(pathij-pathkj-graphik)<Zero)shortPathij = k; break;if (iCase != 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论