跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言AI算法

A*算法详解

A*算法是一种启发式搜索算法,通过评估函数 f(n)=g(n)+h(n) 平衡实际代价与启发式估计。它利用开放列表和关闭列表管理节点,优先扩展 f(n) 最小的节点,在保证找到最优路径的同时显著减少搜索范围。常用启发函数包括曼哈顿距离、欧几里得距离等,适用于游戏寻路、机器人导航及地图服务。

花里胡哨发布于 2026/3/30更新于 2026/7/2570 浏览
A*算法详解

A*算法(A-Star Algorithm)是一种启发式搜索算法,广泛应用于路径规划(如游戏寻路、机器人导航)、图遍历等领域。它通过结合实际代价与启发式估计代价,在保证找到最优路径的同时,显著减少搜索范围,效率远高于传统的 Dijkstra 算法或贪心搜索。

在这里插入图片描述

一、核心思想:评估函数 f(n)

A*算法的核心是定义一个评估函数,用于优先扩展'最有希望'到达目标的节点。该函数表示为: f(n) = g(n) + h(n)

  • g(n):从起点(Start)到当前节点 n 的实际代价(已消耗的代价)。例如,在网格地图中,若每一步移动代价为 1,则 g(n) 是起点到 n 的步数。
  • h(n):从当前节点 n 到目标节点(Goal)的估计代价(启发式预测)。它是算法的'智能'来源,需满足可采纳性(Admissible)——即不高估实际代价(否则可能错过最优解)。
  • f(n):节点 n 的总代价估计,指导搜索方向(优先扩展 f(n) 最小的节点)。

在这里插入图片描述

二、算法步骤

A*算法的执行流程可概括为以下步骤:

1. 初始化数据结构
  • 开放列表(Open List):优先队列(最小堆),存储待扩展的节点,按 f(n) 排序(f 最小的节点在顶部)。初始时仅包含起点。
  • 关闭列表(Closed List):集合或哈希表,存储已扩展过的节点(避免重复处理)。初始为空。
  • 代价记录:维护两个字典(或数组),分别记录每个节点的 g(n)(实际代价)和 f(n)(总代价)。
2. 主循环:扩展节点

重复以下步骤直到找到目标或开放列表为空(无路径):

  • 步骤 1:从开放列表中取出 f(n) 最小的节点 n(称为当前节点)。
  • 步骤 2:若 n 是目标节点,回溯路径并返回结果(算法结束)。
  • 步骤 3:将 n 加入关闭列表(标记为已处理)。
  • 步骤 4:遍历 n 的所有邻居节点 m(上下左右、对角线等,取决于移动规则):
    • 若 m 在关闭列表中:跳过(已处理过更优路径)。
    • 计算临时 g 值:temp_g = g(n) + 从 n 到 m 的移动代价(如相邻节点代价为 1,对角线为√2)。
    • 若 m 不在开放列表中,或 temp_g < g(m)(发现更优路径):
      • 更新 g(m) = temp_g。
      • 计算 h(m)(启发式估计值)。
      • 计算 f(m) = g(m) + h(m)。

若 m 不在开放列表中,将其加入开放列表;否则,更新其在开放列表中的优先级(因 f(m) 可能变小)。

在这里插入图片描述

3. 路径回溯

当目标节点被取出开放列表时,从目标节点反向回溯父节点(扩展时记录每个节点的父节点),直到回到起点,得到完整路径。

三、关键:启发函数 h(n) 的选择

h(n) 的选择直接影响算法效率和最优性。需满足可采纳性(不高估实际代价),常见类型如下:

1. 曼哈顿距离(Manhattan Distance)

适用于四方向移动(上下左右)的网格地图: h(n) = |x_n - x_goal| + |y_n - y_goal|

其中 (x_n, y_n) 是当前节点坐标,(x_goal, y_goal) 是目标坐标。

2. 欧几里得距离(Euclidean Distance)

适用于八方向移动(允许对角线)的场景: h(n) = √((x_n - x_goal)² + (y_n - y_goal)²)

3. 切比雪夫距离(Chebyshev Distance)

适用于八方向移动且允许斜向一步到位的情况(如国际象棋中的王): h(n) = max(|x_n - x_goal|, |y_n - y_goal|)

4. 其他变种

根据具体问题设计专用启发函数(如路径规划中的预计算代价图)。

