路径规划算法总结:从 Dijkstra 到 A* 与 Hybrid A

混合A*算法(Hybrid A*) 1、混合A*算法(Hybrid A*)简介 本课题为了完成在已知环境下的侧方位停车和倒车入库的任务规划,采用斯坦福大学所提出来的Hybrid A*算法,并基于开源机器人操作系统其进行实现。其中,在2010年斯坦福的Dmitri Dolgov, Sebastian Thrun, Michael Montemerlo等人在国际顶级期刊International Journal of Robotics Reaserch上首次提出混合A*算法(Hybrid A*算法)用于解决在侧方位停车和倒车入库过程中的路径规划 阅读详情

1. 路径规划算法

1.1 Dijkstra 算法

Dijkstra 算法是一种广度优先搜索(BFS)的变种,用于在加权图中寻找单源最短路径。

核心思想:

  • 维护一个 OpenList(优先队列),按当前已知最短路径 g(n) 排序。
  • 每次从 OpenList 取出 g(n) 最小的节点 n,并扩展其所有邻居 m:
    • 若 g(n) + cost(n, m) < g(m),则更新 g(m) 并重新入队。
  • 最终,所有可达节点的 g(n) 即为最短路径。

伪代码:

def dijkstra(graph, start):
    OpenList = PriorityQueue()  # 按 g(n) 排序
    OpenList.push(start, g=0)
    ClosedList = set()          # 已扩展节点
    g = {start: 0}              # 记录各节点的最小 g(n)

    while OpenList:
        n = OpenList.pop()      # 取出 g(n) 最小的节点
        if n in ClosedList:
            continue
        ClosedList.add(n)
        
        for m in graph.neighbors(n):
            new_g = g[n] + graph.cost(n, m)
            if m not in g or new_g < g[m]:
                g[m] = new_g
                OpenList.push(m, g=new_g)
    return g

特点:

  • 无启发式,仅依赖 g(n),搜索范围大,效率低。
  • 保证最优解,但计算量高。

1.2 A* 算法

A* 在 Dijkstra 的基础上引入启发函数 h(n),使搜索更高效。

核心思想:

  • 优先级改为 f(n) = g(n) + h(n),其中 h(n) 是估计的剩余代价(如欧氏距离)。
  • 若 h(n) 可采纳(h(n) ≤ h*(n)),则 A* 保证最优解。
  • 若 h(n) 一致(h(n) ≤ cost(n, m) + h(m)),则 Closed List 无需重复检查。

伪代码:

def astar(graph, start, goal):
    OpenList = PriorityQueue()  # 按 f(n) = g(n) + h(n) 排序
    OpenList.push(start, f=0 + heuristic(start, goal))
    ClosedList = set()          # 已扩展节点
    g = {start: 0}              # 记录各节点的最小 g(n)

    while OpenList:
        n = OpenList.pop()      # 取出 f(n) 最小的节点
        if n == goal:
            return reconstruct_path(n)
        if n in ClosedList:
            continue
        ClosedList.add(n)
        
        for m in graph.neighbors(n):
            new_g = g[n] + graph.cost(n, m)
            if m not in g or new_g < g[m]:
                g[m] = new_g
                f = new_g + heuristic(m, goal)
                OpenList.push(m, f=f)
    return None

相比 Dijkstra 的优势:

  1. 搜索方向更集中,减少不必要的扩展。
  2. 计算效率更高,尤其在大规模地图上。
  3. 可调节启发函数(如 Weighted A*),平衡最优性与速度。

1.3 混合 A* 算法

Hybrid A* 结合了离散搜索(A*)与连续运动规划,适用于车辆运动学约束(如转向半径)。

核心思想:

  • 状态表示为 (x, y, θ),考虑转向角 δ 和步长 L。
  • 使用 Reeds-Shepp 曲线 或 Dubins 路径 作为启发函数。
  • 在 OpenList 中存储连续状态,但离散化碰撞检测。

伪代码(简化):

def hybrid_astar(start, goal, grid):
    OpenList = PriorityQueue()
    OpenList.push(start, f=0 + heuristic(start, goal))
    ClosedList = set()  # 离散化存储 (x, y, θ)

    while OpenList:
        n = OpenList.pop()
        if distance(n, goal) < threshold:
            return path
        if (n.x, n.y, n.θ) in ClosedList:
            continue
        ClosedList.add((n.x, n.y, n.θ))

        for δ in [-π/6, 0, π/6]:  # 可能的转向角
            new_θ = n.θ + (L * tan(δ) / wheelbase)
            new_x = n.x + L * cos(new_θ)
            new_y = n.y + L * sin(new_θ)
            if not collision(new_x, new_y, grid):
                g = n.g + L
                h = reeds_shepp_heuristic((new_x, new_y, new_θ), goal)
                OpenList.push(Node(new_x, new_y, new_θ, g, g + h))
    return None

适用场景:

  • 自动驾驶(考虑转向约束)。
  • 机器人导航(非完整运动学)。

2. OpenList 与 ClosedList 的作用

2.1 在 Dijkstra 算法中

  • OpenList:存储待扩展节点,按 g(n) 排序。
  • ClosedList:存储已扩展节点,避免重复计算。

