本文介绍了算法书上常见的路径规划算法和工业界目前比较流行的高效分层路径规划算法。

目录

目录

1. 经典路径规划算法

1.1 Dijkstra

1.2 Bellman-Ford

1.3 SPFA 

 1.4 A*

1.5 Bidirectional Search(双向搜索)

 2. 分层规划算法

 2.1 CH算法 (Contraction Hierarchies)

2.1.1 CH预处理

2.1.2 CH查询

 2.2 CCH算法 (Customizable Contraction Hierarchies)

 2.3 CRP算法(Customizable Route Planning)

2.3.1 Overlay Graph(覆盖图)

2.3.2 覆盖图剪枝

2.3.3 预处理阶段

2.3.4 定制化阶段 

2.3.5 查询阶段

3.参考文献:


1. 经典路径规划算法

1.1 Dijkstra

1956 年 dijkstra 提出

用于计算带权有向图中单源最短路径

未使用优先队列版本,时间复杂度O(𝑉² )

        堆优化的实现版本,时间复杂度为O(E+VlogV)

道路路径规划算法 java 路径规划常用算法_算法

道路路径规划算法 java 路径规划常用算法_搜索_02

1.2 Bellman-Ford

Richard Bellman 和 Lester Ford 发表于 1958 年和 1956 年

用于计算带负权图的单源最短路径

使用动态规划进行算法设计

时间复杂度为 O(V * E)

实现简单 , 使用范围广 , 易于优化

     算法伪代码如下:

bool Bellman-Ford(G,w,s)        //图G 
  for each vertex v ∈ V(G):     //初始化
    d[v] ←+∞
  d[s] ←0                       	//源点距离自身为0
  for i = 1 → |V|:              
    for each edge (u,v) ∈ E(G):
      if d[v] > d[u] + w(u,v):
        d[v] = d[u] + w(u,v)
  for each edge(u,v) ∈ E(G):    //判断负权环路
    if d[v] > d[u] + w(u,v):
      return false
  return true

1.3 SPFA

SPFA ( Shortest Path Faster Algorithm )

Bellman-Ford 算法的队列优化版本

最坏情况时间复杂度也是 O(V * E)

两个优化策略: SLF(Small Label First )  和 LLL(Large Label Last)

 

道路路径规划算法 java 路径规划常用算法_算法_03

道路路径规划算法 java 路径规划常用算法_道路路径规划算法 java_04

 算法伪代码如下:

ProcedureSPFA;
Begin
    initialize-single-source(G,s);
    initialize-queue(Q);
    enqueue(Q,s);
    while not empty(Q) do begin
        u:=dequeue(Q);
        for each v∈adj[u] do begin
            tmp:=d[v];
            relax(u,v);
            if(tmp<>d[v])and(not v in Q)then enqueue(Q,v);
        end;
    end;
End;

A*

综合了 Best-First Search 和 Dijkstra 算法的优点

启发式搜索提高效率,且可以保证找到一条最优路径

可扩展为ALT , D* 等算法

A*算法的估算函数为:f(n)=g(n)+h(n)

f(n)  是节点 n 的综合优先级。

g(n)  是节点 n 距离起点的代价。

h(n)  是节点 n 距离终点的预计代价,即 A* 算法的启发函数。

启发函数可以是欧式距离、曼哈顿距离等

1.5 Bidirectional Search(双向搜索)

一个从起点开始向前搜索,一个从终点开始向后搜索,当两者相遇时停止搜索

通过对终点或起点的剩余距离的启发式估计来进行指导

大幅减少搜索范围,减少无效搜索

各个算法的图搜索半径:

道路路径规划算法 java 路径规划常用算法_预处理_05

分层规划算法

        主要分两种策略,第一种是针对交通网的,利用交通网本身所具有的分层特性,利用干道和支路对网络进行分层。这种策略应用面相对较窄,而且对网络的识别和预处理复杂,甚至需要人工干预。第二种策略即人工对网络进行分割构造分层结构,通过人工分割使各子网规模大致均等,并尽量使得分割后的子网相互独立。

CH算法 (Contraction Hierarchies)

2008 年 KIT4 名博士提出

包括预处理阶段和查询阶段

预处理需要几分钟到几小时,查询毫秒级

通过在预处理阶段增加节点间的 shortcut 加速查询

适用于权值变化比较慢的场景

2.1.1 CH预处理

生成node order

节点收缩顺序决定了预处理的性能

两种节点顺序试探法:1.自下而上 2.自上而下