四、特性分析

  • 最优性:若 h(n) 可采纳(不高估),A* 一定能找到最短路径(前提是所有边的代价非负)。
  • 完备性:若存在路径且图有限,A* 最终会找到路径;若不存在路径,开放列表会为空。
  • 效率:启发函数 h(n) 越接近实际代价(但不超过),开放列表扩展的节点越少,效率越高。例如,当 h(n) 等于实际代价(仅目标节点的 h=0),A* 退化为 Dijkstra 算法(全局搜索);当 h(n) 强启发(如目标明确时的直线距离),搜索范围大幅缩小。

在这里插入图片描述

五、应用场景

  • 游戏开发:NPC 角色寻路(如《魔兽世界》《英雄联盟》)。
  • 机器人导航:自动驾驶中的局部路径规划。
  • 地图服务:GPS 导航中的实时路径计算(结合实时交通数据调整代价)。

六、示例:网格地图寻路

假设一个 4x4 网格(起点 (0,0),终点 (3,3)),四方向移动,每步代价为 1。

  1. 初始化:开放列表包含起点 (0,0),g=0,h=|0-3|+|0-3|=6,f=6。
  2. 第一次扩展:取出 (0,0),扩展邻居 (0,1)、(1,0)。计算它们的 g=1,h 分别为 |0-3|+|1-3|=5(f=6)和 |1-3|+|0-3|=5(f=6),加入开放列表。
  3. 后续扩展:每次选择 f 最小的节点(初始阶段多个节点 f=6),逐步向终点逼近。最终当终点 (3,3) 被取出时,回溯路径为:(0,0)→(1,0)→(2,0)→(3,0)→(3,1)→(3,2)→(3,3)(或其他等价最短路径)。

总结

A*算法通过平衡实际代价与启发式估计,在路径规划中实现了'高效 + 最优'的双重优势。理解其核心评估函数、数据结构(开放/关闭列表)及启发函数的选择,是掌握该算法的关键。实际应用中,需根据场景调整启发函数,以在效率和最优性之间取得平衡。

在这里插入图片描述

直观理解:生活场景类比

要理解 A算法,可以用一个生活中找路的场景来打比方——就像你在陌生的小区里找朋友家,手里有一张地图(网格或道路图),需要最快找到目的地。A算法就是帮你'聪明选路'的小助手,它会一边算你已经走了多远(实际代价),一边猜剩下的路大概还要走多远(预估代价),最终带你走最快的那条路。

一、核心思路:用'总代价'决定先走哪条路

假设你现在在起点(比如小区门口),目标是朋友家(终点)。A*算法的关键是给每个'可能经过的点'(比如路上的每个路口、格子)算一个总代价分数,分数越低,说明这条路'越值得先走'。这个总分数由两部分组成:

  • g(n):你已经走了多远(实际代价)。比如从起点到当前点,你走了 300 米(或 3 步),g(n)=300。
  • h(n):你猜还要走多远(预估代价)。比如当前点离终点看起来还有 200 米(或 2 步),h(n)=200(但不能乱猜,得'靠谱')。

总分数 f(n) = g(n) + h(n),相当于'从起点到终点经过这里的总步数/总距离'。A*算法会优先走 f(n) 最小的点——就像你会优先选'已经走了 100 米 + 还剩 100 米 = 总共 200 米'的路,而不是'已经走了 200 米 + 还剩 300 米 = 总共 500 米'的路。

二、具体怎么操作?像'整理待选清单'一样找路

A*算法的过程可以想象成你拿着一张'待选清单'(开放列表)和一张'已检查清单'(关闭列表),一步步缩小范围:

1. 开始:把起点放进待选清单

一开始,你只知道起点,所以待选清单里只有起点,它的 g=0(还没走),h 是你猜的起点到终点的距离(比如直线距离),f=g+h。

2. 循环:每次从待选清单里挑'最划算'的点

每次从待选清单里找出 f(n) 最小的点(也就是'最值得走'的点),把它从待选清单移到已检查清单(表示你已经认真考虑过这个点了)。

3. 检查是否到终点

如果这个点刚好是终点,恭喜!你已经找到路了,接下来只需要'倒推'回去,就能得到完整路径(比如:终点←上一步←再上一步←…←起点)。

4. 扩展邻居:看看周围有哪些路可选

如果还没到终点,你需要看看当前点的'邻居'(比如上下左右四个方向的路口,或者对角线的路口,取决于你能怎么走)。对每个邻居:

  • 如果邻居已经在已检查清单(你之前已经仔细看过这个点,而且当时的路线更优),跳过它(不用再浪费时间)。
  • 如果邻居不在待选清单,或者你找到了一条去邻居的'更短实际路径'(比如之前算过去邻居要走 500 米,现在发现走另一条路只要 400 米),就更新它的 g(n)(实际走了多远),重新算 f(n)=g(n)+h(n),然后把它放进待选清单。
