





























A*算法是路径规划领域的经典算法,在实际应用中衍生出多种变种以适应不同场景。本文系统梳理A*算法及其主要变种,包括适用于动态环境的D*、D* Lite、LPA*,以及实时规划的ARA*、LRTA*、RTAA*等。
A* 算法家族可以按照应用场景分为以下几类:
| 类别 | 算法 | 特点 |
|---|---|---|
| 静态环境 | A*、Bidirectional A* | 环境已知且不变 |
| 动态环境 | D*、D* Lite、LPA*、Anytime D* | 环境可能变化,支持增量更新 |
| 实时规划 | ARA*、LRTA*、RTAA* | 时间受限,需要在截止前返回可行解 |
| 双向搜索 | Bidirectional A* | 从起点和终点同时搜索 |
A*算法是一种启发式搜索算法,用于在图形或网络中找到最短路径。它结合了Dijkstra算法的广度优先搜索和启发式函数的评估,以提高搜索效率。
评估函数:A*算法的核心是评估函数 $f(n) = g(n) + h(n)$,其中:
启发式函数的设计原则:
A* 才能保证找到最优解。A* 在扩展节点时一旦找到目标就可以立即停止。开放列表(Open List):存储待扩展的节点,通常使用优先队列(最小堆)实现,按照 f(n) 值从小到大排序。
封闭列表(Closed List):存储已经扩展过的节点,避免重复处理。通常使用哈希集合实现。
最优性保证:当启发式函数满足可采纳性时,A* 算法保证能找到从起点到目标的最短路径。这是因为 A* 总是优先扩展 f(n) 最小的节点,而可采纳的启发式保证了 f(n) 不会低估真实代价。
对于网格形式的图,有以下这些启发函数可以使用:
若图形中只允许朝上下左右四个方向移动,使用曼哈顿距离:
$$
h(n) = |x_n - x_{goal}| + |y_n - y_{goal}|
$$
若图形中允许朝八个方向移动(包括对角线),使用对角距离(切比雪夫距离):
$$
h(n) = \max(|x_n - x_{goal}|, |y_n - y_{goal}|)
$$
若图形中允许朝任何方向移动,使用欧几里得距离:
$$
h(n) = \sqrt{(x_n - x_{goal})^2 + (y_n - y_{goal})^2}
$$
初始化:
主循环:重复以下步骤直到找到目标或开放列表为空:
结束条件:
时间复杂度:最坏情况下为 $O(b^d)$,其中 b 是分支因子(每个节点的平均邻居数),d 是解的深度。使用好的启发式函数可以大幅减少实际搜索的节点数。
空间复杂度:$O(b^d)$,需要存储所有已访问和待访问的节点。

双向 A* 算法同时从起点和终点进行搜索,当两个搜索方向的"前沿"相遇时,合并得到完整路径。
双向搜索思想:同时从起点向终点搜索(前向搜索)和从终点向起点搜索(后向搜索)。当两个搜索方向扩展到同一个节点时,就可以合并两条路径得到完整解。
搜索空间减少:单向搜索的搜索空间约为 $O(b^d)$,而双向搜索理论上可以将搜索空间减少到 $O(2b^{d/2})$,其中 b 是分支因子,d 是解的深度。当 d 较大时,这种减少是显著的。
相遇条件:当某个节点同时被前向搜索和后向搜索扩展时,或者当一个方向的搜索扩展到另一个方向已经访问过的节点时,可以认为两个搜索"相遇"了。
启发式函数:
路径合并:当两个搜索相遇时,完整路径代价为 $g_{forward}(n) + g_{backward}(n)$,需要在所有相遇节点中选择代价最小的。
初始化:
交替扩展:重复以下步骤直到两个搜索相遇:
检查相遇:每次扩展后检查当前节点是否在另一个方向的已访问集合中。
路径重建:
注意:双向搜索的效率取决于两个搜索方向能否在搜索空间的"中间"相遇。如果相遇点靠近起点或终点,效率提升有限。

