Floyd算法求解最短路径问题(完整程序代码).doc
《Floyd算法求解最短路径问题(完整程序代码).doc》由会员分享,可在线阅读,更多相关《Floyd算法求解最短路径问题(完整程序代码).doc(16页珍藏版)》请在咨信网上搜索。
1、交通运输学院课程设计引言在图论中经常会遇到这样的问题,在一个有向图里求出任意两个节点之间的最短距离。当节点之间的权值是正值的时候,我们可以采用Dijkstra算法,用贪心策略加于解决。但当节点之间的权值有负数的时候,Dijkstra就行不通了,这里介绍另外一种算法Floyd最短路径算法。对于任意图,选择存储结构存储图并实现FLOYD算法求解最短路经。将问题分解,分解为两方面。一是对于任意图的存储问题,第二个是实现FLOYD算法求解最短路经。首先对于图的创建选择合适的存储结构进行存储,对于合适的存储结构可以简化程序。本实验采用邻接矩阵存储。然后是实现FLOYD算法求解最短路经,在FLOYD算法中
2、路径的长度即是图中两定点间边的权值,FLOYD算法要求输出任意两个顶点间的最短路径,而且经过的顶点也要输出。考虑到问题的特殊性,采用一个二维数组和一个三维数组进行存储。二维数组存储最短路径,三维数组存储路径经过的顶点,在进行适当的算法后对这两个数组进行输出即可。通过问题的分解,逐个解决,事先所要求的程序。最短路径算法问题是计算机科学、运筹学、地理信息系统和交通诱导、导航系统等领域研究的一个热点。传统的最短路径算法主要有Floyd算法和Dijkstra算法。Floyd算法用于计算所有结点之间的最短路径。Dijkstra算法则用于计算一个结点到其他所有结点的最短路径。Dijkstra算法是已经证明
3、的能得出最短路径的最优解,但它的效率是一个很大的问题。对于具有n个结点的一个图,计算一个结点到图中其余结点最短路径的算法时间复杂度为O(n2)。对于一座大中型城市,地理结点数目可能达到几万个到几十万个,计算最短路径的时间开销将是非常巨大的。本文根据吴一民老师的建议,分析当前存在的各种求最短路径的算法,提出一种新的基于层次图的最短路径算法,即将一个平面图划分若干子图,子图抽象为一个高层图。最短路径的计算首先在高层图中进行,缩小了最短路径的查找范围,降低了最短路径计算的时间开销。由于可以动态计算子图间的阻抗函数,算法可适用于动态交通诱导系统。设计目的(1)培养学生分析解决问题的能力,掌握java语
4、言的程序设计方法;(2)通过课程设计实践,训练并提高学生在统筹全局、结构设计、查阅设计资料和计算机编程方面的能力;(3)提高学生实践论文撰写能力。任务与要求: (1) 理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;(2) 课程设计报告(论文)包括要求的作业。第一章 Floyd算法1.1 最短路的定义最短路径问题是图论研究中的一个经典算法,旨在寻找图中两结点之间的最短路径。算法的具体形式包括:确定起点的最短路径问题即已知起始结点,求最短路径问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路经反转的确定起点的问题。确定起点终点的最
5、短路径问题即已知起点和终点求两结点之间的最短路径。求距离最短路径问题求图中所有的最短路径。用于解决最短路径问题的算法被称为最短路径算法。单源最短路 定义:给定一个赋权有向图G =(V,E),记G中每一条弧aij=(vi,vj)上的权为W(aij)=Wij,有给定G中的一个起点s和重点t,设p是G中从s到t的一条路,则定义路径p的权是p中有弧的权之和,记为W(p),即:W(p)=又若p*是图G中从s到t的一条路径,且满足W(p*)=minW(p)|p为Vs到Vt的路试中对G的所有从s到t的路p取最小,则称p*为从s到t的最短路,W(p*)为s到t的最短距离。在一个图G中,求从s到t的最短路径和最
6、短距离问题就称为最短路径问题。1.2 Floyd的定义与思想 1.2.1 Floyd算法的定义 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 1.2.2 Floyd 算法的思想利用一个三重循环产生一个存储每个结点最短距离的矩阵.弗洛伊德算法仍然使用图的邻接矩阵arcsn+1n+1来存储带权有向图。算法的基本思想是:设置一个n x n的矩阵A(k),其中除对角线的元素都等于0外,其它元素a(k)ij表示顶点i到顶点j的路径长度,K表示运算步骤。开始时,以任意两个顶点之间的有向边的权值作为路径长度,没有有向边时,路径长度为,当K=0时, A (0)i
7、j=arcsij,以后逐步尝试在原路径中加入其它顶点作为中间顶点,如果增加中间顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原路径,修改矩阵元素。具体做法为: 第一步,让所有边上加入中间顶点1,取Aij与Ai1+A1j中较小的值作Aij的值,完成后得到A(1),第二步,让所有边上加入中间顶点2,取Aij与Ai2+A2j中较小的值,完成后得到A(2),如此进行下去,当第n步完成后,得到A(n),A(n)即为我们所求结果,A(n)ij表示顶点i到顶点j的最短距离。因此,弗洛伊德算法可以描述为: A(0)ij=arcsij; /arcs为图的邻接矩阵 A(k)ij=minA(k-1) i
8、j,A(k-1) ik+A(k-1) kj其中 k=1,2,n定义一个n阶方阵序列: D(-1), D(0), , D(n-1). 其中 D(-1) ij = G.arcsij; D(k) ij = min D(k-1)ij,D(k-1)ik + D(k-1)kj , k = 0,1, n-1 D(0) ij是从顶点vi 到vj , 中间顶点是v0的最短路径的长度, D(k) ij是从顶点vi 到vj , 中间顶点的序号不大于k的最短路径长度, D(n-1)ij是从顶点vi 到vj 的最短路径长度。1.3 Floyd算法描述 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。a) 初始化:D
9、u,v=Au,v b) For k:=1 to n For i:=1 to n For j:=1 to n If Di,jDi,k+Dk,j Then DI,j:=DI,k+Dk,j; c) 算法结束:D即为所有点对的最短路径矩阵 从图的带权邻接矩阵A=a(i,j) nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j 列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同 还可引入一个后继节点矩阵path来记录两点间的最短路径。 采
10、用的是松弛技术,对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n3); 其状态转移方程如下: mapi,j:=minmapi,k+mapk,j,mapi,jmapi,j表示i到j的最短距离 K是穷举i,j的断点 mapn,n初值应该为0,或者按照题目意思来做。当然,如果这条路没有通的话,还必须特殊处理,比如没有mapi,k这条路 1.4 Floyd算法过程在图论中经常会遇到这样的问题,在一个有向图里,求出任意两个节点之间的最短距离。我们在离散数学、数据结构课上都遇到过这个问题,在计算机网络里介绍网络层的时候好像也遇到过这个问题,记不请了. 但是书本上一律采取的是Dijkstra算
11、法,通过Dijkstra算法可以求出单源最短路径,然后逐个节点利用Dijkstra算法就可以了。不过在这里想换换口味,采取Robert Floyd提出的算法来解决这个问题。下面让我们先把问题稍微的形式化一下: 如果有一个矩阵D=d(ij),其中d(ij)0表示i城市到j城市的距离。若i与j之间无路可通,那么d(ij)就是无穷大。又有d(ii)=0。编写一个程序,通过这个距离矩阵D,把任意两个城市之间的最短与其行径的路径找出来。我们可以将问题分解,先找出最短的距离,然后在考虑如何找出对应的行进路线。如何找出最短路径呢,这里还是用到动态规划的知识,对于任何一个城市而言,i到j的最短距离不外乎存在经
12、过i与j之间的k和不经过k两种可能,所以可以令k=1,2,3,.,n(n是城市的数目),在检查d(ij)与d(ik)+d(kj)的值;在此d(ik)与d(kj)分别是目前为止所知道的i到k与k到j的最短距离,因此d(ik)+d(kj)就是i到j经过k的最短距离。所以,若有d(ij)d(ik)+d(kj),就表示从i出发经过k再到j的距离要比原来的i到j距离短,自然把i到j的d(ij)重写为d(ik)+d(kj),每当一个k查完了,d(ij)就是目前的i到j的最短距离。重复这一过程,最后当查完所有的k时,d(ij)里面存放的就是i到j之间的最短距离了。所以我们就可以用三个for循环把问题搞定了,
13、但是有一个问题需要注意,那就是for循环的嵌套的顺序:我们可能随手就会写出这样的程序,但是仔细考虑的话,会发现是有问题 for(int i=0; in; i+) for(int j=0; jn; j+) for(int k=0; kn; k+) 问题出在我们太早的把i-k-j的距离确定下来了,假设一旦找到了i-p-j最短的距离后,i到j就相当处理完了,以后不会在改变了,一旦以后有使i到j的更短的距离时也不能再去更新了,所以结果一定是不对的。所以应当象下面一样来写程序: for(int k=0; kn; k+) for(int i=0; in; i+) for(int j=0; jn; j+)
14、这样作的意义在于固定了k,把所有i到j而经过k的距离找出来,然后象开头所提到的那样进行比较和重写,因为k是在最外层的,所以会把所有的i到j都处理完后,才会移动到下一个k,这样就不会有问题了,把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则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中则包含了最
15、短通路径的信息。比如,要寻找从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直接相连。 1.5 Floyd算法优缺点分析Floyd算法适用于APSP(All Pairs Shortest Paths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次DijkStra算法。 优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单; 缺点:时间复杂度比较高,不适合计算大量数据。第二章
16、 邻接矩阵2.1 邻接矩阵的定义邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V=v1,v2,vn。G的邻接矩阵是一个具有下列性质的n阶方阵:2.2 邻接矩阵的特点无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。因此,用邻接矩阵来表示一个具有n个顶点的有向图时需要n2个单元来存储邻接矩阵;对有n个顶点的无向图则只存入上(下)三角阵中剔除了左上右下对角线上的0元素后剩余的元素,故只需1+2+.+(n-1)=n(n-1)/2个单元。 无向图邻接矩阵的第i行(或第i列)非零元素的个数正好是第i个顶点的度。有向图邻接矩阵中第i行非
17、零元素的个数为第i个顶点的出度,第i列非零元素的个数为第i个顶点的入度,第i个顶点的度为第i行与第i列非零元素个数之和。 用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。 2.3 邻接矩阵的表示方法2.3.1 图的邻接矩阵表示法 在图的邻接矩阵表示法中: 用邻接矩阵表示顶点间的相邻关系 用一个顺序表来存储顶点信息 2.3.2 图的邻接矩阵(Adacency Matrix) 设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵: Ai,j=1 若(Vi,Vj)或者是E(G)中的边; Ai,j=0 若(Vi,Vj)或者不是E(G)中的边。若G是网络,则邻接矩阵可定义
18、为: Ai,j=Wij 若(Vi,Vj)或属于E(G) AI,j=0或 若(Vi,Vj)或不属于E(G) 其中: Wij 表示边上的权值; 表示一个计算机允许的、大于所有边上权值的数。 【例】下面带权图的两种邻接矩阵分别为A 3 和A 4 。 2.3.3邻接矩阵的特点:无向图的邻接矩阵一定是一个对称矩阵。无向图的邻接矩阵的第i行(或第i列)非零元素(或非无穷元素)个数为第i个顶点的度D(vi).有向图的邻接矩阵的第i行非零元素(或非无穷元素)个数为第i个顶点的度OD(vi),第i列非零元素(或非无穷元素)个数就是第i个顶点的入度ID(vi)。邻接矩阵表示图,很容易确定图中任意两个顶点之间是否有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Floyd 算法 求解 路径 问题 完整 程序代码
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【丰****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【丰****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。