【问题标题】:Pathfind to edge / find hole algorithm?寻路到边缘/找洞算法?
【发布时间】:2023-01-31 03:30:07
【问题描述】:

我正在寻找一种可以搜索 3D 数组并找出从单个点到数组的任何边缘的最快路径查找的算法。更具体地说,我正在检查 3 维空间内的空心结构是否“气密”,以及该结构内的某些东西是否有可能通过孔逃逸。任何人都可以推荐我可以阅读的关于这些东西的好资源、文档或文章吗?我不是在寻找特定的复制/粘贴解决方案,因为我真的很想了解它是如何工作的,但我的搜索结果一直很枯燥。

我也很有可能从一个完全错误的角度来处理这个问题,实际上需要改变我寻找这方面信息的方式,如果您有任何建议,请告诉我!

此外,3D 数组的最大大小为 [256,256,256],但其中的结构通常要小得多。此外,阵列中的每个元素都像一个空房间,每边有 6 面可能的墙。

我已经尝试搜索了一段时间,但我的大部分发现都是关于“最短路径”或“最小阻力路径”的不是我需要的。我想要计算成本最低检查我是否可以从结构内部到达外部的方法,即使它不是最短路径。

【问题讨论】:

  • 当你说 3D 数组时,你是指 someint[i][j][k],还是只是一个 3D 向量 (x, y, z)?您如何定义结构的边和面?
  • @SimonGoater,我使用的是多维数组 [x,y,z] 而不是你建议的我认为是数组 [x][y][z] 的数组。数组的每个元素都将以空值开始,但用户可以添加一个块以在数组中构建“结构”。当用户放置一个块时,我想检查他们是否创建了一个“气密”的结构,以便我可以用空气填充内部元素。然而,有些块不是完美的立方体,因此每个块都有布尔值,表示每个面是否气密。
  • 我仍然不确定你的意思。听起来你有一个类似 minecraft 的 256 个方块面的宇宙,在其中可以安排方块来制作“结构”。你想知道一个结构是否包含一个没有连接到“外部”的空隙,这样你就可以用“空气”块填充它,而不会使填充物流到各处。这是对您要执行的操作的准确描述吗?
  • @SimonGoater 是的,这是一个很好的描述。我在想我需要递归地填充空间并在边缘被击中时取消操作我已经想到了一些我可以完全避免操作的情况,但我主要只是在这里检查看看是否任何人都有更快的解决方案的建议。编辑:256 块阵列用于建造太空船,有点像太空工程师,如果这能让你更好地了解这个
  • 我认为你必须尝试填充以查看它的去向是正确的。我的一个想法是使用结构块的最小和最大 x、y、z 值制作一个结构封装框,然后从该框的表面向内填充。这可以大大减少工作量。您需要从盒子表面的空块开始填充,当填充停止时,找到另一个并重复直到没有剩余,然后扫描内部是否有剩余的空隙,这些空隙必须是“密封的”。

标签: performance optimization multidimensional-array path-finding


【解决方案1】:

在这种情况下,我认为您无法真正超越广度优先或深度优先搜索的基本概念。终止我们搜索的基本情况事先是未知的。对于算法中的未知目的地,你真的不能太花哨,除非一次一步地线性搜索它。

潜在的优化

前几天我进一步考虑了这个问题,虽然这并没有提高算法的复杂性,但它应该比一次测试一个单元格的占用效率要高得多。

这个想法是存储和维护 3 组独立的 3D 占用位集(第二个转置的方式是下一位是沿 Y 的下一个元素,第三个是沿 Z 的元素)只需要一个位来指示占用的单元格。

通过这种方式,您无需在搜索中一次测试一个单元,您可以轻松地在 64 位架构上一次测试 64 个或更多单元(在 32 位架构上测试 32 个或更多单元,使用 SIMD 一次最多测试 512 个单元)。使用 256x256x256 网格,应该会非常快速地消耗数据。使用 256 位或更大的寄存器,您可以在单个 FFS(第一个第一个设置位)测试中沿着从给定点到最近占用单元格的轴测试网格的所有剩余单元格。

其余部分类似于您的普通 BFS/DFS。至少我还没有想出更好的解决方案。视觉说明:

诚然,这是一个非常粗略的想法,我是需要深入研究并对其进行编码和分析以开始解决我在绘图板上遗漏的事情并产生新的优化想法的人之一。但我认为这应该是一个很好的起点。

如果您每帧进行许多此类测试,您可能只想计算整个网格的整个距离图。

【讨论】:

  • 射击,我希望避免其中的一些,但我想我可能没有更好的选择。
  • @DavidMartin 如果您有非常具体(可能是奇特)的数据表示方式,您可以通过以更不寻常的方式进行搜索来进行优化。例如,如果您的墙都是正交的(即矩形区域),您可以只使用收缩类型的算法从墙向内收缩,直到找到该阶段/迭代的占用单元。那么欧几里德距离最近的那个(或曼哈顿或您喜欢的任何其他最小距离)最靠近一堵墙。
  • @DavidMartin 我认为这不可避免地需要启发式方法。我认为微优化确实是值得的!就时间而言,我已经设法击败了商业 3D 软件中的许多解决方案,有时甚至是几十个数量级,而没有做这种算法上花哨的事情。例如,如果您可以使用每个单元只需要一位的位集来表示网格的占用单元格,则可以一次测试 64 位以在 64 位架构上占用一个单元格,还可以使用 FFS/FFZ 来查找占用/空单元格很快。
  • @DavidMartin 我做了一个更新,至少粗略地了解了如何通过沿特定方向一次测试多个单元格来大量优化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多