一种基于Boost库的K则最短路径搜索方法和系统的制作方法

文档序号:7769232阅读:289来源:国知局
专利名称:一种基于Boost库的K则最短路径搜索方法和系统的制作方法
技术领域
本发明属于计算机网络领域,具体涉及一种基于Boost库的K则最短路径搜索方法和系统。
背景技术
在网络规划或路径搜索中,经常需要寻找新路由,一般地,这可以通过图论中的最短路径方法解决。常用的最短路方法是广度优先方法、dijkstra方法等经典方法。这些方法的一个共同特点是只寻找图中给定点到任意点间的最短路径。但是这在实践中往往是不够的,比如,在路由规划中,除了最短路径外,可能需要寻找第二短路径作为备用,在有些条件下,可能需要寻找第三、第四短的路径或者所有路径。这类问题统一称为K短路径问题或 K则最短路径问题。K短路径问题最早由Hoffman和I^avley提出,多年来一直受到业界广泛重视,K短径分为严密K则最短路径方法和有损K则最短路径方法两类。前者具有严密的理论基础,所得到的K条路径是起终点间所有可能路径按权值递增排序后的前K条路径,后者通过启发式策略等技术,通过牺牲有限的精度以换取效率的大幅度提高。根据路径是否成环,K则最短路径方法还可以分为限定无环方法和自由路径方法。前者要求求得的路径必须是简单路径,不能含有回路,后者允许路径包含回路。限定无环路径的K则最短路径应用更加普遍。 本发明针对限定无环K短路径。与单源最短路径问题相比,K则最短路径问题在方法设计上更为复杂,目前尚没有一种K则最短路径方法如单源最短路径方法中的Dijkstra方法一样得到业界共识并且达到大规模实用化程度。对于单源最短路径问题,已经有现成的可以直接调用的高效率免费开源计算机方法,最著名的是C++Boost Graph图库。该库已经集成了图论中的大多数基本方法,包括BFS、DFS、dijkstra. Bellman R)rd等基本最短路径方法,这样大大减轻了应用的难度,基本可以直接嵌入在自己代码中,不需要单独编写方法本身代码。常用的K短路径搜索方法有删除边方法、偏离边方法等。但是这些方法仅仅是一种理论上的模型,与实际应用还有一定差距,不同于最短路径方法,尚未有开源的成熟高效计算机方法可供直接应用。

