Home Jps寻路算法
Post
Cancel

Jps寻路算法

Jps跳点搜索算法
  • Astar算法在搜索过程中需要把所有的邻居都检查一遍,并将其可走的节点加入到open_list中。
  • Jps算法搜索过程中只需要检查必要的邻居,将其满足条件的跳点加入到open_list中。
强迫邻居

节点 n 的8个邻居中有障碍,且 n  的父节点 p 经过n 到达 x 的距离代价比不经过 n 到达 x 的任意路径的距离代价小,则称 x 是 n 的强迫邻居。

  • force_neighbor.png
筛选邻居节点

只需要判定必要的邻居节点是否可走

  • 当前节点n为起点:除了上下左右节点,若当前节点往斜边节点的方向存在任意一个可走节点,则斜边节点也需要判定。
  • 当前节点n与其父节点p的方向向量为斜向:判定斜向分解的x轴和y轴的下个节点,若x轴或y轴的下个节点任意一个可走,则斜向节点也需要判定,若存在强迫邻居节点也需要判定。
  • dneighbor.png
  • 当前节点n与其父节点p的方向向量为x轴:判定x轴的下个节点是否可走,若存在强迫邻居节点也需要判定。
  • xneighbor.png
  • 当前节点n与其父节点p的方向向量为y轴:判定y轴的下个节点是否可走,若存在强迫邻居节点也需要判定。
  • yneighbor.png

##### 筛选跳点 从筛选过的邻居节点中再次筛选出跳点(必须为有效可走节点)加入到open_list中

  • 邻居节点j与当前节点n的方向向量是x轴或者y轴:沿着方向向量逐个节点搜索,直到返回。
    • 若满足以下两点则返回有效节点:
      • 节点j至少有一个强迫邻居节点x
      • 节点j为终点
    • 若节点j的下一个节点不可走,则返回无效节点
    • xjump.png
    • yjump.png
  • 邻居节点j与当前节点n的方向向量是斜向:将斜向向量拆解成x轴和y轴,沿着斜向向量逐个节点搜索,直到返回。
    • 若满足以下条件则返回有效节点:
      • 节点j为终点。
      • 节点j至少有一个强迫邻居x,则返回有效节点。
      • 若沿着x轴逐个搜索后返回有效节点,则返回有效节点;若沿着y轴逐个搜索后返回有效节点,则返回有效节点。
    • 若x轴或y轴的下一个节点都不可走,或者斜向的下一个节点不可走,则返回无效节点。
    • djump.png
算法步骤
  • find_path_init:初始化open_list,并将起点加入open_list中
  • find_path_step:
    • 取出open_list中f值最小的节点node,设置状态为close。
    • 筛选并遍历节点node的邻居节点,再次筛选有效跳点进入open_list的判定。
      • 若跳点状态为unknown,则计算跳点的g值和f值,并设置parent指针为node,将跳点加入到open_list中
      • 若跳点状态为open,根据node的g+d得到newg,当newg<跳点的g时,设置parent指针为node
    • 循环find_path_step的操作,直到open_list为空或者node等于终点。
  • find_path_finish:搜到终点后通过parent指针,便能从终点一步步回溯通过的路径点。
优化处理
  • 地图数据预处理:先对地图每个节点进行跳点判断,找出所有主要跳点
This post is licensed under CC BY 4.0 by the author.