改进型dijkstra算法的最短路径求解.docxVIP

  • 14
  • 0
  • 约3.19千字
  • 约 6页
  • 2021-03-16 发布于天津
  • 举报
改进型 Dijkstra 算法的最短路径求解 DOIDO:I 10.11907/rjdk.1511199 2016)002012903 0 引言 现实生活中的很多问题都可以归结为最短路径问题, 最短路 径不仅是局限于空间位置上的距离最短, 也可能是指最少交通费 用,或者是最短运输时间等。 Dijkstra 算法是公认的求解最短 路径的较好算法,旨在计算一个节点到其它所有节点的最短路 径。在 Dijkstra 算法优化方面,国内外学者提出了多种方法, 包括DKB DKD二叉堆法等[12] 。 Dijkstra 算法的具体应用研 究也涉及到生活的方方面面,比如,农产品配送、城市交通系统 等。对于给定有向图,确定起点终点的最短路径问题,需要对经 典的 Dijkstra 算法作出适当改进,使其终点一经标号即结束循 环,输出最短距离和存在的多条最短路径。 1 基于 Dijkstra 算法的最短路径求解 Dijkstra 算法按路径长度的非降次序生成有向图中某个指 定结点(源点)到其它各结点的最短路径。例:有向图如图 1 所 示,求图 1 中源点到其它各顶点的最短路径。 该图的成本邻接矩阵为: 020503E OOTO 025xx 70oo 0402550O OOO 55OOOOO 01 0OOOOO 0 S集合存放已经生成最短路径的顶点, cos(i , j )是边[i , j]的权DIST (j )被置以源点到结点j的最短路径长度。V0是源 点,首先将结点 V0放入S中。此时DIST( 1)最小为20,说明 V0到V1的最短路径为20。将结点1计入S中,注意此时DIST ( w)( w=2, 3, 4, 5)的值可能发生变化, 如果 DIST(w) DIST (1)+COST( 1,w),则将 2Dijkstra 算法改进 为了使 Dijkstra 算法也能应用于多条路径问题,需要对算 法作出改进, 引入前置邻结点, 并考虑 DIST( w) =DIST( m) +COST (m w)的情况。 解决方案 G是一个n结点有向图,它由其成本邻接矩阵 COST(n,n) 表示, DIST(j )被置以源点 start 到结点 j 的最短路径长度。 Step1 :初始化每个顶点的前置邻结点、前置邻接点数、最短路 径数量以及具体路径。对于每个不在集合S且与源结点存在直接 通路的点,将它们的前置邻结点设为 start ,前置邻结点的个数 为 1,最短路径就是源点到顶点的直接通路。其它结点前置邻结 点数为0,不存在最短路径。只有源点在集合 S中,也称该顶点 被标号。Step2 :寻找下一个被放进集合 S的顶点:①找到没有 被标号其最短路径的顶点 m;②判断m是否与给定的结束点相同, 如果相同,返回最短路径,退出。否则,进入 Step3 。 Step3: 对于每一个不在S集合且与顶点m直接相连的顶点x作如下判 断:(1)顶点x现有的最短路径长度 >源点经过顶点m到x的路 径长度,贝V:顶点x的最短路径长度为顶点 m的最短路径长度与 m到x的路径之和;顶点x的最短路径个数为顶点 m的最短路径 个数;顶点x的最短路径为顶点 m的最短路径连接x;置顶点x 的前置邻结点为m个数为1。 (2)顶点x现有的最短路径长度=源点经过顶点m到x的路 径长度,贝V:顶点x的最短路径个数二顶点x现有的最短路径个 数与顶点v的最短路径个数之和;顶点x的最短路径连接 m加入 顶点x现有的最短路径;顶点x的前置邻结点加上 m;顶点x的 前置邻结点的个数加上 1;转 Step2[4] 。 生成多条最短路径的贪心算法 Procedure ShortestPaths ( start , end, COST, DIST, n) boolean S[0, n-1] ; int m, COST[0, n-1 ; 0, n-1] , DIST[0 , n-1] , MinPathNum[n] , MinPath[n][m] , PreVertexNum[n] , PreVertexID[n] ; for i J0 ton -1 do//每个顶点的前置结点个数为 0,最短 路径的条数也为 0 S[i]=0 ; DIST[i] JCOST[start][i] ; if S (i ) =0 and DIST[i] not and DIST[i] not 0// 找出 每个不在S的节点中与源节点存在直接通路的点, 将它们的前置 邻结点设为 start ,前置邻结点的个数为 1。 MinPathNum[i]=1 ; MinPath[i][0].add (start ); MinPath[i][0].add (i ); PreVertexNum[i]=1 ; PreVertexID[

文档评论(0)

1亿VIP精品文档

相关文档