如何将Jump Point Search推广到3D搜索量?
到目前为止,我已经为3D立方体定义了修剪规则,涉及三个运动中的每一个 - 直线(0,0,1),一阶对角线(0,1,1)和二阶(1,1) ,1)。
我最关心的是paper中定义的最佳转折点。我一直无法确定它们是如何得出的,因此如何从三个方面推导出自己的。
有关如何做到这一点的任何建议?
答案 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
(下面的次优; [0,0,0]没用,所以我没有把它包括在内)
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 *启发式算法......
然后添加我们新的启发式方法!
编辑: 代码“并行”的定义