去看【原文】
Dijkstra算法是一种单向的最短路径算法,有研究者就提出了一种优化方法,即双向Dijkstra算法。其主要思想就是从起点和终点同时开始搜索,这样应该能够提升算法效率。事实证明,在大部分情况下,双向Dijkstra算法还是要优于单向的Dijkstra算法。
算法介绍
前面介绍过Dijkstra算法,一些相关的定义可以参考前文。
图的定义以及优先队列的有关定义可以参考前面推送的文章:
去看【最短路径算法–Dijkstra】
Dijkstra算法是单点源的形式往外搜索,它的搜索空间长这样:
双向Dijkstra算法顾名思义,就是从两个方向同时开始搜索,它的搜索空间长这样:
算法原理
Dijkstra算法一个方向搜索需要一个优先队列,那双向Dijkstra算法也就需要两个优先队列了。两个优先队列交替取出最小的元素来扩展,扩展的时候需要检测是否包含环,其扩展过程与Dijkstra算法一样。其原理是从起点和终点依次执行单向的Dijkstra算法,即前向和后向Dijkstra扩展搜索。当两个方向第一次相遇时,会得到一条候选最短路径,第一次相遇后,后续节点扩展时,只需访问已经出过队列的那些节点即可。在这个过程中,全局最优路径就是所有相遇节点的正向代价和方向代价之和的最小值。
实验对比
测试部分比较了单向Dijkstra算法、双向Dijkstra算法、A*算法的计算效率。随机取了100对OD,分别记录每对OD最短路径计算的运行时间以及扩展节点数量。
使用路网1时的计算结果:
Construct network adjacent list ...
Construct network adjacent finished! It consumes 0.931 seconds.
Start to calculate 1th shortest path from 1129 to 167 ...
Dijkstra Algo: The shortest path cost is 17289.119, It consumes 0.048 seconds and selects 832 nodes
AStar Algo: The shortest path cost is 17289.119, It consumes 0.003 seconds and selects 48 nodes
Bi-Dijkstra Algo: The shortest path cost is 17289.119, It consumes 0.016 seconds and selects 366 nodes
Start to calculate 2th shortest path from 769 to 3498 ...
Dijkstra Algo: The shortest path cost is 5522.333, It consumes 0.016 seconds and selects 301 nodes