使用 A* JPS 进行 3D 搜索
3D search using A* JPS
如何将跳点搜索推广到 3D 搜索卷?
到目前为止,我已经为涉及三个动作的 3D 立方体定义了修剪规则 - 直线 (0,0,1)、一阶对角线 (0,1,1) 和二阶 (1,1,1)。
我最关心的是论文中定义的最佳转折点。我一直无法确切地确定它们是如何推导的,因此也无法确定我自己的三维
。关于如何做到这一点的任何建议?
与其试图推导出转折点,不如在 2D 中使用对算法的直观理解。
因为两个位置之间的最短距离是一条直线,所以我们知道对角线移动是最快的,因为它相当于一维中的两个步长。在 3D 中,这意味着对角线相当于三个步骤。(实际上,这些值是sqrt(2)
和sqrt(3)
)。有了这个,我们选择通过尽可能多地移动轴来优化......转动以沿 2D 轴移动比转弯沿 3D 轴移动更糟糕。同样,沿 1D(直线)移动甚至比 2D 移动更糟糕。这是跳跃点做出的核心假设。
在剔除算法中,假设如果您在最不理想的轴 (1D) 上跳跃,那么在相同轴阶数上有平行壁之前,没有更高轴阶数(转到 2D 轴)的最佳转弯。例如,查看图 2(d),其中代码在 1D 中看到一个平行的墙,并将 2D 移动添加回列表中。
作为启发式
向前评估,直到一个空格保持打开状态(并且墙距离 2 个空格),并将此点添加到跳转列表中。对于跳转列表中的任意点,请向新方向跳转。目标> 2D 向前移动> 1D 向前移动> 1D 向后移动> 2D 向后移动。我们可以将这种启发式推广到任何 n 维......
评估下一个方向,+ 是朝着目标前进,n 是递增的维度数量,这给了我们等式......+n D> +n-1D> ... +1D> 0D> -1D> ...> -n-1 D> -n D
3D 中最佳>最差转折点的顺序
- 3D+ = [1, 1, 1] 2D+ = [1, 1, 0], [1, 0, 1],
- [0, 1, 1] 1D+ = [1, 0, 0], [0, 1, 0], [0, 0, 1], [-1, 1, 1], [1, -1, 1
- ], [1, 1, -1]
(次优如下;[0, 0, 0] 没用,所以我没有包括它)
- 0D = [1, -1, 0], [1, 0, -1], [-1, 1, 0], [-1, 0, 1], [0, -1, 1],
- [0, 1, -1] 1D- = [-1, 0, 0], [0, -1, 0], [0, 0, -1], [-1, -1, 1], [1, -1, -1]
- , [-1, 1, -1] 2D- = [-1, -1, 0], [-1, 0, -1],
- [0, -1, -1] 3D- = [-1, -1
- , -1]
打字很痛苦,但它应该可以解决你的问题。
请记住,当你"跳跃"时,跟踪你跳跃的轴顺序;你需要在同一轴上找到平行的墙。因此,向 [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>-n D
- 如果任何点 nD 有平行障碍物,您可以为每个打开的 n+1 D 方向添加一个跳跃点。
编辑:代码的"并行"定义
- 与移动方向顺序相同的任何点
- 不是那个方向的下一个点
- 具有与下一个点相同的正维和负维移动量(例如,[1 , 1, -1] 平行于 [1, -1, 1] 和 [-1, 1, 1],但与 [1, 0, 0] 平行
- 有根的二进制搜索树.保留与其父级的链接
- 无法将结构注册为增强几何体3D点
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- OpenGL大的3D纹理(>2GB)非常慢
- 正在尝试重载二进制搜索树分配运算符
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 向量上的线性搜索
- 如何在动态数组上使用搜索函数
- 是什么导致了Unity 3D中的"错误线程异常"?
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- cmake:添加要搜索头文件的目录
- 使用C++创建特殊的二叉搜索树
- 在C++的字符串中搜索和删除某些字符
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 在库中搜索基于 3D FFT 的卷积
- 如何在 C 或 C++ 中实现 3d kDTree 构建和搜索算法
- 使用 A* JPS 进行 3D 搜索