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

A星算法(A*)从入门到精通:手把手教你实现路径规划代码

1. 什么是A星算法第一次听说A星算法时我也是一头雾水。直到把它想象成现实生活中的导航系统才恍然大悟。简单来说A星算法就像是一个聪明的向导能在复杂的地图中帮你找到从起点到终点的最佳路线。这个算法最早出现在1968年由斯坦福研究院的Peter Hart等人提出。它之所以如此受欢迎是因为它结合了两种经典算法的优点像Dijkstra算法那样保证找到最短路径又像贪心算法那样高效快速。我在实际项目中用过不下十次每次都能稳定输出最优解。A星算法的核心思想可以用三个关键词概括开列表、闭列表和启发式函数。开列表相当于候选名单记录待考察的节点闭列表则是已排除名单存放已经处理过的节点。而启发式函数就像是一个直觉判断帮助算法优先探索更有可能的路径。2. A星算法的工作原理2.1 三大核心要素让我们拆解A星算法的三个关键参数G值从起点到当前节点的实际移动成本。比如在网格地图中每移动一格G值就增加1。H值启发式函数当前节点到终点的预估成本。常用曼哈顿距离只考虑水平和垂直移动或欧几里得距离。F值G值与H值的总和FGH。这个值决定了节点的优先级F值越小优先级越高。我做过一个对比测试使用曼哈顿距离作为H值时算法在网格地图中的效率比欧几里得距离高出约15%。这是因为网格环境更适合离散距离计算。2.2 算法执行流程A星算法的执行过程就像是在玩一个策略游戏初始化阶段把起点放入开列表主循环开始从开列表找出F值最小的节点作为当前节点把它移到闭列表检查所有相邻节点对于每个相邻节点如果是终点恭喜找到路径如果不可通行或已在闭列表跳过计算G、H、F值如果节点不在开列表添加进去如果在开列表但新路径更好更新它的信息重复直到找到终点或开列表为空我在实现时踩过一个坑忘记及时更新已存在节点的父指针导致最终路径不是最优解。后来通过添加调试日志才发现这个问题。3. 手把手代码实现3.1 基础数据结构我们先定义几个核心类class Point: def __init__(self, x, y): self.x x # 行坐标 self.y y # 列坐标 self.father None # 父节点 self.G 0 # 起点到当前节点的实际成本 self.H 0 # 当前节点到终点的预估成本 self.F 0 # 总成本(FGH) def __lt__(self, other): return self.F other.F # 用于优先队列比较这个Point类封装了算法需要的所有节点信息。我特意重载了__lt__方法方便后面使用优先队列优化性能。3.2 地图表示地图可以用二维数组表示这里我扩展了原始代码的功能class GameMap: def __init__(self, map_data): self.map np.array(map_data) self.height, self.width self.map.shape def is_valid(self, point): 检查点是否在地图范围内且可通行 return (0 point.x self.height and 0 point.y self.width and self.map[point.x, point.y] ! 0)在实际项目中我还会添加地形代价功能比如沼泽移动成本更高。但为了简化这里只区分可通行(1)和障碍(0)。3.3 核心算法实现完整的A星算法类如下class AStar: def __init__(self, game_map): self.map game_map self.open_list [] self.close_list set() # 使用集合提高查找效率 self.path [] def heuristic(self, point, end): 曼哈顿距离启发式函数 return abs(point.x - end.x) abs(point.y - end.y) def get_neighbors(self, point): 获取相邻节点8方向 directions [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] neighbors [] for dx, dy in directions: new_point Point(point.x dx, point.y dy) if self.map.is_valid(new_point): neighbors.append(new_point) return neighbors def find_path(self, start, end): heapq.heappush(self.open_list, start) while self.open_list: current heapq.heappop(self.open_list) self.close_list.add((current.x, current.y)) if current.x end.x and current.y end.y: self._reconstruct_path(current) return True for neighbor in self.get_neighbors(current): if (neighbor.x, neighbor.y) in self.close_list: continue # 计算新G值对角线移动成本更高 move_cost 1 if (neighbor.x current.x or neighbor.y current.y) else 1.414 new_g current.G move_cost if neighbor not in self.open_list or new_g neighbor.G: neighbor.G new_g neighbor.H self.heuristic(neighbor, end) neighbor.F neighbor.G neighbor.H neighbor.father current if neighbor not in self.open_list: heapq.heappush(self.open_list, neighbor) return False # 没有找到路径 def _reconstruct_path(self, end_point): 回溯构建路径 current end_point while current: self.path.append((current.x, current.y)) current current.father self.path.reverse()这个实现有几个优化点使用优先队列堆管理开列表提高节点选取效率闭列表改用集合加快查找速度区分直线移动和对角线移动的成本添加路径回溯功能4. 实战应用与优化技巧4.1 性能优化方案在大地图上使用A星算法时可能会遇到性能问题。根据我的经验这些优化方法很有效启发式函数调优对于允许对角线移动的地图使用对角距离启发式def heuristic(self, a, b): dx abs(a.x - b.x) dy abs(a.y - b.y) return 1 * (dx dy) (1.414 - 2 * 1) * min(dx, dy)数据结构优化使用二叉堆或斐波那契堆管理开列表用位图代替集合存储闭列表分层路径规划先在大粒度网格上规划粗略路径再在小范围内进行精细调整4.2 常见问题排查在实现过程中我遇到过这些典型问题路径不是最短检查启发式函数是否满足可接受性永远不高估实际成本确认移动成本计算是否正确确保及时更新开列表中已有节点的信息算法运行缓慢尝试使用更高效的启发式函数检查闭列表的实现方式使用哈希集合而非列表考虑使用跳点搜索(JPS)等优化算法找不到可行路径确认起点和终点都是可通行的检查地图数据是否正确加载添加超时机制避免无限循环4.3 可视化调试技巧我习惯用matplotlib实现简单的可视化这对调试非常有帮助def visualize(map_data, pathNone): cmap plt.cm.colors.ListedColormap([black, white, red, green]) norm plt.cm.colors.BoundaryNorm([-0.5, 0.5, 1.5, 2.5, 3.5], cmap.N) display_map np.array(map_data) if path: for x, y in path: display_map[x][y] 2 display_map[path[0][0]][path[0][1]] 3 # 起点 display_map[path[-1][0]][path[-1][1]] 3 # 终点 plt.imshow(display_map, cmapcmap, normnorm) plt.colorbar() plt.show()这个可视化工具可以清晰显示黑色障碍物白色可行区域红色路径绿色起点和终点5. 进阶应用场景A星算法不仅适用于简单的网格路径规划经过适当调整可以应用于更多复杂场景游戏AI开发NPC寻路系统战略游戏中的单位移动我参与过的一个RTS项目中使用分层A星算法处理数百个单位的协同移动机器人导航结合SLAM技术实现动态避障加入地形代价因素如坡度、路面类型支持动态重新规划路径交通规划系统考虑实时交通状况多目标优化最短时间 vs 最少收费我曾经开发过一个物流调度系统将A星算法与时间窗约束相结合三维空间规划无人机航路规划建筑内部多层导航需要扩展启发式函数计算三维距离实现这些高级应用时关键是要根据具体需求调整代价函数和启发式函数。比如在无人机导航中我会加入高度变化惩罚项在实时战略游戏中则需要考虑敌方单位的动态威胁。