三、关键:'猜得靠谱'才能找得快

A*算法好不好用,关键看你怎么'猜'h(n)(剩下的路有多远)。这个'猜测'必须满足一个条件:不能高估实际距离(比如实际要走 200 米,你不能猜 300 米)。否则,算法可能会漏掉真正的最短路径。

举个例子:

  • 如果你在走直角的网格路(比如只能上下左右走,不能斜着走),最靠谱的 h(n) 是'曼哈顿距离'——横竖两边的步数加起来。比如当前点在 (2,3),终点在 (5,7),那么横向需要走 5-2=3 步,纵向需要走 7-3=4 步,h(n)=3+4=7(实际可能需要更多步,但绝不会更少)。
  • 如果你可以斜着走(比如八方向移动),h(n) 可以用'欧几里得距离'——直接算两点之间的直线距离(比如√[(5-2)²+(7-3)²]≈5),这比曼哈顿距离更接近实际步数。
四、为什么 A*比'笨办法'好?

传统方法比如 Dijkstra 算法,相当于'盲目'地从起点开始,把所有可能的路都展开,直到找到终点(像撒网捕鱼)。而 A*算法因为有 h(n) 的'聪明猜测',会优先展开那些'看起来离终点更近'的点(像瞄准目标撒网),所以找路更快,计算量更小。

总结:A*算法的本质

A*算法就像一个'聪明的导航员':

  • 它知道你已经走了多远(g(n)),也知道大概还要走多远(h(n)),从而选出'总代价最小'的路。
  • 它不会乱猜(h(n) 不吹牛),所以最终一定能找到最短路径(如果存在的话)。
  • 生活中,它能在游戏里帮角色快速找路、在导航软件里帮你避开拥堵(调整 h(n) 为实时路况),非常实用!

目录

  1. 一、核心思想:评估函数 f(n)
  2. 二、算法步骤
  3. 1. 初始化数据结构
  4. 2. 主循环:扩展节点
  5. 3. 路径回溯
  6. 三、关键:启发函数 h(n) 的选择
  7. 1. 曼哈顿距离(Manhattan Distance)
  8. 2. 欧几里得距离(Euclidean Distance)
  9. 3. 切比雪夫距离(Chebyshev Distance)
  10. 4. 其他变种
  11. 四、特性分析
  12. 五、应用场景
  13. 六、示例:网格地图寻路
  14. 总结
  15. 直观理解:生活场景类比
  16. 一、核心思路:用“总代价”决定先走哪条路
  17. 二、具体怎么操作?像“整理待选清单”一样找路
  18. 1. 开始:把起点放进待选清单
  19. 2. 循环:每次从待选清单里挑“最划算”的点
  20. 3. 检查是否到终点
  21. 4. 扩展邻居:看看周围有哪些路可选
  22. 三、关键:“猜得靠谱”才能找得快
  23. 四、为什么 A*比“笨办法”好?
  24. 总结:A*算法的本质
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Unity 5.2.0 引擎核心功能、图形渲染与性能优化指南
  • Ubuntu 20.04 系统下 QGroundControl 地面站安装指南
  • AWPortrait-Z LoRA 强度与推理步数协同调优指南
  • Docker 运行 hello-world 镜像失败或超时问题排查与解决
  • Ollama 架构详解与对话处理流程解析
  • 大模型检索增强生成(RAG)技术综述
  • 基于 Netty 的轻量斗地主服务器部署及 cpolar 内网穿透方案
  • Flutter 使用 web_scraper 在 HarmonyOS 上实现网页抓取与数据解析
  • Mac 彻底卸载软件与清理残留文件的完整指南
  • Linux 解压命令实战指南:从 tar 到 7z
  • PC 微信 4.1.5.16 UI 树隐藏问题:UIAutomation 修复与自动化实战
  • Cursor 实战:Web 版背单词应用开发全流程
  • 单 Agent 与多 Agent 架构对比及 AI 团队组建指南
  • MK SD NAND:无人机飞控日志存储方案
  • Linux 网络编程基础:套接字
  • Stable Diffusion 并行计算优化技巧与 GPU 性能提升指南
  • Python 在日常生活与职场中的核心应用及发展分析
  • Ubuntu 22.04 下 libwebkit2gtk-4.1-0 安装全记录:从踩坑到落地
  • Windows 本地部署闲鱼 AI 自动回复系统实战
  • Android WebView 版本升级方案详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online