自下而上采用贪心算法收缩完一个节点再处理一个节点

自上而下式在第一个节点收缩前预先计算整个节点顺序。效果更好,需要更多处理时间。嵌套解剖分割图。

道路路径规划算法 java 路径规划常用算法_搜索_06

2.增加 shortcut

增加虚拟的shortcut,以减少需要搜索的节点

  2.1.2 CH查询

1.Query

从起终点开始执行双向搜索

沿着 node hierarchy 向上 的顺序搜索

2. Path Unpack

    将shortcut解压为原始路径

道路路径规划算法 java 路径规划常用算法_算法_07

CCH算法 (Customizable Contraction Hierarchies)

为解决 CH 权值更新慢的问题, 2016 年 KIT 提出 CCH 算法

CCH 算法分为三个阶段:

1.Preprocessing 与权值无关的预处理阶段

使用Inertial Flow算法计算node order,可离线运行,保存到文件供在线定制查询使用。

2.Customization 与权值相关的定制化阶段

权值变化时使用变化后的权值更新权值相关的metric(定制化),支持并行更新和增量更新

3.Query 查询阶段

和CH算法相同,双向搜索然后unpack path。

CCH特点:

        预处理数分钟到数小时,定制化秒级,查询毫秒级

        可以很好地适应权值变化,支持多套权值,易于扩展

 2.3 CRP算法(Customizable Route Planning)

2013 年微软研究院 Delling 等三位工程师提出

应用于大陆级别的实际路网数据

支持任意类型权值类型 (metric)

响应时间满足实时查询的需求

快速的路况更新以及定制化 metric 更新

基于图分割的路径规划算法,把路网处理为多层 overlay graph

分为三个阶段:

Preprocessing: Metric 独立的预处理阶段(图分割)

Customization: Metric 相关的定制化阶段(更新 metric )

        3.Query: 查询阶段

2.3.1 Overlay Graph(覆盖图)

覆盖图的特点:

一个 node 属于且仅属于同一层的唯一一个 cell

每一层 cell 中的 node 数小于设定的参数 U( 每层不一样 )

一个 cell 的高层的 cell 记为 supercell, 对应的低层的 cell 记为 subcell

cell 边界的所有 node 记为 boundary vertex, 相同 level 连接不同 cell 的边记为 boundary arc

对于 cell 中每两个 boundary vertex 在当前 cell 内计算最短路径,这些最短路径记为 shortcut 或 clique

level-l中的所有boundary arc以及所有shortcut是level-(l-1)的覆盖图

2.3.2 覆盖图剪枝

保存cell中每一个clique有些浪费,很多不在最短路径上,可以对其剪枝

道路路径规划算法 java 路径规划常用算法_权值_08

reduction: 针对每两个boundary vertex在本层graph上进行Dijkstra搜索,把不是shortcut 的边删除。

skeleton graph:针对每个boundary vertex计算到当前cell内其他boundary vertex的最短路径树,最后对所有的最短路径树求并集构造为 skeleton graph。

预处理阶段

        使用PUNCH算法将图分割为多层overlay graph,存储为辅助数据,供定制化和查询使用
图分割的目标是overlay graph中boundary arc的数目尽量少,这会使定制化阶段耗费的时间和空间更少,路径查询更快
PUNCH算法的原理是利用路网中自然分割(河流,山川,高速公路)作为启发因子进行分割。
        预处理结果为一个多层的overlay graph, 每一个node都存在于各个level的cell中,每个level中boundary vertex不同。一个cell有p个入口节点,q个出口节点,就会有p*q个shortcut。

  2.3.4 定制化阶段 

采用自底向上的方式更新各个level中每个cell的shortcut权值
定制化与查询同时进行,因此定制化需要足够快
加速定制化的方法:

Improving Locality

对搜索图进行剪枝

使用其他搜索算法( spfa 等)

Multiple-source executions

并行计算

Phantom Levels

定制化的 ch 算法加速

增量更新

2.3.5 查询阶段

Query

找出node v与起终点没有交集的最大level(query level),迭代搜索。

Unpack

crp 为了节省内存,没有存储shortcut 对应的原始路径,需要双向搜索计算出shortcut中的原始路径

道路路径规划算法 java 路径规划常用算法_道路路径规划算法 java_09

3.参考文献:

Contraction Hierarchies: Faster and Simpler Hierarchical Routing in Road Networks

Customizable Route Planning in Road Networks 

Customizable Route Planning

Customizable Contraction Hierarchies

Graph Partitioning with Natural Cuts