路径规划算法---A* 算法详解:最优路径规划的启发式之王

A*(A-Star)算法是最常用、最实用的路径规划算法之一。它结合了 Dijkstra 算法的最短路径保证与启发式搜索的高效性,是自动驾驶、机器人、游戏 AI 等领域的“黄金标准”。


一、A* 是什么?

A* 是一种启发式图搜索算法,用于在图中寻找从起点到目标的最短路径。
它兼顾两件事:

  • 已经走过的真实代价(走了多远)
  • 到目标的预计距离(还有多远)

并通过一个公式综合评估下一步该往哪走。


二、核心思想公式

f(n) = g(n) + h(n)
符号 含义
g(n) 从起点走到当前节点 n 的真实代价
h(n) 从当前节点 n 到目标的预估代价(启发函数)
f(n) 当前路径的综合预估代价(用于排序)

A* 每次从候选节点中选择 f(n) 最小的进行扩展。


三、适用场景

场景 说明
地图导航 百度地图、高德地图中的最短路径计算
游戏寻路 NPC 自动追踪角色路径
仓储机器人调度 机器人在网格地图中寻找最短无障碍路线
自动驾驶 低速路径规划(如泊车)中的网格导航模块

四、算法执行流程

  1. 起点入队,f(start) = g=0 + h(start)
  2. 重复以下操作,直到找到目标或队列为空:
    • 从 OPEN 列表中取出 f 最小的节点 n
    • 如果 n 是目标,结束并返回路径
    • 否则:
      • 遍历 n 的所有邻居 m
      • 计算 g(m)、h(m)、f(m)
      • 如果比之前更优,就更新并加入 OPEN 队列

五、启发函数 h(n) 设计

最常用的启发函数:

启发函数 适用环境 公式
曼哈顿距离 网格地图,不能斜走 |x1-x2|+ |y1-y2|
|欧几里得距离 连续空间,可斜走 sqrt((x1-x2)² + (y1-y2)²)
零函数 等价于 Dijkstra h(n) = 0(最保守但最慢)

六、示例图 + 执行示意

我们以一个简单的 2D 网格地图为例,障碍物为 #,空地为 .:

Start → S
Goal  → G

S . . #
. # . .
. # . G

A* 会优先向目标方向(右下)扩展,而不会像 Dijkstra 一样四面八方扩展。


七、Python 简单实现示例

import heapq

def heuristic(a, b):
    return abs(a[0] - b[0]) + abs(a[1] - b[1])  # 曼哈顿

def a_star(grid, start, goal):
    open_set = []
    heapq.heappush(open_set, (0, start))
    came_from = {}
    g_score = {start: 0}

    while open_set:
        _, current = heapq.heappop(open_set)
        if current == goal:
            return reconstruct_path(came_from, current)

        for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
            neighbor = (current[0]+dx, current[1]+dy)
            if 0 <= neighbor[0] < len(grid) and 0 <= neighbor[1] < len(grid[0]):
                if grid[neighbor[0]][neighbor[1]] == '#': continue
                temp_g = g_score[current] + 1
                if neighbor not in g_score or temp_g < g_score[neighbor]:
                    g_score[neighbor] = temp_g
                    f_score = temp_g + heuristic(neighbor, goal)
                    heapq.heappush(open_set, (f_score, neighbor))
                    came_from[neighbor] = current

八、时间复杂度

  • 最坏复杂度:O(E) 或 O(V + E log V)(用堆优化时)
  • 最优复杂度:启发函数 h(n) 越精准,效率越高
  • 最差退化为 Dijkstra(当 h(n)=0

九、与其他算法对比

算法 启发式 是否最优 适用场景
BFS ✅(无权图) 步数最少
Dijkstra 有权图
A* ✅(若 h admissible) 导航、调度
RRT / PRM ❌(概率性) 连续空间
时空 A* 多机器人避障

十、优点与缺点

优点 缺点
✅ 找到最短路径
✅ 扩展方向“有目的性”
✅ h 可定制,灵活性高
❌ 空间复杂度高(需保存 OPEN、CLOSED 列表)
❌ h 不合适时效率低(可能退化为 Dijkstra)

十一、一段话总结

A* 算法是最经典的启发式搜索算法,能在保证最短路径的前提下减少搜索空间。它结合了实际花费 g(n) 和启发估计 h(n),适用于导航、机器人路径规划等。
我理解并实现过 A* 算法,掌握了如何设计启发函数、调整搜索效率,并能结合实际场景如网格地图或动态障碍进行改造。

A* 是图搜索算法中的黄金标准,在效率与最优性之间取得了极好平衡。它既适合入门学习图搜索,又在真实项目中广泛应用,是面试必备算法之一。

你可能感兴趣的:(路径规划算法,算法,路径规划,A算法,图搜索算法)