当前位置:文档之家› Dijkstra最短路径算法

Dijkstra最短路径算法

Dijkstra最短路径算法摘要OSPF 是由 IETF 的 IGP 工作组为 IP 网开发的一种能适应大型网络需要的典型的链路状态路由协议,它可以迅速地检测 AS 内的拓扑变化,经过一个比较短的收敛期后,重新计算出无环路由。

在 OSPF 中采用的是 Dijkstra 算法来实现最短路径的计算,做到了选路的高效、可靠。

不同的算法在时间上的开销是不一样的,可能会有很大的差别,而对于一个大型的网络来讲,选路的效率往往就是网络的生命,算法的重要性不言而喻。

关键词 OSPF 最短路径 Dijkstra第1章绪论最短路径算法是计算机科学与地理信息科学等领域研究的热点,其算法有很多种,其中传统的Dijkstra算法一般用于计算一个源节点到所有其他节点的最小代价路径,并且能够适应网络拓扑的变化,性能稳定,因而可以在运输路线规划等领域都应用广泛.1.1 国内外最短路径算法的发展及其概况最短路径在20世纪初开始受到人们的重视,关于它的求解方法,当时有很多科学家在研究.但给出求解的基本思想的人直到1959年才出现,是一位名叫Edsger Wybe Dijkstra(迪杰斯特拉)的荷兰计算机科学家,他不仅给出了求解的基本思想,还给出了算法.他给出的算法主要解决的问题是从某一个固定的点到其他各点的最短路径问题.后来这个算法被誉为一代经典,被称作Dijkstra 算法.后来,人们逐渐从两个方面来研究最短路径,分为完全信息情况下和不确定情况下.确定情况下对最短路径的研究的过程中,发展出了很多高效的算法,其中1958年的Bellman算法、1959年的Dijkstra算法、1969年的Dreyfus算法已成为确定情况下的经典算法[1].而不确定情况下对最短问题的研究又分成了四个方面:研究路段长度随机变化的最短路径问题,以Frank和Mirchandani为代表;研究不同费用函数最短路径问题,以Loui、Muethy和Sarkar为代表;研究时间独立情况下的路段长度随机变化的最短路径问题,Hall、LiPing Fu、L.R.Rilett、Elise和Hani为代表;研究路段长度为区间范围的最短路径问题,以Tomas和Rajeev为代表.其中,第二方面问题的研究得出的结论是“当目标是期望最短路径时问题转化为将边的权重用期望值表示的最短路径问题”.1.2 传统Dijkstra算法仍然存在的一些问题原始Dijkstra算法在存储图形数据和运算时,基于网络的权矩阵,需要根据其节点与距离之间的关系,形成关联矩阵、邻接矩阵与距离矩阵,需要定义NN 的数组来存储数据,其中N为网络的节点数,当网络的节点数较大时,将占用大量的计算机内存.原始Dijkstra算法在运行时一般将网络节点分为未标记节点、临时标记节点和永久标记节点3种类型.网络中所有节点首先初始化为未标记节点,在搜索过程中和最短路径节点相连通的节点为临时标记节点,每一次循环都是从临时标记节点中搜索距离原点路径长度最短的节点作为永久标记节点,直至找到目标节点或者所有节点都成为永久标记节点才结束算法.根据算法的描述可知对临时标记节点的遍历成为Dijkstra算法的瓶颈,影响了算法的执行效率.第2章 Dijkstra经典算法2.1 引言Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低.如何改进这一经典算法,成为了实现图论中赋权图中解决实际问题的重要课题.2.2 原理及应用Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.Dijkstra 一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE 表的方式,这里均采用永久和临时标号的方式.该算法要求图中不存在负权边.2.2.1 原理Dijkstra算法是1959年由E.W.Dijkstra提出的图论中求最短路径的一个著名的算法,使用其可以求得图中一点到其他各顶点的最短路径.原始的Dijkstra算法将网络结点分成3部分:未标记结点、临时标记结点和永久标记结点.网络中所有结点首先初始化为未标记结点,在搜索过程中和最短路径中的结点相连通的结点为临时标记结点,每次循环都是从临时标记结点中搜索距源点路径长度最短的结点作为永久标记结点,直至找到目标结点或者所有的结点都成为永久标记结点来结束算法.假设每个点都有一对标号(i w ,j p ),其中j w 是从起源点s 到点j 的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);j p 则是从s 到j 的最短路径中j 点的前一点.求解从起源点i 到点j 的最短路径算法的基本过程如下:(1)初始化.起源点设置为:①0=s w ,s p 为空;②所有其他点:i w ∞=,ip ?=;③标记起源点s ,记k =s ,其他所有点设为未标记的.(2)检验从所有已标记的点k 到其直接连接的未标记的点j 的距离,并设置:{}kj k j j d w w w +=,min 式中,kj d 是从点k 到j 的直接连接距离.(3)选取下一个点.从所有未标记的结点中,选取j w 中最小的一个i :i w j w min =,(所有未标记的点j ),点i 就被选为最短路径中的一点,并设为已标记的.(4)找到点i 的前一点.从已标记的点中找到直接连接到点i 的点*j ,作为前一点,设置:i =*j .(5)标记点i .如果所有点已标记,则算法完全推出,否则,记k =i ,转到(2)再继续.图2-1 Dijkstra算法最短路径应用演示图循环红点集S K}0{D}1{D}2{D}3{D}4{D初始化}0{- 0 10 ∞30 1001 }1,0{ 1 0 10 60 30 1002 }3,1,0{3 0 10 50 30 903 }2,3,1,0{ 2 0 10 50 30 604 }4,2,3,1,0{ 4 0 10 50 30 60表2-1 0节点到4节点的最短路径2.3 Dijkstra算法的优缺点Dijkstra算法能够保证100%找到最优解,但其搜索速度较慢,搜索效率非常低,时间花费较多,一般只能用于离线的路径规划问题.如节点数为n的图,用Dijkstra算法计算最短路径总共需要迭代1-n次,每次迭代都新加一个节点到临时节点集合中,由于第i次迭代时不在临时节点集合中的节点数为in-.即第i次迭代需对in-个节点进行处理,因此其所需的处理数为:2)1()(11-=-∑-=n ninni对n个节点网络的时间复杂度是)(2nO.在实际应用当中,使用Dijkstra算法查找最短路径时耗费大量的时间进行数据的比较,本文对Dijkstra算法进行分析,通过改变算法实现减少不必要节点计算的时间,提高算法的效率达到对其进行优化.第3章基于Dijkstra算法的优化算法的研究3.1 几种优化算法3.1.1 减小算法中成功搜索的搜索范围减小算法中成功搜索的搜索范围以尽快到达目标节点.在对现实问题中的交通图初始化为网络拓扑图时,虽然终点已知,而源点尚未确定,但依据常识离案发地段最近的派出所应为案发地段所在辖区派出所,或其周边派出所,也就是源点的选取范围可以确定.利用MapObjects2组件提供的MapLayer.SearchExpression (expression )记录集筛选方法,根据案发地段(终点)的不同,动态选取案发地段所在辖区及相邻辖区的道路图层及派出所图层数据进行最短路径查询,从而有效地减少了拓扑图中节点总数n 的值]7[.3.1.2 改进算法的存储结构在实际工作中,还要建立起空间数据结构.网络数据结构使用的是“边和节点”的数据结构,该数据结构是建立在图论的基础上,节点可用来定义边的连接关系.对于网络数据的存储,传统的是采用图论中的邻接矩阵方法,其存储量为N N ⨯(N 为网络中节点数).通常的地理网络,尽管节点很多,但与节点相关联的节点数目并不多,一般都为稀疏图,将会浪费大量的空间.若采用邻接表的链式存储结构,其存储量为E (E 为节点列表中,同节点关联的所有边的数目),可节省大量的存储空间,尤其是在表示与节点和边相关信息较多的地理网络时,更为有效.但邻接表却难以判断两节点之间的关系,因此本文提出利用.NET 框架提供的特殊类Hashtable .NET 框架包含特殊类,比如通常所说的集合类用于存储对象.与数组类似,集合类可以把对象放入容器中,然后再取出.但集合的使用方法与数组不同,拥有用于插入和删除项的专用方法.使用Hashtable 最大的优点就是大大降低数据存储和查找的时间花费]8[.3.2 本文对Dijlstra 优化算法研究3.2.1 优化目标Dijkstra 算法用来求解图上从任一节点(源点)到其余各节点的最短路径.其时间复杂度为)(2n O ;采用邻接矩阵存储网络拓扑结构,需要)(N N ⨯的存储空间,随着节点数N 的增大,其计算效率和存储效率越低.针对此问题,提出了Dijkstra 算法的改进,本文在对传统Dijkstra 算法分析的基础上,对其进行了优化,优化算法只对最短路径上节点的邻居做处理,而不涉及到其他节点.3.2.2 优化思路Dijkstra 算法基本方法:设j W 是从源点s 到节点j 的最短路径长度;j p 是从s 到j 的最短路径中j 点的前一节点.S 是标识集合;T 是未标识集合;M 是节点集合.ij d 是节点i 到节点j 的距离(i 与j 直接相连,否则ij d ∞=).算法步骤如下:Step0:S {}s =;T =S M -;j W =ij d (T j ∈,s 与j 直接相连)或j W ∞=(T j ∈,s 与j 不直接相连).Step1:在T 中找到节点i ,使s 到i 的距离最小,并将i 划归到S (可从与s 直接相连的j 中考虑)若si d = min sj d ,j 与s 直接相连,则将i 划归到S 中,即S {}i s ,=,T {}i T -=;T j ∈;i P =S .Step2:修改T 中j 节点的j w 值:j W =()ij i j d W W ++,min ;若j W 值改变,则i P i =.T j ∈;S i ∈.Step3:选定所有的j W 最小值,并将其划归到S 中:i W =j W min ;S }{i S ⋃=;T {}i T -=;若s n =,所有节点已标识, 则算法终止,否则,转入Step2.通过分析传统Dijkstra 算法的基本思路,传统Dijkstra 算法存在如下两点不足:(1)当从未标记节点集合T T 中选定一个节点k 作为转接点后时,需扫描未标记节点集合T 中的节点j 并更新其j W 值,而未标记节点集合T 中往往包含大量与转接节点k 不直接相连的节点i (即kj d ∞=);(2)在未标记节点集合T 中选择一个w 值最小的节点作为下一个转接节点,然而下一个转接节点往往是与标记节点集合S中的节点直接相连的.第4章结束语目前提出的此类最短路径的算法大约有17 种, 其中三种效果比较好, 即TQQ (graph growth with two queues)、DKA (the Dijkstra s algori thm_ implemented with approximate buckets)及DKD (the Dijkstra s algori thm_ implemented with double bucket s)。

相关主题