基于搜索的路径规划
图搜索算法:DFS、BFS、GBFS、Dijkstra、A*
DFS
BFS
GBFS
采用优先队列作为openlist
GBFS(Greedy Best-First Search)是一种启发式搜索算法,通常用于解决图搜索问题,例如图的最短路径或解决问题的状态空间搜索。下面是GBFS算法的优点和缺点:
GBFS的优点:
-
高效性:GBFS使用启发式函数(heuristic function)来估计节点到目标节点的距离,然后根据这个估计值选择下一个要扩展的节点。这使得它在大多数情况下能够快速找到解决方案,特别是当启发式函数能够提供良好的估计时。
-
节点扩展少:GBFS倾向于首先扩展那些离目标节点更接近的节点,这导致它通常需要扩展的节点数量较少,相对于一些其他搜索算法,如广度优先搜索(BFS)和深度优先搜索(DFS),它通常更高效。
GBFS的缺点:
-
不保证最优解:GBFS不像A*搜索算法那样保证找到最优解。它只能找到第一个达到目标节点的解决方案,而不一定是最短路径或最佳解决方案。这是因为GBFS只根据启发式函数的估计值来选择下一个节点,而不考虑已经走过的路径的实际代价。
-
启发式函数的质量影响结果:GBFS的性能高度依赖于所使用的启发式函数的质量。如果启发式函数提供了不准确的估计,GBFS可能会导致不良的搜索结果,可能陷入循环或产生次优解。
-
不适用于问题的动态性:GBFS通常用于静态问题,其中问题的状态空间不随时间变化。对于动态问题,需要考虑重新规划或使用其他搜索算法。
总的来说,GBFS是一种高效的搜索算法,适用于许多问题,但需要谨慎选择和调整启发式函数,以确保获得良好的性能。如果需要找到最优解,可能需要考虑使用A*搜索算法或其他保证最优解的算法。
h(n):从当前节点到终点的移动代价
Dijkstra
采用优先队列作为openlist
Dijkstra算法是一种用于解决单源最短路径问题的经典算法,它有一些优点和缺点,下面我将分别列出它们。
Dijkstra算法的优点:
-
精确性:Dijkstra算法能够找到从一个起始节点到所有其他节点的最短路径,而且保证结果的准确性。这使得它在需要准确路径信息的情况下非常有用,比如导航系统和网络路由算法。
-
广泛适用:Dijkstra算法适用于不带负权边的有向图或无向图。这意味着它可以应用于许多实际问题,而不会出现负权环的问题。
-
可以生成路径信息:Dijkstra算法不仅可以找到最短路径的长度,还可以生成实际的路径信息,这对于许多应用非常重要,如地图导航。
Dijkstra算法的缺点:
-
时间复杂度高:Dijkstra算法使用贪心策略,每次选择距离最近的节点进行扩展,但在稠密图中,它的时间复杂度为O(V^2),其中V是节点的数量。在稀疏图中,可以通过使用最小堆等数据结构来降低时间复杂度到O(E + V*log(V)),其中E是边的数量。然而,这仍然可能会导致较长的计算时间,特别是在大型图中。
-
不适用于带有负权边的情况:Dijkstra算法不适用于包含负权边的图,因为它假定所有边的权重都为非负数。如果图中存在负权边,该算法可能会产生不正确的结果。
-
不考虑其他因素:Dijkstra算法只考虑了路径的长度,而不考虑其他因素,如交通状况、道路条件等。在某些实际应用中,这可能不足以产生最佳路径。
-
不适用于动态图:如果图的结构或边的权重经常变化,Dijkstra算法的效率可能会受到影响,因为它需要重新计算所有路径。
综上所述,Dijkstra算法在许多情况下是一个有效的最短路径算法,但需要考虑到它的时间复杂度和对负权边的不适用性,以及在实际应用中可能需要考虑的其他因素。在某些情况下,其他算法,如Bellman-Ford算法或A*搜索算法,可能更适合解决最短路径问题。
g(n):从起点到当前节点的移动代价
A*算法
把起始格添加到 "开启列表"
do
{
寻找开启列表中F值最低的格子, 我们称它为当前格.
把它切换到关闭列表.
对当前格相邻的8格中的每一个
if (它不可通过 || 已经在 "关闭列表" 中)
{
什么也不做.
}
if (它不在开启列表中)
{
把它添加进 "开启列表", 把当前格作为这一格的父节点, 计算这一格的 FGH
}
if (它已经在开启列表中)
{
if (用 G 值为参考检查新的路径是否更好, 更低的G值意味着更好的路径)
{
把这一格的父节点改成当前格, 并且重新计算这一格的 GF 值.
}
}
} while( 目标格已经在 "开启列表", 这时候路径被找到)
如果开启列表已经空了, 说明路径不存在.
最后从目标格开始, 沿着每一格的父节点移动直到回到起始格, 这就是路径.
采用优先队列作为openlist
JPS算法
基于采样的路径规划算法
PRM
随机采样
learning phase:
query phase 查询阶段:a*算法
优势:
概率完备:一定能求出存在的解
高效
劣势:
运动学约束问题
不管障碍物约束连线
全部连接,删除障碍物节点
RRT-快速搜索随机树
劣势:狭窄路径无法通过
改进
Kd-tree寻找最近的节点
RRT connect
RRT*
rewire剪枝优化
kinodynamic-RRT*
解决运动学约束问题
anytime-RRT*
实时运算
informed RRT*
优化均匀撒点的效率
cross-entropy motion planning
else
工具