当前位置: 首页 > news >正文

A*算法 - ukyo-

好的,我们系统地讲解一下 A*(A-Star)算法

1. 什么是 A* 算法?

A* 算法是一种启发式搜索算法,用于在图或网格中找到从起点到终点的最短路径。它结合了 Dijkstra 算法(保证找到最短路径)和贪婪最佳优先搜索(使用启发函数引导方向)的优点。

2. 核心思想

A* 算法通过评估函数 F(n) = G(n) + H(n) 来决定下一步探索哪个节点:

  • G(n):从起点到节点 n实际代价(已知)。
  • H(n):从节点 n 到终点的预估代价(启发函数)。
  • F(n):经过节点 n 到达终点的预估总代价

A* 总是优先探索 F(n) 最小的节点。

3. 算法流程

  1. 初始化
       - 将起点加入开放列表(Open List)
       - 设置起点的 G = 0,F = H(起点)。
       - 关闭列表(Closed List) 为空。

  2. 循环直到找到终点或 Open List 为空
       a. 从 Open List 中取出 F 值最小 的节点 current(通常用优先队列实现)。
       b. 将 current 移到 Closed List。
       c. 如果 current 是终点,则回溯路径,算法结束。
       d. 否则,遍历 current 的每个邻居节点
         - 如果邻居在 Closed List 中,则跳过。
         - 如果邻居不可通过(障碍物),则跳过。
         - 计算 临时 G 值 = G(current) + 从 current 到邻居的移动代价。
         - 如果邻居不在 Open List 中,或者临时 G 值比它原来的 G 值小:
           - 更新邻居的 G 值 = 临时 G 值。
           - 计算 H(邻居)(启发函数值)。
           - 计算 F = G + H。
           - 记录邻居的父节点为 current。
           - 如果邻居不在 Open List 中,则加入。

  3. 如果 Open List 为空仍未找到终点,则路径不存在。

4. 启发函数 H(n) 的选择

  • 必须可采纳(Admissible):H(n) 必须永远不大于从 n 到终点的实际代价(否则可能找不到最短路径)。
  • 常用启发函数(在网格地图中):
      - 曼哈顿距离:只允许上下左右移动时使用。H = |x1-x2| + |y1-y2|
      - 欧几里得距离:允许任意方向移动时使用。H = sqrt((x1-x2)² + (y1-y2)²)
      - 切比雪夫距离:允许八方向移动时使用。H = max(|x1-x2|, |y1-y2|)

5. 一个简单例子(网格地图)

假设一个 3x3 网格,起点 (0,0),终点 (2,2),只能上下左右移动,使用曼哈顿距离。

S . .
. . .
. . E
  1. 起点 (0,0):G=0, H=4, F=4
  2. 探索起点邻居,选择 F 最小的节点,逐步向终点移动。
  3. 最终找到路径。

6. 特点与要求

  • 完备性:如果有解,A* 能找到(只要图是有限的)。
  • 最优性:如果启发函数 H(n) 是可采纳的(不高估),并且对于任意节点 n 和其邻居 n',满足 H(n) ≤ cost(n, n') + H(n')(一致性),则 A* 找到的路径是最短的。
  • 效率:相比 Dijkstra,A* 用 H(n) 引导方向,搜索节点更少,速度更快。

7. 代码框架(Python 伪代码)

def a_star(start, goal, grid):
    open_set = PriorityQueue()
    open_set.put(start, 0)
    came_from = {}
    g_score = {start: 0}
    f_score = {start: heuristic(start, goal)}    while not open_set.empty():
        current = open_set.get()        if current == goal:
            return reconstruct_path(came_from, current)        for neighbor in get_neighbors(current, grid):
            tentative_g = g_score[current] + dist(current, neighbor)
            if tentative_g < g_score.get(neighbor, float('inf')):
                came_from[neighbor] = current
                g_score[neighbor] = tentative_g
                f_score[neighbor] = g_score[neighbor] + heuristic(neighbor, goal)
                if neighbor not in open_set:
                    open_set.put(neighbor, f_score[neighbor])    return None  # 无路径

8. 应用场景

  • 游戏 AI(角色寻路)
  • 机器人路径规划
  • 导航系统(GPS)
  • 网络路由

A* 是路径规划领域的经典算法,理解它对学习其他优化搜索算法(如 IDA, D)很有帮助。如果需要,我可以进一步解释启发函数设计或给出完整代码示例

http://www.jsqmd.com/news/181948/

相关文章:

  • 空间音频处理技术揭秘:沉浸式声音背后的科学与工程
  • 菲律宾海滩度假:游客收到每日天气语音提醒
  • 电商主播替代方案:用VoxCPM-1.5-TTS-WEB-UI生成商品介绍语音
  • 印度宝莱坞歌曲翻唱:AI模仿阿米尔·汗演唱电影插曲
  • 深入解析:49、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(一)
  • ZGC分代模式揭秘:如何实现亚毫秒级停顿与高效内存管理
  • DL 第一讲 PyTorch基础
  • 微PE官网同源技术社区推荐:AI语音新星VoxCPM-1.5-TTS-WEB-UI发布
  • GitHub镜像网站同步更新:VoxCPM-1.5-TTS-WEB-UI开源语音模型上线
  • Asyncio事件监听机制详解:5个关键点让你避开90%的陷阱
  • 超越BeyondCompare4永久激活密钥的价值?试试这颗开源语音明珠
  • 基于YOLOv8的道路坑洼识别检测系统(YOLOv8深度学习+YOLO数据集+UI界面+Python项目源码+模型)
  • 火星殖民地设想:第一批移民将携带语音数据库
  • Java虚拟线程时代来临(线程池配置终极指南)
  • 为什么VoxCPM-1.5-TTS-WEB-UI成为当前最受欢迎的TTS网页推理工具?
  • Spring Native AOT 编译太慢?:3个关键优化策略让你效率翻倍
  • 安徽黄山云海:松涛阵阵中隐约传来古人吟诗
  • 基于YOLOv8的汽车损坏识别检测系统(YOLOv8深度学习+YOLO数据集+UI界面+Python项目源码+模型)
  • 奥运会开幕式解说:AI同时提供数十种语言服务
  • 甘肃敦煌莫高窟:壁画修复师的工作语音日记
  • AI语音伦理边界:我们该不该禁止克隆逝者声音?
  • 手把手搞定FastAPI静态文件:安全、上传与访问
  • 题解:AT_abc257_e [ABC257E] Addition and Multiplication 2
  • 基于YOLOv8的蜜蜂识别检测系统(YOLOv8深度学习+YOLO数据集+UI界面+Python项目源码+模型)
  • 2025年4轴数控机床优选门店品牌,你知道哪些?4轴数控机床/水暖接头数控机床/无人机配件数控,4轴数控机床批发供应链 - 品牌推荐师
  • 印度尼西亚火山旅游:导游语音讲解地质奇观
  • 题解:AT_abc257_d [ABC257D] Jumping Takahashi 2
  • Python和C#x2B;#x2B;数据结构学习笔记
  • 乌克兰乡村婚礼:新娘父亲致辞感动全场
  • Python如何精准控制3D场景视角?这4个库你必须了解