使用A * JPS进行3D搜索

时间:2012-04-19 14:13:06

标签: c++ path-finding

如何将Jump Point Search推广到3D搜索量?

到目前为止,我已经为3D立方体定义了修剪规则,涉及三个运动中的每一个 - 直线(0,0,1),一阶对角线(0,1,1)和二阶(1,1) ,1)。

我最关心的是paper中定义的最佳转折点。我一直无法确定它们是如何得出的,因此如何从三个方面推导出自己的。

有关如何做到这一点的任何建议?

1 个答案:

答案 0 :(得分:4)

不是试图导出转折点,而是在2D中使用对算法的直观理解。

因为两个位置之间的最短距离是一条直线,我们知道对角移动是最快的,因为它相当于1D中的两个步骤。在3D中,这意味着对角线相当于三个步骤。 (实际上,这些值为sqrt(2)sqrt(3))。有了这个,我们选择通过移动尽可能多的轴来优化 ...转向沿2D轴移动比转向沿3D轴移动更糟糕。同样地,沿着1D(直线)移动甚至比2D移动更差这是跳跃点的核心假设

在剔除算法中,假设如果您在最佳轴(1D)上跳跃,那么没有最高匝数的高轴顺序(转向2D轴)直到存在平行墙在同一轴上。例如,查看figure 2(d),其中代码在1D中看到平行墙,并将2D移动添加回列表中。

作为启发式

向前评估,直到一个空间处于打开状态(墙壁距离为2个空格),然后将此点添加到跳转列表中。对于跳转列表中的任何一点,跳转到一个新的方向。目标> 2D向前移动> 1D向前移动> 1D向后移动> 2D向后移动。我们可以将这种启发式推广到任何n维......

评估下一个方向,+朝向目标,n是增加的维数量,给出了方程式...... + n D> + n-1 D> ...... + 1D> 0D> -1D> ...> - n-1 D> - 名词 d

3D

中最佳 - >最差转折点的顺序
  1. 3D + = [1,1,1]
  2. 2D + = [1,1,0],[1,0,1],[0,1,1]
  3. 1D + = [1,0,0],[0,1,0],[0,0,1],[-1,1,1],[1,-1,1],[1, 1,-1]
  4. (下面的次优; [0,0,0]没用,所以我没有把它包括在内)

    1. 0D = [1,-1,0],[1,0,-1],[ - 1,1,0],[-1,0,1],[0,-1,1], [0,1,-1]
    2. 1D- = [-1,0,0],[0,-1,0],[0,0,-1],[ - -1,-1,1],[1,-1, - 1],[ - 1,1,-1]
    3. 2D- = [-1,-1,0],[-1,0,-1],[0,-1,-1]
    4. 3D- = [ - -1,-1,-1]
    5. phew 打字这很痛苦,但它应该可以解决您的问题。

      请记住,当你'跳'时,要记录你跳的轴的顺序;您需要在同一轴中找到平行墙。因此,在[1,0,1]方向上移动时,您需要找到[1,1,0]和[0,1,1]处的墙,以便“解锁”方向上的跳跃点[ 1,1,1]。

      使用相同的逻辑,如果你移动1D [1,0,0],你检查[0,1,0]墙是否添加[0,1,1]和[1,1,0] 。你也检查[0,0,1]以便将[1,0,1]和[0,1,1]作为跳跃点添加。

      希望你明白我的意思,因为 很难想象和计算,但是一旦掌握数学知识就很容易掌握。

      结论

      使用A *启发式算法......

      • Dijkstra =距离开始的距离
      • 贪婪的第一个=距目标的距离

      然后添加我们新的启发式方法!

      • + n D> + n-1 D> ...... + 1D> -1D> ...> - n-1 D> - 名词 d
      • 如果任何一点 n D有一个平行障碍物,你可以为每个开放的 n + 1 D方向添加一个跳跃点。

      编辑: 代码“并行”的定义

      • 与您移动方向的顺序相同的任何点
      • 不是那个方向的下一个点
      • 与下一个点具有相同数量的正和负维度移动(例如,[1,1,-1]与[1,-1,1]和[-1,1,1]平行,但是到[1,0,0]