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

最近在搞路径规划项目,发现A*这玩意儿真是又好用又有趣。今天咱们用Matlab从头撸个带自定义地图的A*路径规划,保证代码比教程还清楚,直接开整

A*算法路径规划 A星Matlab路径规划 自定义栅格 可自行更改绘制栅格地图,自定义起始点目标点位置、未知障碍物位置 matlab实现 详细注释!

先来个灵魂草图:地图用栅格表示,0能走,1是墙,起点终点自己定。Matlab矩阵直接当地图简直不要太方便,先搞个10x10的示例地图:

% 初始化地图(可随便改尺寸) map = zeros(10,10); % 手动加墙(中间一堵墙) map(4:7,3) = 1; map(4,4:7) = 1;

接下来定义起点终点。这里我故意把起点终点放在墙的两侧,看算法能不能绕过去:

start_node = [2, 3]; % [行, 列] goal_node = [8, 7];

A*的核心是节点数据结构,咱们用Matlab的结构体搞定:

node.g = 0; % 从起点到当前节点的实际代价 node.h = 0; % 启发式估计值 node.f = 0; % g + h node.parent = []; % 路径回溯用 node.position = []; % 当前坐标

重点来了——启发函数。这里用曼哈顿距离(适合四方向移动),想用欧式距离的自己改:

function h = heuristic(pos, goal) % 曼哈顿距离 h = abs(pos(1)-goal(1)) + abs(pos(2)-goal(2)); % 欧式距离:norm(pos - goal) * 10 end

主循环才是重头戏。开放列表用优先队列(按f值排序),每次取最优节点展开:

open_list = struct2table(node); closed_list = []; while ~isempty(open_list) % 找f值最小的节点 [~, idx] = min(open_list.f); current_node = open_list(idx, :); % 到达终点就收工 if isequal(current_node.position, goal_node) path = reconstruct_path(current_node); break end % 把当前节点挪到关闭列表 open_list(idx, :) = []; closed_list = [closed_list; current_node]; % 遍历四个邻居方向 neighbors = [... -1, 0; % 上 1, 0; % 下 0, -1; % 左 0, 1]; % 右 for k = 1:size(neighbors,1) neighbor_pos = current_node.position + neighbors(k,:); % 跳过越界和障碍 if neighbor_pos(1)<1 || neighbor_pos(1)>size(map,1) || ... neighbor_pos(2)<1 || neighbor_pos(2)>size(map,2) || ... map(neighbor_pos(1), neighbor_pos(2)) == 1 continue end % 计算新g值(移动成本算10) tentative_g = current_node.g + 10; % 检查是否在关闭列表 in_closed = any(cellfun(@(x) isequal(x, neighbor_pos), closed_list.position)); % 新路径更优时才更新 if ~in_closed || tentative_g < existing_g new_node = struct(); new_node.position = neighbor_pos; new_node.parent = current_node.position; new_node.g = tentative_g; new_node.h = heuristic(neighbor_pos, goal_node); new_node.f = new_node.g + new_node.h; % 加入开放列表前查重 in_open = find(cellfun(@(x) isequal(x, neighbor_pos), open_list.position)); if isempty(in_open) open_list = [open_list; struct2table(new_node)]; elseif open_list.g(in_open(1)) > tentative_g open_list(in_open(1), :) = struct2table(new_node); end end end end

路径回溯函数像倒带一样往回找:

function path = reconstruct_node(node) path = []; while ~isempty(node.parent) path = [node.position; path]; % 在关闭列表里找父节点 parent_idx = find(cellfun(@(x) isequal(x, node.parent), closed_list.position)); node = closed_list(parent_idx, :); end path = [start_node; path]; % 补上起点 end

跑起来的效果:算法会先贴着墙边试探,发现走不通马上绕远路。障碍物设置成L型的话,路径会拐两个直角弯。要是把启发函数换成对角线距离,路径会更丝滑,不过要注意移动成本的计算方式得跟着改。

A*算法路径规划 A星Matlab路径规划 自定义栅格 可自行更改绘制栅格地图,自定义起始点目标点位置、未知障碍物位置 matlab实现 详细注释!

几个可以魔改的地方:

  1. 把地图改成20x20,加点随机障碍物(用randi生成)
  2. 在计算g值时加入地形权重(比如沼泽地g+20)
  3. 允许斜角移动(八方向搜索)

遇到坑爹情况怎么办?比如完全封闭的环境,代码会陷入死循环。解决方法是在while循环里加个计数器,超过最大步数直接break报错。不过咱们示例地图是通的,所以不用慌。

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

相关文章:

  • 天虹超市全面接入淘宝闪购:遍布全国23座城市的99家门店全量上线
  • 史上最强大语言模型的知识库-MaxKB部署实践
  • 深入解析:JVM 调优方案
  • 2026年ASA抗冲改性剂行业分析:核壳结构升级驱动耐候增韧材料国产化突围
  • 记一次开诚布公的交流!在 WG21 谈 C++ 标准化的实现现状与挑战
  • 转行做AI大模型的人:恐惧者、迟疑者与漫游者
  • 自动获客软件的优势和使用方法解析
  • 两大委员会1月工作会议召开:运营年度回顾、研发协同机制优化等事项同步
  • 2026年乙基大豆酸酯行业洞察:生物基溶剂驱动下的市场增长与应用拓展
  • 凤城五路见证:招商林屿缦岛首开203套售罄,市场热度彰显品质实力
  • 宕机智能诊断利器来了,助你告别 Linux 宕机分析“三座大山”
  • 神经网络时序预测融合宏观变量的ETF动态止盈环境设计与实现
  • AI工具泛滥时代,为什么“能力“越来越不值钱?
  • 首开告捷!招商林屿缦岛203套售罄,诠释改善市场的“产品主义”胜利
  • 本地部署 libretranslate
  • 状态机实现:switch vs 数组列表(状态表)效率深度对比
  • 市面上比较好喝的低度酒有哪些?
  • 从错误中学习
  • 不要手动操作!Ansible+cpolar 实现 NAS 设备远程自动化管理[特殊字符]
  • 基于Matlab的神经气体网络与GNG网络:一种高效的人工神经网络模型及其在无监督学习任务中的应用
  • GEO优化推广科普:深圳昊客网络如何帮企业抢占AI搜索流量高地? - 专业GEO营销推广
  • 潜水推流器优质供应商推荐:2026口碑榜,知名厂家+高适配性解决方案盘点 - 品牌推荐大师1
  • ClickHouse Exit Code 139 / SIGSEGV 排查手册与原理说明
  • 【收藏必备】RAG系统调优秘籍:3大方向+12个技巧全面提升检索准确率
  • 在现代多智能体系统中,编队控制是一个核心问题,尤其是在有向图的环境下。今天我们来聊聊如何通过自适应二分时变编队控制来实现多智能体的协同工作
  • DIN导轨安装式PC行业洞察:2026-2032年期间年复合增长率(CAGR)维持在8.6%
  • 告别“爆显存”:LoRA技术如何用1%的参数,解锁大模型微调自由?
  • 计算机大学生竞赛清单|护网 + CTF 从入门到参赛全攻略_网络安全防护工具竞赛
  • 创客匠人的协同哲学:AI智能体重塑知识服务的专业边界与伦理责任工程
  • 2026年潜水回流泵厂家排名:源头工厂+优质制造商+知名厂家全解析 - 品牌推荐大师1