科普一下A*和Dijkstra算法

A*算法与Dijkstra算法科普及对比

1. Dijkstra算法(迪杰斯特拉算法)

核心思想

  • Dijkstra是一种广度优先搜索(BFS)的变种,用于在带权图中寻找单源最短路径(即从一个起点到所有其他节点的最短路径)。
  • 它采用贪心策略,每次选择当前距离起点最近的未访问节点进行扩展,逐步更新其他节点的最短距离。
    在这里插入图片描述

算法步骤

  1. 初始化:起点距离设为0,其他节点距离设为∞。
  2. 选择当前距离起点最近的未访问节点(称为“当前节点”)。
  3. 遍历当前节点的所有邻居,计算从起点经当前节点到邻居的距离,如果更优则更新。
  4. 标记当前节点为已访问,重复步骤2-3,直到所有节点都被访问或目标节点被找到。

特点
保证找到最短路径(适用于无负权边的图)。
计算量大,因为它会遍历所有可能的路径,直到找到目标。


2. A*算法(A-Star算法)

核心思想

  • A*是Dijkstra的优化版本,引入了**启发式函数(Heuristic)**来引导搜索方向,减少不必要的计算。
  • 它结合了实际代价(g(n))预估代价(h(n)),其中:
    • g(n) = 从起点到当前节点的实际距离(Dijkstra也使用这个)。
    • h(n) = 从当前节点到终点的预估距离(如欧式距离、曼哈顿距离等)。
  • 总代价 f(n) = g(n) + h(n),A*优先扩展f(n)最小的节点。
    在这里插入图片描述

算法步骤

  1. 初始化:起点加入开放列表(Open List),f(n) = g(n) + h(n)。
  2. 从开放列表中选择f(n)最小的节点作为当前节点。
  3. 如果当前节点是目标,返回路径;否则,计算其邻居的f(n)并更新。
  4. 重复步骤2-3,直到找到目标或开放列表为空。

特点
比Dijkstra更快,因为启发式函数减少了搜索范围。
保证找到最短路径(前提是h(n)是可采纳的,即h(n) ≤ 实际距离)。
依赖启发式函数,如果h(n)选择不当(如高估距离),可能无法找到最优解。


3. Dijkstra vs. A 关键区别*

特性Dijkstra算法A*算法
搜索策略广度优先,无方向性启发式引导,朝向目标搜索
计算量较大,遍历所有可能路径较小,优先扩展可能最优路径
是否保证最优解是(无负权边)是(h(n)可采纳时)
适用场景适用于无权图或权值均匀的图适用于有明确目标的路径规划(如游戏AI、机器人导航)
时间复杂度O(V²) 或 O(E + V log V)(优先队列优化)取决于h(n),通常比Dijkstra快

4. 实际应用场景

  • Dijkstra适用
    • 网络路由(如OSPF协议)。
    • 电力网络、交通规划(需要全局最短路径)。
  • A*适用
    • 游戏AI(如RTS游戏单位寻路)。
    • 机器人导航(如SLAM中的路径规划)。
    • 自动驾驶(结合高精度地图进行实时路径计算)。

5. 总结

  • Dijkstra:稳健但较慢,适合全局路径计算。
  • A*:更快,适合有明确目标的场景,但依赖好的启发式函数。
  • 选择建议
    • 如果目标明确(如机器人导航),优先用A*。
    • 如果需要计算所有可能的最短路径(如网络路由),用Dijkstra。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许于宝的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值