发明内容
本发明的目的是供一种能直接应用于网络的多重最短路径搜索方法,该方法应能解决以下几个方面具体问题1)可提供限定无环路径的K则最短路径问题的计算机算法,具有实用性,而非一种纯理论上的算法概念;2)给出源宿节点间任意给定数目(即K数)并且以路径距离排序的所有路径,如果实际路径数小于K或K = 0,则给出所有实际路径,否则给出前K短路径;3)可提供限定分离条件的K则最短路径问题计算机算法,限定分离方式分别为节点分离、边分离、不分离3种;为实现上述目的,本发明提供一种基于Boost库的K则最短路径搜索方法,其改进之处在于该方法在成熟的C++Boost Graph图库基础之上扩展K则最短路径算法;采用d 叉堆数据结构最优化排序待选最短路径;采用偏离边的方式发展多重最短路由。本发明提供的优选技术方案中,所述K短路径搜索方法包括如下步骤步骤1 调用Boost库函数计算源宿节点间最短路径,令k = 1 ;步骤2 如果要求路径分离,则调用支持分离的K短路径算法,否则进入步骤3 ;步骤3 定义d叉堆数据结构Q,将所求最短路径放入堆Q ;步骤4 判断如果k < K且堆Q不空,进入步骤5,否则算法结束;步骤5 从堆Q中弹取出第k短路径,记为P,采用偏离边方法从ρ发展新的偏离短路径,存入堆Q ;步骤6 :k++,返回步骤4 ;本发明提供的第二优选技术方案中,在所述步骤2中支持分离的K短路径搜索方法包括如下步骤步骤2-1 判断如果k < K并且第k短路径非空则进入步骤2-2,否则算法结束;步骤2-2 将前k短路径所有节点或边存入排除列表;步骤2-3 调用改进Boost库函数,忽略(不遍历)排除列表中的节点或边,求得第k+Ι短路径,存入所求K短路径集;步骤2-4 :k++,返回步骤2-1。本发明提供的第三优选技术方案中,在所述步骤5中以路径ρ为基础发展偏离路径方法包括如下步骤步骤5-1 令i =路径ρ偏离点索引;步骤5-2 判断如果i < p. size ()则进入步骤5-3,否则算法结束;步骤5-3 记录i对应节点为dev,记录路径ρ中第一个节点到第i节点集合为 colors,记录节点dev对应偏离边集合为edges ;步骤5-4 调用Boost函数计算以节点dev为始的最短路径Pt,需忽略节点集 colors 禾口边集 edges ;步骤5-5 根据Pt与colors合成新路径_p,计算_p的偏离点、偏离边集并作记录;步骤5-6 将新路径_p存入d叉堆Q,i++,返回步骤5-2。本发明提供的第四优选技术方案中,提供一种基于Boost库的K则最短路径搜索系统,其改进之处在于,所述搜索系统包括最短路径计算单元,调用Boost库函数计算含有限定条件的源宿节点间最短路径;分离路径计算单元,判断最短路径分离方式,如果要求路径分离,则调用支持分离的K短路径算法;K短路径筛选单元,设置d叉堆数据结构Q,将所求k短路径存入堆Q,并且自动筛选出第k短路径;偏离路径计算单元,根据从堆Q中弹取出的第k短路径P,采用偏离边方法从ρ发
5展新的偏离短路径,存入堆Q。本发明提供的第五优选技术方案中,所述分离路径判断计算单元,包括排除列表存储模块,存储前k短路径节点集和边集;分离路径计算模块,采用Boost库函数并且忽略排除列表中的节点集或边集计算第k+Ι短路径,存入所求K短路径集。本发明提供的第六优选技术方案中,所述偏离路径计算单元,包括偏离边存储模块,依次记录前k短路径的偏离点与偏离边集;偏离路径发展模块,以第k短路径ρ为基础,发展其对应的偏离路径集,并且存入 d叉堆Q;偏离路径合成模块,将路径ρ偏离点前一段路径与以偏离点为始的最短路径合成新路径_P,计算_P偏离点、偏离边集并存储。与现有技术方法相比,本发明提供的一种基于Boost库的K则最短路径搜索方法与系统,具有如下的特点1)采用STL标准模板库作为基本数据结构,拼弃传统固定大小数组结构,讲求高效率、高精度原则;2)由于采用了 Boost库的成熟数据结构和高效率的算法步骤,大大减少了计算的时间复杂度和空间复杂度,本发明可以适用于上百节点大规模网络的K短路由计算;3)本发明的方法是从计算机应用角度考虑,而非一般意义上的单纯算法概念,因此使网络多重路由问题的搜寻方法更加接近实用化,大大减轻实际设计或开发算法的工作量。


