JPS+(Jump point search plus)寻路算法
接上文 JPS(jump point search)寻路算法
JPS+ 是在 Jps 的基础上对地图进行了预处理,将数据记录在节点上
JPS 是运行时计算节点在某个方向上的跳点
JPS+ 预处理则是将 每个节点每个方向上的跳点、障碍信息记录,在运行时,不需要经过计算,直接获取某个方向上的跳点,节省大量时间和空间,提升计算速度
JPS+ 地图预处理
前提条件
1:地图必须是静态的,预处理时和运行时地图必须是一样的,不对在运行时添加、删除、修改节点状态
2:预处理需要每个节点存储一些数据,对内存占用较大
3:预处理需要时间较长,地图内每个节点都要进行数据处理,时间复杂度为 O(n*n),n 为节点个数
用 8 个数值,分别记录节点八个方向上:跳点、墙(障碍、边界)的距离
预处理
一:跳点、障碍预处理
初始节点 8 个方向上记录的值均为 0
第一步:对每个节点的八个方向进行跳点的可达性判断,并记录好跳点直线可达性
水平、垂直方向 距离 n 步 是跳点,则此方向记录 abs(n),如果没有跳点记录 0
斜向 距离 (n, n) 的节点是跳点,则此方向记录 abs(n),如果没有跳点记录 0
第二步:对节点的八个方向上,记录值还是 0 的方向上移动1步后碰到障碍(或边界)则记为0,
如果移动 n+1 步后会碰到障碍(或边界)的数据记为负数距离 -n
处理好的每个节点记录数据如下所示
2、3、0
-3、N、5
-4、0、3
8 个方向数据的解释
节点 N:左上方斜向, 两步 的距离有跳点
节点 N:上方垂直向上, 三步 的距离有跳点
节点 N:右上方斜向, 是障碍物或者地图边界
节点 N:左侧水平向左,三步 的距离是墙
节点 N:右侧水平向右,五步 的距离是跳点
节点 N:左下方斜向, 四步 的距离是墙
节点 N:下方垂直向下,是障碍物或者地图边界
节点 N:右下方斜向, 三步 的距离是跳点
二:Goal Bounding 预处理
目标边界(Goal Bounding)不是一种搜索算法,而是一种对搜索空间进行修减的方法,主要的原理是通过离线预处理搜索空间,实时运行搜索算法时,利用预先计算的数据来减少寻找目标所需要考虑的节点数量
Goal Bounding 也是需要节点存储 8 个方向的数据,每个数据 表示一个矩形区域如 Rect
Rect.min 是矩形区域的最小位置
Rect.max 是矩形区域的最大位置
关于 Goal Bounding 预处理的具体方法,可以查看相关论文、博客
做好了地图的预处理之后,我们就可以使用JPS+算法了。
大致思路与JPS算法相同,不过这次有了预处理的数据,我们可以更快的进行直线搜索和斜向搜索。
在某个搜索方向上有:
在获取某个方向上跳点数据前,需要通过 Goal Bounding 方法 WithinBoundingBox(n,dir, goal)判断节点此方向上是否包含目标节点,如果不包含则直接舍弃这个方向
1.对于正数距离 n(意味着距离跳点 n 格),我们可以直接将n步远的节点作为跳点添加进openlist
2.对于0距离(意味着一步都不可移动),我们无需在该方向搜索;
3.对于负数距离 -n(意味着距离边界或障碍 n 格),我们直接将n步远的节点进行一次跳点判断(有可能满足跳点的三个条件,不过得益于预处理的数据,这步也可以很快完成)。
理论知识如上
我上传的项目中
一:跳点、障碍预处理 部分已经添加了
二:Goal Bounding 预处理 部分还未添加
项目中 JPS+ 功能还不能正常使用