



















本文简单介绍各路径规划算法的概念和流程,可用于对算法的初步了解。
Dijkstra算法是一种用于求解图中单源最短路径问题的经典算法。它可以用来找到从一个顶点到其他所有顶点的最短路径。
创建一个距离集合和一个顶点集合。距离集合用于记录从起点到每个顶点的最短路径距离,初始时所有距离设置为无穷大(表示无法到达)。顶点集合用于存储图中的所有顶点。
将起点的距离设置为0,并将其标记为当前顶点。
迭代更新距离集合,直到所有顶点都被标记为已访问。
a. 遍历当前顶点的所有邻居顶点。
b. 对于每个邻居顶点,计算通过当前顶点到达该邻居顶点的距离,即当前顶点的距离加上从当前顶点到邻居顶点的边的权重。
c. 如果计算得到的距离小于距离集合中记录的距离,则更新距离集合中该邻居顶点的距离。
d. 重复步骤a到c,直到遍历完当前顶点的所有邻居顶点。
将当前顶点标记为已访问,表示已经找到了从起点到该顶点的最短路径。
选择下一个当前顶点:从未访问的顶点中选择距离最短的顶点作为下一个当前顶点。
重复步骤3到5,直到所有顶点都被标记为已访问。
最短路径提取:根据距离集合中记录的最短路径距离,可以回溯找到从起点到其他所有顶点的最短路径。
通过以上流程,Dijkstra算法能够逐步更新距离集合中的距离,最终得到从起点到其他所有顶点的最短路径和对应的距离。
Floyd算法又称为 Floyd-Warshall 算法,是一种动态规划算法,用于解决任意两点之间的最短路径问题。该算法在图中存在负权边和环的情况下仍然保证正确性。
Floyd算法的思想是动态规划,通过枚举所有可能的中间节点,来逐步更新每个节点之间的距离。具体而言,算法根据当前结点之间的最短路径和中间节点更新后的最短路径,依次更新每个节点之间的最短路径。由于每次先将中间节点作为当前节点进行考虑,再按照不同的中间节点进行循环,所以也被称为多源最短路径算法。
值得注意的是,在Floyd算法中,对于每个中间节点k,都会更新一次所有顶点之间的距离,时间复杂度为O(n^3)。因此,Floyd算法适用于顶点数较少的图,对于大型图来说效率较低。
A*算法是一种启发式搜索算法,用于在图形或网络中找到最短路径。它结合了Dijkstra算法的广度优先搜索和启发式函数的评估,以提高搜索效率。
D*(D-star)算法是一种增量式路径规划算法,用于在动态环境中更新和重新规划路径。它是 A* 算法的扩展,可以有效地应对环境状态的变化。
D* 算法将路径规划问题抽象为一个有向图,图的节点表示位置或状态,图的边表示连接两个节点的可能移动或转换方式。算法是一种基于启发式搜索的路径规划算法,它可以在动态环境中找到最短路径。与A*算法不同,D*算法是增量式的,也就是说,它可以在实时环境中对路径进行增量更新。D*算法最初由Sven Koenig和Maxim Likhachev在2002年提出。
D*算法的基本思想是:在一个有向图上,从起点到终点的最短路径必定是一系列连续的边,而不是一些离散的节点。因此,D算法不是从起点开始,而是从终点开始,不断向起点方向搜索路径,并根据环境的变化动态更新路径。
快速搜索随机树
RRT*使用树结构来表示搜索空间。树的节点表示搜索过程中的状态,边表示节点之间的连接关系。RRT*通过随机采样在搜索空间中生成新的节点。这些采样点可以在整个搜索空间中随机选择,也可以根据目标位置的分布进行更加智能化的采样。RRT*维护一个近邻节点集合。该集合可以根据节点之间的距离进行排序,以便更快地找到最近的节点。RRT*引入了一个代价函数来评估路径的优劣。代价函数考虑了路径的长度和其他性能指标,帮助算法在搜索过程中找到更优的路径。RRT*会定期检查树中的节点,尝试通过改变连接关系来改善现有路径。这样可以在不重新规划整个路径的情况下,通过局部优化来提高路径质量。RRT*会终止搜索并返回最优路径。RRT*算法通过不断扩展树结构和优化路径,使得搜索空间中的采样点趋向于目标,并找到最优路径。它在机器人路径规划、无人机路径规划等领域具有广泛应用。
RRT* 的关键特点之一是不断优化节点之间的连接,以寻找最优路径。这意味着随着迭代次数的增加,算法将收敛到全局最优路径(在无障碍情况下),并且具有渐近最优性和一致性的特点。此外,RRT* 可以在高维、复杂的环境中进行路径规划,并且适用于自主机器人导航等领域。LPA*(Lifelong Planning A*)算法是一种用于路径规划的增量式搜索算法,旨在解决动态环境中的路径规划问题。它是A*算法的改进版本,具有以下基本概念和特点:
LPA*是一种增量式搜索算法,它可以逐步构建路径规划并在需要时进行更新。这使得它适用于动态环境,其中障碍物的位置或代价可能随时间变化。LPA*维护一个代价地图,其中每个节点都有一个代价值(cost)。这个代价值表示从起始节点到该节点的路径代价。初始时,只有起始节点的代价值为零,其他节点的代价值未知。LPA*同时从起始节点和目标节点执行搜索,以便在搜索过程中快速找到一条路径。这有助于提高路径规划的效率。LPA*可以快速更新路径,以考虑新的信息。它只需要更新受影响的节点,而不需要重新计算整个路径。LPA*算法使用启发式函数来估计从当前节点到目标节点的代价。启发式函数可以是欧式距离、曼哈顿距离等。A*类似,LPA*可以保证找到最短路径(最低代价路径),前提是代价函数满足一致性条件(Admissible and Consistent)。LPA*通过扩展具有最小代价的节点来构建路径。这些节点通常是距离起始节点最近的未扩展节点。LPA*不仅寻找最佳路径,还保留备选路径信息。这有助于在需要时切换到替代路径,以适应环境变化或障碍物的出现。LPA*算法是一种适用于动态环境下的路径规划算法,具有增量搜索、代价地图和最优性保证等特点。它可以用于自主机器人导航、自动驾驶车辆、游戏开发和其他需要实时路径规划的应用中。LPA*算法通过不断地选择和更新优先级队列中的节点,逐步优化代价值,直到找到一条到达目标节点的路径或者确定无法到达目标节点。在每次更新节点时,需要考虑节点的代价值和启发式函数的值来确定优先级。在
A*的基础上,延伸到了动态环境,与D*lite算法蛮类似的,都是动态环境,都加入了启发函数。
D*Lite算法是一种路径规划算法,旨在解决在动态环境中的最短路径问题。它是对D算法的改进和优化。
D*Lite算法的基本概念如下:
DLite算法的优点在于它能够在动态环境中实时更新路径,并能够处理障碍物的变化。这使得它在机器人导航、无人机路径规划等领域有着广泛的应用。如果你想深入了解DLite算法的实现细节和应用示例,我建议你查阅相关的学术论文和在线资源。
在D算法的基础上加了个和A*算法类似的启发函数,对当前情况进行评估,从而选出最优。
Dijkstra算法对于带权图中任意两个节点之间的最短路径问题非常有效,但在大规模图和复杂环境中,由于需要搜索所有可达节点,其时间和空间复杂度较高。
为了解决Dijkstra算法效率低的问题,A*算法作为一种启发式算法被提出。该算法在广度优先的基础上加入了一个估价函数。通过合理设计启发函数(估价函数),可以将搜索范围缩小到可能最佳路径周围的区域,从而大大减少搜索节点的数量。确保按照最小的总代价进行搜索。
简单来说,Dijkstra算法不错,但是节点多的时候,挨着搜还是太慢了,不如加个估价函数,然后先评估一下哪个地方可能最佳,直接缩小节点数量,提高效率,由此提出了
A*算法
当然,我们点与点之间的关系,不可能只有距离,有时还用一种权重去表示,这样,就有了负权边,负权边可以在某些特定情况下引入更复杂的问题,因为它们与正权边不同,可能会影响最短路径计算的结果。
对于一些最短路径算法,如Dijkstra算法,其前提条件是边的权重必须为非负数。而Floyd算法则可以处理带有负权边的图。
A*算法适用于在静态环境中搜索单源最短路径,但是环境是不停的变化的,比如说玩游戏的自动寻路,他不可能一直直着走,也会拐弯,需要避障,这是就提出了在动态环境下进行路径规划的D*算法。D*算法是增量式的,D*算法不是从起点开始,而是从终点开始,不断向起点方向搜索路径,并根据环境的变化动态更新路径,但是,D*算法需要提前获取一条路径进行参考,并且在动态环境中需要实时响应变化,可能会受到计算和存储开销的限制。D*算法适用于在动态环境中进行路径重新规划。
D*算法为了避障,每次更新都会遍历整个路径,可能导致较高的计算复杂度。对于大规模环境或频繁更新路径的情况,性能可能会有所下降。所以DLite算法在D算法的基础上引入了启发式函数和优先队列,以减少不必要的计算量和提高搜索效率。通过使用与A类似的启发式函数,D*Lite算法能够更好地选择节点进行扩展,从而优化路径规划的质量和性能。
LPA*算法是基于A*算法的扩展,用于解决动态环境下的路径规划问题。它通过维护节点的当前代价值和参考代价值,以及一个更新列表,通过多次迭代搜索和增量更新策略来实现路径的快速更新。LPA*算法和D*算法都是增量式路径规划算法,用于处理动态环境下的路径更新问题。相比于D*算法,LPA*算法引入了参考代价值和更新列表,采用多次迭代搜索和增量更新策略,更加高效地进行路径更新。具体选择哪种算法应根据具体问题需求和环境特点进行评估。
RRT算法适用于在复杂、高维空间中的路径规划。
Floyd算法适合找寻任意两点之间的最短路径。
文章链接:
https://www.zywvvd.com/notes/study/algorithm/graph/path-plan/path-plan/
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。