ARA* 是一种任意时间算法,可以在有限时间内返回一个可行解(可能不是最优),然后随着时间增加逐步优化解的质量,最终收敛到最优解。
任意时间特性:ARA* 可以在任何时刻被中断并返回当前找到的解。时间越充裕,解的质量越好。这对于实时系统非常重要,因为系统可能无法等待最优解的计算完成。
膨胀因子(Inflation Factor):ARA* 引入一个膨胀因子 $\epsilon \geq 1$,将评估函数修改为:
$$
f(n) = g(n) + \epsilon \cdot h(n)
$$
当 $\epsilon > 1$ 时,启发式函数被放大,算法会更激进地朝目标方向搜索,速度更快但可能错过最优解。
加权 A*:当 $\epsilon > 1$ 时,算法称为加权 A*(Weighted A*)。它找到的解的代价最多是最优解的 $\epsilon$ 倍,即 $cost \leq \epsilon \cdot cost_{optimal}$。
增量式优化:ARA* 不是每次从头开始搜索,而是复用上一轮搜索的结果。当减小 $\epsilon$ 后,只需要更新受影响的节点,而不是重新计算所有节点。
膨胀因子序列:通常使用递减序列,如 $\epsilon = {3.0, 2.0, 1.5, 1.0}$。当 $\epsilon = 1.0$ 时,算法退化为标准 A*,保证找到最优解。
初始化:
加权搜索阶段:
减小膨胀因子:
增量式更新:
最优搜索:
终止条件:
优势:ARA* 非常适合实时系统。例如,机器人导航时,可以先快速得到一条可行路径让机器人开始移动,然后在移动过程中不断优化路径。
解的质量保证:在膨胀因子为 $\epsilon$ 时找到的解,其代价满足 $cost \leq \epsilon \cdot cost_{optimal}$。

