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。