news 2026/4/23 4:14:55

matlab改进A*算法 JPS算法 jps算法 跳点搜索算法 路径规划 超详细注释 可自定义...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
matlab改进A*算法 JPS算法 jps算法 跳点搜索算法 路径规划 超详细注释 可自定义...

matlab改进A*算法 JPS算法 jps算法 跳点搜索算法 路径规划 超详细注释 可自定义地图/障碍物 路径颜色 可显示扩展范围 修改代价函数 图为JPS算法和A*算法的对比

路径规划领域有两个经典算法:A和它的魔改版JPS。咱们今天用Matlab整点好玩的,手把手教你怎么实现这两个算法,再对比它们的效率差异。先看效果:同一张地图下,JPS扩展的节点数量只有A的1/3,路径却同样最优,这货到底是怎么做到的?

先上A*算法核心代码片段:

function [path, openList] = AStar(grid, start, goal) % 初始化优先队列,格式:[f_cost, g_cost, x, y] openList = priorityQueue([0 0 start]); closedList = zeros(size(grid)); % 父节点记录矩阵(用于回溯路径) cameFrom = cell(size(grid)); while ~openList.isEmpty() current = openList.pop(); % 取出f值最小的节点 if isequal(current(3:4), goal) path = reconstructPath(cameFrom, goal); return; end % 获取8邻域坐标(允许对角移动) neighbors = getNeighbors(grid, current(3:4)); for i = 1:size(neighbors,1) next_node = neighbors(i,:); % 关键点1:路径代价计算(可修改处!) new_g = current(2) + movementCost(current(3:4), next_node); new_h = heuristic(next_node, goal); new_f = new_g + new_h; if ~closedList(next_node(2), next_node(1)) openList.push([new_f, new_g, next_node]); cameFrom{next_node(2), next_node(1)} = current(3:4); end end closedList(current(3), current(4)) = 1; end path = []; % 未找到路径 end

这里有个骚操作:把movementCost函数里的对角移动代价从默认的√2改成1.414,路径会更贴合理论值。想显示扩展范围?在push节点时记录坐标,最后用scatter画出来即可。

重点来了——JPS算法的跳跃式搜索。相比A*的广撒网,JPS通过识别"跳点"大幅减少计算量。看这段跳跃检测代码:

function jump_point = jump(x, y, dx, dy, grid, goal) % 沿着(dx, dy)方向跳跃检测 [nx, ny] = move(x, y, dx, dy); % 移动一格 if ~isFree(nx, ny, grid) % 撞墙了 return; elseif isEndNode(nx, ny, goal) % 到达终点 jump_point = [nx, ny]; return; end % 关键点2:检测强制邻居(墙角有障碍时) if hasForcedNeighbor(nx, ny, dx, dy, grid) jump_point = [nx, ny]; return; end % 继续递归跳跃 if (dx ~= 0 && dy ~= 0) % 对角线移动时 % 横向和纵向都要检测 if ~isempty(jump(nx, ny, dx, 0, grid, goal)) || ... ~isempty(jump(nx, ny, 0, dy, grid, goal)) jump_point = [nx, ny]; return; end end jump_point = jump(nx, ny, dx, dy, grid, goal); end

举个栗子,当机器人向右上方移动时,如果右侧突然出现障碍物,则当前点成为跳点。这种策略直接跳过无岔路的直线区域,相当于给搜索过程开了个快进。

想要修改路径颜色?在绘图代码里加一行set参数:

plot(path(:,1), path(:,2), 'LineWidth',2, 'Color',[0.9 0.2 0.5]); % 玫红色路径

自定义地图就更简单了,直接修改grid矩阵。1是障碍,0是可通行区域。比如创建一个中间带空心十字的地图:

grid = zeros(20); grid(8:12, 8:12) = 1; % 十字中心 grid([1:5,16:20], 10) = 1; % 纵向障碍 grid(10, [1:5,16:20]) = 1; % 横向障碍

最后放对比结果镇楼:在20x20地图中,A扩展了158个节点,JPS仅扩展了49个。但两者的路径长度都是28.28(对角移动)。JPS的节点扩展模式呈现明显的"跳跃"特征,而A的扩展区域则像涟漪般均匀扩散。需要完整代码的老铁可以在Github搜JPS-Matlab,记得star项目哦~

!算法对比图

(图片示意:左侧A*的扩展节点密密麻麻,右侧JPS的节点呈线条状分布)

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

数据驱动的软件质量守护:统计过程控制在测试度量中的实践指南

数据驱动的软件质量守护:统计过程控制在测试度量中的实践指南 从直觉判断到量化管理 在当代软件工程实践中,质量度量已从辅助性工作转变为质量保障体系的核心支柱。随着敏捷开发与DevOps模式的普及,测试团队面临着更高频次的发布周期与更复…

作者头像 李华
网站建设 2026/4/23 12:23:50

【资深架构师亲授】:Symfony 8缓存设计模式与最佳实践

第一章:Symfony 8 缓存机制概述Symfony 8 在性能优化方面持续发力,其缓存机制是提升应用响应速度的核心组件之一。通过统一的缓存抽象层,Symfony 允许开发者在不同环境和存储后端之间无缝切换,同时保持一致的 API 调用方式。缓存抽…

作者头像 李华
网站建设 2026/4/20 17:07:55

Mock/Stub技术在单元测试中的应用与实践

随着敏捷开发和DevOps的普及,单元测试已成为保证软件质量的核心环节。然而传统测试方法在面对依赖复杂、环境不稳定的系统时显得力不从心。Mock与Stub作为测试替身技术的两大核心手段,通过模拟外部依赖行为,使测试用例实现真正的隔离性与确定…

作者头像 李华
网站建设 2026/4/22 13:09:53

设计模式[9]——装饰器模式一分钟彻底说清楚

设计模式[9]——装饰器模式一分钟彻底说透 一句话定义 在不修改原有对象的前提下,运行时动态、透明地给对象层层添加额外行为,保持接口不变。 软件领域真实例子:网络数据流处理(超级常见!) 场景&#x…

作者头像 李华
网站建设 2026/4/23 12:10:14

从零开始部署物联网系统:手把手教你搭建可扩展的云边协同架构

第一章:物联网系统部署概述物联网系统部署是将感知设备、网络通信、数据处理与应用服务有机结合的过程,旨在实现物理世界与数字世界的高效连接。该过程不仅涉及硬件设备的安装与配置,还包括软件平台的搭建、数据流的管理以及安全机制的实施。…

作者头像 李华
网站建设 2026/4/23 10:43:59

11、计算机内存、I/O 操作与 8086 中断详解

计算机内存、I/O 操作与 8086 中断详解 一、计算机内存分配 在一些软件(如微软 Windows 95)中,软件可寻址高达 4GB 的物理内存,地址范围从 00000000h 到 FFFFFFFFh。下面是典型的 PC 内存分配表: 地址范围 设备 00000h–00FFFh 中断向量 00400h–0047Fh ROM BIOS …

作者头像 李华