特点:

  • 无启发式,OpenList 会均匀扩展所有方向。
  • ClosedList 仅用于剪枝,不影响最优性。

2.2 在 A* 算法中

  • OpenList:存储待扩展节点,按 f(n) = g(n) + h(n) 排序。
  • ClosedList:存储已扩展节点,若 h(n) 一致,则无需重复检查。

特点:

  • 启发式引导,OpenList 优先扩展“更可能接近目标”的节点。
  • ClosedList 更高效,因为 A* 的扩展范围更小。

3. 启发函数的设计

3.1 基本要求

  1. 可采纳性(Admissible):
    h(n) ≤ h*(n)
    保证 A* 找到最优解。
  2. 一致性(Consistent):
    h(n) ≤ cost(n, m) + h(m)
    保证 Closed List 无需重复检查。

3.2 常见启发函数

类型公式适用场景
曼哈顿距离`h(n) =x_n - x_g
欧氏距离h(n) = sqrt((x_n - x_g)^2 + (y_n - y_g)^2)连续空间
切比雪夫距离`h(n) = max(x_n - x_g
模式数据库(PDB)预计算子问题最优解拼图类问题
Reeds-Shepp 曲线计算车辆最优路径长度混合 A*

3.3 高级启发

  • Landmark Heuristic(ALT):利用地标节点预计算最短路径,提高估计精度。
  • 机器学习启发:训练神经网络预测剩余代价(需保证可采纳性)。

总结

算法核心改进适用场景最优性保证
Dijkstra无启发,仅 g(n)通用最短路径是
A*引入 h(n) 引导搜索大规模地图、游戏 AI是(若 h(n) 可采纳)
Hybrid A*连续状态 + 运动学约束自动驾驶、机器人近似最优

关键结论:

  1. A* 比 Dijkstra 更高效,因启发式减少了搜索范围。
  2. ClosedList 在 A* 中更高效(若 h(n) 一致)。
  3. 启发函数决定 A* 的性能,需平衡估计精度与计算成本。
详解混合A*算法Hybrid A* 混合A算法(Hybrid A)是一种改进的路径规划算法,特别针对车辆动力学进行了优化。 阅读详情

相关推荐

Hybrid A* (混合A*)路径规划算法

HybridAStar算法主要是在A* 基础上考虑车辆动力学相关的搜索算法,其放弃了A* 中对搜索空间离散化,利用Dubins或者Reeps-Shepp来考虑自车能够前进的位置,使得规划的轨迹满足车辆的非完整性约束,但是该Hybrid A* 牺牲了算法的完备性和最优性。1.在连续空间上扩张节点搜索最短路径2.路径平滑Hybrid A* 算法与A* 算法的差异对比如下表所示如下图所示,最左侧图是A算法的结果,最右侧是Hybrid A算法。(中间为A* 算法变种)

qq_29320587的博客 5382

Hybrd A*(混合A*)算法

Hybrid A*算法是一种图搜索算法,改进于A*算法。与普通的A*算法区别在于,Hybrid A*规划的路径考虑了车辆的运动学约束,即满足了车辆的最大曲率约束。

u010241908的博客 2万+

SLUB DEBUG 检测slab 内存泄漏

文章介绍如何定位linux 内核中slab 内存泄漏。

一叶知秋的博客 1491

Hybrid A *算法原理及实现步骤

Hybrid A *算法原理及实现步骤

weixin_45868890的博客 7598

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

CTP高频Tick数据:五档期货Level2深度解析20241224

高频Tick五档期货Level2数据,作为一种先进的金融市场分析工具,以其一秒四次的高频更新,为投资者揭示了市场的微观结构。本文将深入探讨这一数据如何帮助投资者洞察市场动态,优化交易策略,实现投资收益的最大化。

level2Tick的博客 1218

【路径规划算法】基于A*,A-star启发搜索,Hybrid-A*,混合A*算法,Dijkstra迪杰斯特拉算法,GBFS贪婪最佳优先搜索算法,DFS深度优先搜索,BFS广度优先搜索算法路径规划

在路径规划算法中,A(A-star)启发搜索、Hybrid-A(混合A*)、Dijkstra迪杰斯特拉算法、GBFS(贪婪最佳优先搜索)、DFS(深度优先搜索)和BFS(广度优先搜索)是几种常用的算法。下面将分别介绍这些算法在路径规划中的应用和特点。

weixin_66436111的博客 1040

测试人必看!正交表与Allpairs工具对比:如何选择最适合你的组合测试方案?

本文深入对比了正交表、PICT与Allpairs三种主流组合测试方案,帮助测试人员根据项目场景做出最佳选择。文章分析了各自的核心原理、优劣势及适用场景,特别强调了在涉及复杂约束时PICT工具的强大功能,并提供了从原理学习到CI/CD集成的实战选型指南。

weixin_29224309的博客 270
上一篇: DQN在Gym的MountainCar环境的实现
下一篇: ROS中的里程计与IMU的消息类型解读
我要看无刺有刺
博客等级 码龄8年 292粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值