图1为K则最短路径计算机搜索方法的流程图。图2为支持分离方式的K则最短路径计算方法的流程图。图3为从给定最短路径基础上发展偏离路径的流程图。
具体实施例方式为了使本发明的目的、技术方案和优点更加清楚,下面结合附图及实例对本发明作进一步详细描述。假设所求K短路径问题是计算从s点到t点的路径跳数从小到大排序的前K短路径,要求所求最短路径不作分离限定。参考图1,为本发明所述K则最短路由计算机算法流程,结合上面的具体问题分析得如下所述具体步骤步骤1 定义所求前K短路径集为Kpaths。步骤2 调用Boost Graph库的BFS函数计算s — t的最短路径;步骤3 由于所求最短路径不作分离限定,直接进入步骤4 步骤4 定义d叉堆数据结构Q,将所求最短路径放入堆Q ;步骤5 记最短路径第一个顶点为其偏离点,记录该路径每个顶点的偏离边集为其出边;
步骤6 令 k = 1 ;步骤7 判断如果k < K并且堆Q非空则进入步骤8,否则算法结束;步骤8 弹出堆Q对应的最短路径p,即为所求的第k短路径,存入路径集Kpaths ;步骤9 根据所求第k短路径p,从其偏离点到最后一个顶点作遍历,依次发展新偏离点及偏离路径、更新顶点偏离边集,将所求偏离路径存入堆Q ;步骤10 :k++,返回步骤7 ;根据上面的流程,算法结束后,路径集Kpaths所存即为以路由路径跳数排序的前 K短路径。如上所述步骤9中,以当前第k短路径ρ为基础发展新偏离路径是一个复杂过程, 下面以前面实例为基础作详细描述。参考图3,为本发明所述从给定最短路径基础上发展偏离路径的算法流程,假定已经执行到步骤9,并且已求得第k短路径p,下面为从该路径ρ上发展偏离路径的算法流程, 算法步骤号从1开始重新编号,求其详细步骤如下步骤9-1 令i =路径ρ偏离点索引;步骤9-2 判断如果i < p. size ()则进入步骤3,否则算法结束;步骤9-3 记录i对应偏离点为dev,记录路径ρ中第一个节点到第i节点集合为 colors,记录节点dev对应偏离边集合为edges ;步骤9-4 调用BFS算法计算以节点dev为始的最短路径Pt,需忽略节点集colors 和边集edges ;步骤9-5 根据Pt与colors合成新路径_p,计算_p的偏离点、偏离边集并作记录;步骤9-6 将新路径_p存入d叉堆Q,i++,返回第2步。如上所述,每次在步骤5中获得新偏离路径_p,步骤6中存入堆Q,当本次算法结束后,Q中已经添加了以路径P为基础发展出来的待选路径集,这时进入前面K短路径算法步骤10循环执行即可求s点到t点的所有K短路径。以上的搜索从s点到t点不分离的、以路径跳数排序的前K短路径问题中,步骤2、 步骤9-4采用本发明所述K短路径搜索系统(以下简称搜索系统)中的“最短路径计算单元”计算所得;步骤4、步骤8、步骤9中对待选k短路径操作采用本搜索系统中的“K短路径筛选单元”计算所得;步骤9中的偏离路径采用本搜索系统的“偏离路径计算单元”计算所得;步骤9-3、步骤9-5采用“偏离边存储模块”读取或记录新路径_p的偏离点与偏离边集;步骤9-5采用“偏离边合成模块”计算得新待选k短路径_p。以上对本发明的实施步骤结合一个需求实例进行了详细说明,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想,实际可有不同于该实施例的步骤参数;同时,本发明所述的调用算法名称及一些特定数据结构名称均出自于Boost Graph库,如果需要详细了解本算法思想,必须首先了解Graph图库中相关算法及其所用的基本数据结构。需要声明的是,本发明内容及具体实施方式
意在证明本发明所提供技术方案的实际应用,不应解释为对本发明保护范围的限定。本领域技术人员在本发明的精神和原理启发下,可作各种修改、等同替换、或改进。但这些变更或修改均在申请待批的保护范围内。
权利要求
1.一种基于Boost库的K则最短路径搜索方法,所述方法采用偏离边算法搜寻多重路由,其特征在于,包括以下步骤(1).调用Boost库函数计算源宿节点间最短路径,定义变量k,令k=1 ;(2).判断最短路径分离方式,如果要求路径分离,则调用支持分离的K短路径算法,否则进入步骤3 ;(3).定义d叉堆数据结构Q,将所求最短路径放入堆Q;(4).从堆Q中弹取出第k短路径,记为p,采用偏离边方法从ρ发展新的偏离路径,存入堆Q。
2.根据权利要求1所述的搜索方法,其特征在于,所述步骤2中K是指所搜索的源宿节点间的指定的最短路径个数。
3.根据权利要求1所述的搜索方法,其特征在于,所述步骤4是一个循环过程,循环变量为k,每次循环后k++ ;在步骤4之前需要作条件判断,如果k < K且堆Q不空,则进入循环,否则算法结束。
4.根据权利要求1所述的搜索方法,其特征在于,所述步骤2中计算支持路径分离的K 则最短路径的方法包括以下步骤(2-1).采用排除列表存储前k短路径节点或边;(2-2).采用Boost库函数并且忽略排除列表中的节点或边计算第k+Ι短路径,存入所求K短路径集。
5.根据权利要求1所述的搜索方法,其特征在于,所述步骤4中以路径ρ为基础,发展偏离路径,其方法包括如下步骤(4-1).记录路径ρ偏离点为dev,记录ρ中dev前一段节点集合为colors,记录dev对应的偏离边集合为edges ;(4-2).计算以节点dev为始的最短路径Pt,忽略节点集color、边集edges ;(4-3).根据Pt与路径ρ中dev前一段路径节点合成新路径_P,计算_P偏离点、偏离边集并作记录;(4-4).新路径_p存入d叉堆Q。
6.根据权利要求4所述的搜索方法,其特征在于该方法为一个循环过程,循环变量为 k,每次循环后k++ ;在步骤2-1之前需要作条件判断,如果k < K并且第k短路径非空,则进入循环,否则算法结束。
7.根据权利要求5所述的搜索方法,其特征在于该方法为一个循环过程,第一次循环中dev为路径ρ偏离点,以后依次为从P中该点后一个节点直到最末一个节点作循环。
8.一种基于Boost库的K则最短路径搜索系统,其特征在于,所述系统包括最短路径计算单元,调用Boost库函数计算含有限定条件的源宿节点间最短路径;分离路径计算单元,判断短路径分离方式,如果要求路径分离,则调用支持分离的K短路径算法;K短路径筛选单元,设置d叉堆数据结构Q,将所求k短路径存入堆Q,并且自动筛选出第k短路径;偏离路径计算单元,根据从堆Q中弹取出的第k短路径p,采用偏离边方法从ρ发展新的偏离短路径集,存入堆Q。
9.根据权利要求8所述的搜索系统,其特征在于,所述分离路径计算单元,包括 排除列表存储模块,存储前k短路径节点集和边集;分离路径计算模块,采用Boost库函数并且忽略排除列表中的节点集或边集计算第 k+Ι短路径,存入所求K短路径集。
10.根据权利要求8所述的搜索系统,其特征在于,所述偏离路径计算单元,包括 偏离边存储模块,依次记录前k短路径的偏离点与偏离边集;偏离路径发展模块,以第k短路径ρ为基础,发展其对应的偏离路径集,并且存入d叉堆Q;偏离路径合成模块,将路径P偏离点前一段路径与以偏离点为始的最短路径合成新路径_P,计算_P偏离点、偏离边集并存储。
全文摘要
本发明提供了一种基于Boost图库的K则最短路径搜索方法和系统,所述方法在成熟的C++Boost Graph图库基础之上扩展K则最短路径算法;采用d叉堆数据结构最优化排序待选最短路径;采用偏离边的方式发展多重最短路由。该方法是从计算机应用角度考虑,在一定程度上解决K则最短路径问题的实用化难题,大大减轻实际设计或开发算法的工作量。该系统是基于该方法的一套软硬件系统,其已经集成了该方法的所有发明内容并且可以直接搜索计算前K短路径。
文档编号H04L12/56GK102523155SQ20111040647
公开日2012年6月27日 申请日期2011年12月8日 优先权日2011年12月8日
发明者卢利锋, 周静 申请人:中国电力科学研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1