LRTA* 是一种实时启发式搜索算法,每次只扩展一个节点并立即执行移动。它通过"学习"不断改进启发式函数的估计值,在多次迭代后收敛到最优解。
实时性:LRTA* 的关键特点是每次决策的时间是恒定的,与问题规模无关。这使得它非常适合实时系统,如游戏 AI 或在线机器人导航。
边走边学:LRTA* 不是先规划完整路径再执行,而是边搜索边移动。每次选择一个邻居节点移动过去,然后更新当前状态的知识。
启发式值表(H值):LRTA* 为每个状态维护一个启发式值 H(s),初始时等于初始启发式函数 h(s)。随着搜索进行,H(s) 会不断更新,越来越接近真实的最短距离。
学习更新规则:当从状态 s 移动到 s’ 后,更新 H(s) 为:
$$
H(s) \leftarrow \max{H(s), \min_{s’‘}[c(s, s’‘) + H(s’')]}
$$
这个更新的含义是:H(s) 应该至少等于"从 s 到最近邻居的代价 + 该邻居的 H 值"。
收敛性:在有限状态空间中,如果 LRTA* 反复从起点到目标执行搜索,H 值会收敛到真实的最短距离,最终行为等价于最优策略。
初始化:
单步决策:重复以下步骤直到到达目标:
学习更新:
更新当前状态:
多轮迭代(可选):
时间复杂度:每步决策的时间为 O(d),其中 d 是每个节点的平均邻居数,与总状态数无关。
适用场景:LRTA* 特别适合状态空间巨大但需要实时响应的场景,如视频游戏中的 NPC 导航、大规模地图上的在线路径规划。

RTAA* 是 LRTA* 的改进版本,主要的改进在于一次更新多个节点的启发式值,从而加速学习过程。
与 LRTA 的关系*:RTAA* 继承了 LRTA* 的实时特性,每次决策时间恒定。但 RTAA* 的学习效率更高,收敛到最优解所需的迭代次数更少。
多节点更新:LRTA* 每次只更新当前状态的一个 H 值,而 RTAA* 会更新整个当前搜索局部区域内所有节点的 H 值。
局部搜索:RTAA* 每次不是只扩展一个节点,而是进行一个深度受限的局部搜索,得到一个局部最优路径,然后执行该路径的第一步。
更新范围:在一次更新中,RTAA* 会更新局部搜索范围内所有已访问节点的 H 值,使用它们到目标的实际距离(通过局部搜索得到)来更新。
初始化:
局部搜索:
执行一步:
批量更新 H 值:
继续搜索:
优势:RTAA* 的学习速度比 LRTA* 快,因为每次更新多个节点的 H 值,信息的传播更迅速。

LPA* 是一种增量式搜索算法,专门用于解决连续路径规划问题。当环境的边代价发生变化时,LPA* 可以高效地更新路径,而不需要从头开始重新搜索。
增量式搜索:LPA* 不是每次环境变化后从头搜索,而是复用之前的搜索结果,只更新受变化影响的部分。这大大提高了重复规划的效率。
两个 g 值:LPA* 为每个节点维护两个代价值:
节点状态:
优先队列的键值:LPA* 使用一个特殊的键值来排序优先队列:
$$
Key(s) = [\min(g(s), rhs(s)) + h(s); \min(g(s), rhs(s))]
$$
键值是一个二元组,首先比较第一个元素,相同时比较第二个元素。
与 A 的关系*:LPA* 可以看作是 A* 的增量式扩展。当环境不变化时,LPA* 的行为与 A* 相同。当环境变化时,LPA* 只需要更新受影响的节点。
初始化:
计算最短路径:
处理环境变化:
提取路径:
适用场景:LPA* 适用于起点固定,目标可能变化的连续规划问题。例如,游戏中的 NPC 从固定位置出发,玩家位置不断变化。

D* 是专为动态环境设计的增量式路径规划算法。它从目标向起点反向搜索,这使得当机器人移动时能够高效地响应环境变化。
反向搜索:与 A* 从起点向目标搜索不同,D* 从目标向起点搜索。这样做的好处是:当机器人(在起点)移动时,目标不变,之前计算的路径信息可以复用。
环境变化处理:当机器人发现环境变化(如发现新的障碍物)时,D* 不需要重新规划整条路径,而是局部更新受影响节点的信息,然后快速得到新路径。
节点标签:D* 中的每个节点有一个标签:
代价函数:
反向传播:当某个节点的代价发生变化时,D* 会将变化反向传播给其前驱节点,更新整条路径的信息。
初始化:
初始规划:
路径执行与监测:
检测到变化:
重规划:
继续执行:
优势:D* 的反向搜索使得当机器人在起点附近移动时,大部分已计算的路径信息仍然有效,只需要更新局部区域。
缺点:D* 的实现较为复杂,且需要维护较多的状态信息。

D* Lite 是 D* 的简化和改进版本。它基于 LPA* 的框架,通过添加启发式函数来加速搜索,同时保持了 D* 处理动态环境的能力。
与 LPA 的关系*:D* Lite 本质上是 LPA* 的变种,专门针对起点移动、目标固定的场景优化。它继承了 LPA* 的增量更新机制(g 值和 rhs 值)。
与 D 的关系*:D* Lite 的功能与 D* 相同,但实现更简单、效率更高。D* Lite 的代码量约为 D* 的一半,更容易理解和实现。
启发式函数:D* Lite 在 LPA* 的基础上添加了启发式函数 h(s, s_start),用于估计从当前节点到机器人当前位置(起点)的距离。这使得搜索更有方向性。
键值计算:D* Lite 的优先队列键值为:
$$
Key(s) = [\min(g(s), rhs(s)) + h(s, s_{start}) + k_m; \min(g(s), rhs(s))]
$$
其中 $k_m$ 是一个修饰值,用于在机器人移动后调整键值,避免重新计算所有节点的键值。
机器人移动:当机器人从 s_start 移动到 s’_start 时:
初始化:
计算最短路径:
机器人移动:
处理环境变化:
更新起点并重规划:
重复执行:
优势:D* Lite 结合了 LPA* 的增量更新和 A* 的启发式搜索,效率高且易于实现。它是目前动态环境路径规划中最实用的算法之一。
适用场景:移动机器人导航、未知环境探索、自动驾驶车辆的重规划。
Anytime D* 结合了 Anytime 和 D* 的思想,既支持动态环境下的增量更新,又能在时间受限时返回次优解并逐步优化。
任意时间特性:与 ARA* 类似,Anytime D* 可以在任何时刻返回当前找到的解,并随时间增加优化解的质量。
动态环境支持:与 D* Lite 类似,Anytime D* 可以高效处理环境变化,增量更新路径。
膨胀因子:Anytime D* 使用膨胀因子 $\epsilon \geq 1$:
结合两种能力:
初始化:
加权搜索:
路径执行:
优化阶段(时间允许时):
终止:
适用场景:Anytime D* 适合动态环境下的实时系统,如自动驾驶、机器人足球、动态游戏环境。

| 场景 | 推荐算法 | 理由 |
|---|---|---|
| 静态环境,单次查询 | A* | 简单高效,保证最优 |
| 静态环境,大规模图 | Bidirectional A* | 减少搜索空间 |
| 静态环境,时间受限 | ARA* | 快速返回次优解,可逐步优化 |
| 动态环境,需要重规划 | D* Lite、LPA* | 增量更新,高效 |
| 实时决策,未知环境 | LRTA*、RTAA* | 每步决策时间恒定 |
| 动态环境 + 时间受限 | Anytime D* | 兼顾两者 |
| 算法 | 最优性 | 增量更新 | 实时性 | 实现复杂度 | 适用环境 |
|---|---|---|---|---|---|
| A* | ✓ | ✗ | ✗ | 低 | 静态 |
| Bidirectional A* | ✓ | ✗ | ✗ | 低 | 静态 |
| ARA* | 渐近最优 | ✗ | ✓ | 中 | 静态 |
| LRTA* | 渐近最优 | ✗ | ✓ | 中 | 静态/未知 |
| RTAA* | 渐近最优 | ✗ | ✓ | 中 | 静态/未知 |
| LPA* | ✓ | ✓ | ✗ | 中 | 动态 |
| D* | ✓ | ✓ | ✗ | 高 | 动态 |
| D* Lite | ✓ | ✓ | ✗ | 中 | 动态 |
| Anytime D* | 渐近最优 | ✓ | ✓ | 高 | 动态 |
1 | |
推荐参考 PathPlanning 仓库,包含:
文章链接:
https://www.zywvvd.com/notes/study/algorithm/graph/astar-variants/astar-variants/
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。