相关文章:

A星算法(A*)从入门到精通:手把手教你实现路径规划代码

1. 什么是A星算法? 第一次听说A星算法时,我也是一头雾水。直到把它想象成现实生活中的导航系统,才恍然大悟。简单来说,A星算法就像是一个聪明的向导,能在复杂的地图中帮你找到从起点到终点的最佳路线。 这个算法最早出…...

FlowState Lab大模型部署实战:基于Python的快速环境搭建与模型调用

FlowState Lab大模型部署实战:基于Python的快速环境搭建与模型调用 1. 开篇:为什么选择FlowState Lab? 如果你正在寻找一个既强大又容易上手的大模型开发环境,FlowState Lab绝对值得一试。作为一个专为AI开发者设计的开源框架&a…...

IDEA插件开发避坑指南:从环境搭建到第一个Hello World插件

IDEA插件开发实战:从零构建Hello World插件的完整避坑手册 作为JetBrains生态中最强大的扩展方式,IDEA插件开发能让开发者深度定制IDE功能。但新手在搭建环境和实现第一个插件时,往往会遇到各种"坑"。本文将用实战方式带你避开这些…...

戴森吸尘器电池复活完整指南:开源固件解锁隐藏功能

戴森吸尘器电池复活完整指南:开源固件解锁隐藏功能 【免费下载链接】FU-Dyson-BMS (Unofficial) Firmware Upgrade for Dyson V6/V7 Vacuum Battery Management System 项目地址: https://gitcode.com/gh_mirrors/fu/FU-Dyson-BMS 还在为戴森吸尘器突然罢工而…...

换个角度看魏忠贤:被权力异化的制度标本

换个角度看魏忠贤:被权力异化的制度标本说起魏忠贤,你的脑子里是不是立刻蹦出这几个词:奸臣、宦官误国、阉党祸国?教科书和电视剧早就把这个人钉在了历史的耻辱柱上。但今天咱们不唱这出老戏,换几个角度重新打量这位&q…...

