2026/2/16 7:17:06
网站建设
项目流程
鞍山专业做网站公司,企业网站空间多大合适,海阳做网站,最轻快的wordpress主題Matlab路径规划算法代码 传统A star算法源码详细注释 可固定地图和起点终点 适合初学者入门学习使用 保证运行#xff01;
直接上硬货#xff01;咱们先整个能跑的A*算法Matlab代码#xff0c;再掰开了揉碎了讲明白。先看效果#xff1a;固定10x10地图#xff0c;起点(1,…Matlab路径规划算法代码 传统A star算法源码详细注释 可固定地图和起点终点 适合初学者入门学习使用 保证运行直接上硬货咱们先整个能跑的A*算法Matlab代码再掰开了揉碎了讲明白。先看效果固定10x10地图起点(1,1)终点(10,10)绿色是路径红色是搜索过的节点够直观吧Matlab路径规划算法代码 传统A star算法源码详细注释 可固定地图和起点终点 适合初学者入门学习使用 保证运行!A*运行效果图 // 实际使用时需要替换真实图片链接先甩完整代码别慌后面有逐段解析% A*路径规划基础版 - 新手友好型 % 按F5直接运行建议搭配奶茶食用 %% 地图初始化 map [0 0 0 0 1 0 0 0 0 0; % 0可通行1障碍物 0 1 1 0 1 0 1 1 1 0; 0 1 0 0 1 0 0 0 1 0; 0 0 0 1 1 0 1 0 0 0; 0 1 0 1 0 0 1 0 1 0; 0 1 0 1 0 1 0 0 1 0; 0 0 0 0 0 1 1 0 1 0; 0 1 1 1 0 0 0 0 1 0; 0 0 0 0 0 1 1 0 1 0; 0 1 1 1 0 1 0 0 0 0]; start_node [1, 1]; % 起点坐标[y,x] goal_node [10, 10]; % 终点坐标 %% 核心参数设置 openList [start_node, 0, 0, 0]; % [y,x,g,h,f] closedList []; path_found false; % 八个方向移动成本当前只开四方向 move_cost [1 1; -1 1; 1 -1; -1 -1; 0 1; 1 0; 0 -1; -1 0];代码食用指南map矩阵可以随便改大小想加障碍物就把0改1move_cost控制移动方式注释掉后四行就是四方向移动起终点坐标别越界注意Matlab是先行后列主循环部分才是精髓%% A*主菜上桌 while ~isempty(openList) % 当前节点选取f值最小 [~, idx] min(openList(:,5)); current openList(idx,:); % 抵达终点判断 if isequal(current(1:2), goal_node) path_found true; break; end % 节点转移开放列表-关闭列表 openList(idx,:) []; closedList [closedList; current]; % 遍历邻居节点 for i 1:size(move_cost,1) neighbor current(1:2) move_cost(i,:); % 边界检查三连击 if neighbor(1)1 || neighbor(1)size(map,1) || ... neighbor(2)1 || neighbor(2)size(map,2) continue end % 障碍物和已关闭节点过滤 if map(neighbor(1), neighbor(2)) 1 || ... ismember(neighbor, closedList(:,1:2), rows) continue end % 计算代价值 g current(3) 1; % 当前移动成本为1 h abs(neighbor(1)-goal_node(1)) abs(neighbor(2)-goal_node(2)); f g h; % 开放列表更新逻辑 if ~ismember(neighbor, openList(:,1:2), rows) openList [openList; neighbor, g, h, f]; else existing_idx find(ismember(openList(:,1:2), neighbor, rows)); if g openList(existing_idx,3) openList(existing_idx,:) [neighbor, g, h, f]; end end end end重点敲黑板h abs(y差)abs(x差)这是曼哈顿距离想改启发函数就在这动手邻居节点遍历时用了move_cost里的偏移量想改八方向把注释打开开放列表用数组存储虽然效率一般但对新手友好进阶可以用优先队列路径回溯才是见证奇迹的时刻%% 炫酷可视化 if path_found % 路径回溯需要记录父节点代码略 disp(找到路径啦); imagesc(map); hold on; plot(start_node(2), start_node(1), go, MarkerSize,10); plot(goal_node(2), goal_node(1), mo, MarkerSize,10); % 绘制搜索过的节点 scatter(closedList(:,2), closedList(:,1), r.); % 绘制最终路径 plot(path(:,2), path(:,1), b-, LineWidth,2); else disp(大兄弟此路不通啊); end避坑指南地图坐标和矩阵索引容易搞反记住Matlab是行(y),列(x)想记录完整路径需要保存父节点可在节点数据结构里加个parent字段大规模地图可能会卡这时候就得用更高效的数据结构了最后甩个新手大礼包——修改地图的三种姿势% 姿势一手动改0/1 map(3,5) 1; % 第3行第5列变障碍 % 姿势二随机生成 map randi([0 1], 15,15); % 15x15随机地图 % 姿势三图片转地图装逼必备 img imread(迷宫图.jpg); gray_img rgb2gray(img); map imbinarize(gray_img); % 二值化转换跑不通来找我代码拿去随便改注释写得比代码长不是开玩笑的。下期考虑出个双向A*优化版想看的评论区敲1。