news 2026/4/5 19:10:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最近在搞路径规划项目,发现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报错。不过咱们示例地图是通的,所以不用慌。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/5 7:16:57

首开告捷!招商林屿缦岛203套售罄,诠释改善市场的“产品主义”胜利

2月的西安楼市&#xff0c;因招商林屿缦岛而显得格外不同。这个位于凤城五路的改善项目&#xff0c;在首次开盘当日即实现203套房源全部去化&#xff0c;交出了一份令人瞩目的成绩单。在行业深度调整的背景下&#xff0c;这样的市场表现无疑具有风向标意义&#xff1a;它昭示着…

作者头像 李华
网站建设 2026/3/24 20:16:08

史上最强大语言模型的知识库-MaxKB部署实践

大家好&#xff0c;不知道大家还记得大名鼎鼎的jumpserver吗&#xff1f;市面上开源为数不多的堡垒机产品&#xff0c;由飞致云开发的&#xff0c;本次我要隆重介绍这款知识库大模型产品&#xff08;MaxKB&#xff09;也是飞致云开发的社区开源产品&#xff0c;可以免费建立50个…

作者头像 李华
网站建设 2026/4/2 20:24:30

微算法科技(NASDAQ :MLGO)优化提升量子图像传输算法的量子纠错效率技术介绍

量子计算凭借量子叠加与纠缠特性&#xff0c;在并行计算与信息处理领域展现出超越经典计算的潜力。然而&#xff0c;量子态的极端脆弱性使其极易受环境噪声干扰&#xff0c;导致量子图像传输过程中出现比特翻转、相位错误等失真问题。传统纠错方法因实时性不足、资源消耗过高&a…

作者头像 李华
网站建设 2026/4/3 12:45:46

状态机实现:switch vs 数组列表(状态表)效率深度对比

状态机实现&#xff1a;switch vs 数组列表&#xff08;状态表&#xff09;效率深度对比 根据知识库资料和工程实践&#xff0c;在满足特定条件下&#xff0c;数组列表&#xff08;状态表/表格驱动法&#xff09;的执行效率通常显著高于 switch-case&#xff0c;但需结合具体场…

作者头像 李华
网站建设 2026/3/31 19:03:52

claude skills,爆火了!

最近又有一个新的AI技术火起来&#xff0c;Claude发布的skills&#xff0c;到处在说skills怎么怎么强大&#xff0c;还有“过气网红”mcp&#xff0c;傻傻分不清。这两者之间有什么关系&#xff0c;又是如何和大模型打配合的呢&#xff1f;其实有个很好理解的类比&#xff0c;如…

作者头像 李华
网站建设 2026/3/30 22:57:34

拼多多复制商品发布,如何设置商品预售?

近期&#xff0c;有拼多多店主问我们&#xff1a;“我用多多高效发布软件上架商品&#xff0c;怎么把发货时间改成一个月&#xff1f;” 如上图&#xff0c;满足这位店主的需求&#xff0c;只需要把商品设置成预售就可以了。下面来一步一步说明一下&#xff1a; 第一步&#xf…

作者头像 李华