Mac上无管理员权限?3步搞定NVM安装与Node版本切换(附国内镜像加速)

Mac无管理员权限下的NVM安装与Node版本管理实战指南 1. 权限受限环境下的开发困境与解决方案 作为一名Mac开发者,你是否遇到过这样的场景:公司配发的电脑没有管理员权限,但项目需要切换不同Node.js版本。传统方案如n工具需要sudo权限&#xf…...

警惕!锐捷交换机SNMP团体字加密后的安全隐患与应急方案

锐捷交换机SNMP安全运维实战:加密团体字的破解与风险防控 在金融行业的网络运维中,我们曾遇到过这样一个棘手场景:某分行核心交换机突然出现流量异常告警,但部署的Zabbix监控系统却因SNMP团体字加密而无法获取详细数据。运维团队不…...

3大维度重构数据库操作:Trae Agent如何让开发者效率提升300%

3大维度重构数据库操作:Trae Agent如何让开发者效率提升300% 【免费下载链接】trae-agent Trae 代理是一个基于大型语言模型(LLM)的通用软件开发任务代理。它提供了一个强大的命令行界面(CLI),能够理解自然…...

d2s-editor深度剖析:二进制存档解析的创新方法与实践指南

d2s-editor深度剖析:二进制存档解析的创新方法与实践指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 一、核心价值:从字节到角色的魔法转换 d2s-editor作为一款专业的暗黑破坏神2(Diablo…...

OFA-COCO蒸馏版实战教程:使用Gradio封装为可共享的在线Demo服务

OFA-COCO蒸馏版实战教程:使用Gradio封装为可共享的在线Demo服务 1. 引言 你有没有遇到过这样的场景?手头有一堆图片,需要快速为它们配上文字描述,无论是用于内容管理、辅助创作,还是为视障人士提供信息。一张张手动编…...

数据可视化驱动决策:Apache ECharts的商业价值与技术实践

数据可视化驱动决策:Apache ECharts的商业价值与技术实践 【免费下载链接】echarts Apache ECharts is a powerful, interactive charting and data visualization library for browser 项目地址: https://gitcode.com/gh_mirrors/echarts16/echarts 问题引入…...

Alpaca vs Vicuna:哪个更适合你的本地AI需求?13B模型对比评测

Alpaca vs Vicuna:13B模型本地部署深度评测与实战指南 1. 模型背景与技术架构 在开源大语言模型生态中,Alpaca和Vicuna都是基于Meta的LLaMA架构微调而来的知名模型。两者虽然同源,但在训练数据和优化目标上存在显著差异: Alpaca 1…...

通过adb修改pq_default.ini优化S905X3电视盒硬解画质,告别油画效果

1. 为什么S905X3电视盒硬解画质像油画? 最近一年我一直在用S905X3芯片的电视盒,性能确实比之前的RK3328强不少,但有个问题让我特别头疼——硬解视频时画面总像蒙了一层油,细节全被磨平,人脸像打了十层美颜,…...

Navicat重置工具:Mac用户告别试用期限制的完整解决方案

Navicat重置工具:Mac用户告别试用期限制的完整解决方案 【免费下载链接】navicat_reset_mac navicat16 mac版无限重置试用期脚本 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navicat试用期结束而烦恼吗?每次14天试用到…...

Phi-3-mini-4k-instruct实战体验:Ollama部署,写代码、解难题、聊天的全能助手

Phi-3-mini-4k-instruct实战体验:Ollama部署,写代码、解难题、聊天的全能助手 1. 为什么选择Phi-3-mini-4k-instruct? 在众多轻量级大模型中,Phi-3-mini-4k-instruct以其38亿参数的紧凑体积和出色的推理能力脱颖而出。这个模型特…...

古巴国家电网发生全面崩溃

古巴国家电网于2026年3月16日(周一)发生全面崩溃,导致全国约1000万人口陷入断电状态。这是该国近期一系列大规模停电事件中的最新一起。 古巴电力联盟(Unin Elctrica,简称UNE)在社交媒体上发布声明&#xf…...

[GAMES101]正交矩阵的奥秘:为什么旋转矩阵的逆等于其转置

1. 旋转矩阵的数学本质 第一次接触旋转矩阵时,你可能会有这样的疑惑:为什么一个简单的坐标变换要搞得这么复杂?其实旋转矩阵背后藏着非常优雅的数学结构。想象你手里拿着一个魔方,每次转动魔方时,所有小方块的位置都在…...

多AI协同,DooTask构建项目管理智能体新范式

1. 多AI协同:项目管理的新革命 想象一下,你正在管理一个跨国的软件开发项目,团队成员分布在不同的时区,需求文档需要翻译成多种语言,进度跟踪需要实时更新,风险预警需要提前预判。传统的方式可能需要雇佣翻…...

矩阵范数不为人知的3个应用场景:从误差分析到神经网络稳定性

矩阵范数不为人知的3个应用场景:从误差分析到神经网络稳定性 在机器学习与深度学习的实践中,矩阵范数远不止是数学教材中的抽象概念。当AI工程师需要诊断模型收敛问题、优化数值计算精度或设计更稳定的神经网络架构时,矩阵范数提供了关键的量…...

Kimi-VL-A3B-Thinking实际作品:建筑图纸尺寸标注识别与材料清单生成

Kimi-VL-A3B-Thinking实际作品:建筑图纸尺寸标注识别与材料清单生成 1. 引言 想象一下,你是一位建筑设计师或者项目经理,手头有一叠厚厚的CAD图纸。你需要从这些复杂的线条和标注中,手动提取出每一面墙的长度、每一个窗户的尺寸…...

C++游戏毕设从零起步:新手避坑指南与最小可运行架构实践

最近在帮学弟学妹看游戏毕设代码,发现一个普遍现象:功能实现了,但代码像一团乱麻,全局变量满天飞,逻辑和渲染搅在一起,加个新功能就得把整个项目翻个底朝天。这让我想起自己当年踩过的坑,所以决…...

ojdbc6-1.0.0.jar xmlworker-1.0.0.jar

D:\localRepository\com\domeke\ojdbc6\1.0.0 D:\localRepository\com\domeke\itextpdf\xmlworker\1.0.0 识别不到,那么,我们把这些jar包复制出来,例如放到桌面上 C:\Users\Administrator\Desktop 通过maven命令,上传到maven本地…...

MATLAB实战:手把手教你实现MSK正交调制解调(附完整代码与误码率分析)

MATLAB实战:从零构建MSK通信系统的完整指南 在数字通信领域,最小频移键控(MSK)因其频谱效率和恒定包络特性,成为卫星通信和移动通信系统中的重要调制技术。本文将带领通信工程学习者和MATLAB初学者,从理论推导到代码实现&#xff…...

基于改进粒子群算法的混合储能系统容量优化:全生命周期费用最低、负荷缺电率最小的实现

《基于改进粒子群算法的混合储能系统容量优化》完全复现 matlab。 以全生命周期费用最低为目标函数,负荷缺电率作为风光互补发电系统的运行指标,得到蓄电池储能和超级电容个数,缺电率和系统最小费用。 粒子群算法:权重改进、对称加…...

Qwen-Image-2512实际应用:跨境电商多语言商品图本地化适配生成

Qwen-Image-2512实际应用:跨境电商多语言商品图本地化适配生成 重要提示:本文所有图片生成示例均基于实际测试效果描述,由于AI生成的随机性,您的实际结果可能略有不同,但整体质量保持一致。 1. 项目背景与价值 跨境电…...

云容笔谈·东方红颜影像生成系统:从PS软件下载到AI辅助创作,工作流的进化

云容笔谈东方红颜影像生成系统:从PS软件下载到AI辅助创作,工作流的进化 还记得以前做设计,第一步总是先打开浏览器,搜索“PS软件下载”,然后花上半天时间安装、配置,再面对一张白布开始从零构思。那种感觉…...

YOLOv11模型调参指南:如何让交通灯检测准确率提升15%(附训练曲线分析)

YOLOv11模型调参实战:从损失函数曲线解读到交通灯检测性能跃迁 在计算机视觉领域,目标检测模型的性能优化往往像一场精密的实验科学——每一个参数调整都可能引发模型表现的蝴蝶效应。当我们聚焦于交通信号灯检测这一特定场景时,YOLOv11展现出…...

【数据结构与算法】 二叉树做题

洛谷P8681完全二叉树按层求权值和最大深度问题完全二叉树就像:电影院座位:第一排坐满,第二排坐满,第三排从左到右连续坐人,不留空位书本排版:每一行都排满文字,最后一行可能不满,但文…...

ESP8266数传模块实战:5分钟搞定PX4飞控的WIFI连接(附固件下载)

ESP8266数传模块实战:5分钟搞定PX4飞控的WIFI连接(附固件下载) 在无人机开发领域,快速搭建可靠的通信链路是每个开发者必须掌握的技能。ESP8266作为一款高性价比的WIFI模块,与PX4飞控的结合为开发者提供了轻量级的数传…...

金仓数据库在MySQL迁移中的技术观察:三层兼容机制与平滑替换路径复盘

金仓数据库在MySQL迁移中的技术观察:三层兼容机制与平滑替换路径复盘 在信息技术应用创新持续深化的背景下,业务系统建设单位普遍关注一个核心问题:“更换数据库,需要修改多少代码?是否影响业务连续性?系统…...