本文介绍了算法书上常见的路径规划算法和工业界目前比较流行的高效分层路径规划算法。
目录
目录
1.5 Bidirectional Search(双向搜索)
2.1 CH算法 (Contraction Hierarchies)
2.2 CCH算法 (Customizable Contraction Hierarchies)
2.3 CRP算法(Customizable Route Planning)
1. 经典路径规划算法
1.1 Dijkstra
•
1956
年
dijkstra
提出
•
用于计算带权有向图中单源最短路径
•
未使用优先队列版本,时间复杂度O(𝑉²
)
堆优化的实现版本,时间复杂度为O(E+VlogV)
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)
算法伪代码如下:
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;
1.4 A*
•
综合了
Best-First Search
和
Dijkstra
算法的优点
•
启发式搜索提高效率,且可以保证找到一条最优路径
•
可扩展为ALT
,
D*
等算法
A*算法的估算函数为: