【问题标题】:Algorithm design: Track moving points in 3D space算法设计:跟踪3D空间中的移动点
【发布时间】:2018-05-03 15:00:32
【问题描述】:

这是一个与语言无关的问题,更多的是面向算法设计。

假设我们在 3D 空间中有两个点数组(每个看起来都像 [(1, 0, 2), (2, 4, 32), ...]

第一个数组表示点的第一个状态,第二个表示稍后的状态,其中点已经移动了少量(不一定每个都移动相同的距离)。 注意: 在第二个状态下,可能会删除一些点并添加一些新点。

问题: 给定这两个数组,如何将每个偏移点匹配(以合理的准确度)到其原始点,同时识别哪些点是新的并且不存在于第一个状态?


想法:我在想可以应用某种 k-means 聚类,但我不确定它会如何处理在州 - 所以我认为这种方法效果不佳。


编辑:

点不一定要添加到数组中的任何特定位置,并且不一定要为状态之间的持久点保持顺序。与独特点之间的距离相比,点在状态之间移动的距离应该相对较小——否则这个问题基本上是不可能的。

【问题讨论】:

  • 添加点时,是添加在数组的末尾还是分散在数组内部?对于未添加或删除的点,它们在两个数组中是否保持相同的相对顺序?点可能移动的距离与点之间的距离相比如何?
  • @TedHopp 查看编辑。
  • 那么最近邻搜索似乎是最简单的方法。如果你想走那条路,请参阅this thread。对于其他方法,请查看point set registration(又名点匹配)算法。
  • @FDavidov - 第二个数组没有进化。它是任何演化发生后的状态,两种状态之间的任何变化都满足“小运动”条件。您似乎在想象算法将被重复执行,因为第一个数组保持固定而第二个数组继续变化,但这是您注入问题的内容。在 OP 的问题中没有这样的东西。
  • @FDavidov - 你的“当然不是!!!”正是OP所要求的。问题正是在点集的小扰动后匹配对应的点。事实上,这是一个真正的问题,因为点可能已经消失,新的点可能已经出现(可能离现有的点相对较远),并且剩余的点可能不在两个数组中的相同索引处。 OP 要求一种算法来处理该特定情况。有效地解决这个问题并非易事,尤其是在涉及大量点的情况下。

标签: algorithm cluster-analysis


【解决方案1】:

将每个点与其最近的邻居匹配,除非距离超过阈值。

如果您有多个可能的匹配项,则需要设计一个好的解决策略。

将不匹配的点视为已删除或添加。

为了加快速度,在您的数据上放置一个八叉树或一个网格文件,这样您只需要测试相邻的网格单元,而不是比较每个点与其他每个点。

【讨论】:

    【解决方案2】:

    这基于一个假设:与第一组和第二组之间的独特点之间的距离相比,移位距离非常小(本质上是模糊测量)。

    首先,点集的一般结构不会受到平移、旋转或缩放的显着影响。这为您提供了很多选择。

    取每个维度(x、y、z 等)的最小值/最大值。平移和重新缩放两个点集。确切的比例无关紧要,但您可以使用它,使所有点都是正数,并且在每个维度上都在 0 到 100 之间。这使您可以更一致地比较这些点。虽然它可能不是严格需要并且可能会被跳过

    然后您应该在点集 A 和点集 B 之间创建一个双向映射(双向图),即 O(|A| + |B|) 其中 |A|和 |B|是集合的大小。 双向映射示例: a_to_b[(1.001,2.001)] = [(1.005,1.995)] b_to_a[(1.005,1.995)] = [(1.001,2.001)]

    如果a_to_bb_to_a 相互映射,那么这是同一个点,概率相对较高。

    如果不是,那么您可能会看到类似这样的内容: a_to_b[(1.001,2.007)] = [(1.005,1.995)] b_to_a[(1.005,1.995)] = [(1.500, 2.004)]

    a_to_b[(1.500, 2.004)] = [(1.495, 2.009)] b_to_a[(1.495, 2.009)] = [(1.500, 2.004)]

    由于不再存在 1-1 映射,这意味着已添加或删除某些内容。由于 a 中的值没有被映射回来,它很可能被删除了。在相反的情况下,它很可能被添加了。如果已添加,您将需要重新运行算法以尝试确定原始最近点是什么。

    这可以通过查看不同点并查看它是否是 1-1 映射的一部分来验证(并因此被考虑在内)。基本上,您要考虑所有 1-1 映射点(它们很可能是同一点),然后尝试将不完全匹配的点整理出来

    您可能希望获得两个点集的 Delaunay 三角剖分,以便更快地查找所有点的最近邻点,因为您知道哪些点在空间上与给定点相邻。如果我记得正确的话,Delaunay 图中的边数是 O(V),所以每个顶点的平均边数是 O(1)。一旦你找到了最近的点。但是,您可能需要对 delaunary 图进行一些调整以说明添加/删除的边。

    【讨论】:

      【解决方案3】:

      假设:

      1. 点可能会以随机的角度和长度移动,
      2. 点可能会随机消失,
      3. 可以在随机位置随机添加点,
      4. 点(在每个数组中)仅由它们的坐标定义,没有任何类型的 ID。

      如果以上所有内容都正确,则没有任何解决方案可以提供合理的可靠性水平。

      我可以添加许多示例来证实我的断言,但它看起来很直观,因此并不是真正需要的。

      编辑

      在与 Ted Hopp 讨论后,我提出了一种基于两个插入的关键假设的替代方法:

      1. 这些点只移动一次,
      2. 可以说任意两点之间的最小初始距离是已知的,我们称之为Lmin,而任何移动的最大距离是LMin,我们称之为Mmax

      有了这两个额外的假设,你可以想到一种机制如下(类似 JavaScript 的代码 - 未检查!):

      for (i = 0 ; i < Points.Count ; i++) {
          for (j = i + 1 ; j < Points.Count ; j++) {
      
              if ((ABS(Array1[i].x - Array2[j].x) > Mmax ) ||
                  (ABS(Array1[i].y - Array2[j].y) > Mmax ) ||
                  (ABS(Array1[i].z - Array2[j].z) > Mmax )    ) {
                 // Distance between two points is for sure equal or bigger than max.
                 continue ; // Meaning, go to check next point.
              }
      
              // The check of the distance is split into two stages
              // because, if the first if is true, the actual distance
              // calculation is not needed (and hence time is saved).
      
              if (Distance_Between_Points(Array1[i],Array2[j]) > Mmax) {
                 // Distance between two points is for sure bigger than max.
                 continue ; // Meaning, go to check next point.
              }
      
              // Points appear to be related!!!!!!
              ..........
          }
      }
      

      【讨论】:

      • 一些更正,点最有可能在 3D 空间的边界附近出现消失(尽管它们也可能从中间消失)。点可以以随机的长度和角度移动,但与唯一点之间的相对距离相比,它们的移动量总是很小。我知道这个任务在理论上是可能的(人们可以通过查看点的两个表示来直观地完成它 - 我只需要一个相当有效和准确的算法来做同样的事情)
      • 这一澄清并没有太大改变提出的结论。想象两个点慢慢地朝着彼此的方向移动。在某个步骤,两个点都消失了,并且在两个消失点的位置中间出现了一个新点。该算法将错误地将新点链接到(至少)两个原始点之一。同样,如上所述,只需选择一个介于 1 和 1000 之间的随机数,我将给您提供使算法不可靠的示例数量。唯一的可能是在规则中添加一些约束。
      • 还有一件事:在尝试在 3D 中找到解决方案之前,请先查看是否可以在单个维度中找到解决方案。如果规则相同,您仍然没有可靠的解决方案,除非,例如,点具有允许区分的某些 属性(例如 ID)。
      • 与其做出假设导致没有解决方案的结论,更有效的方法是引入允许解决方案的假设(问题约束)。
      • 您的“绝对“否””是针对 OP 没有询问的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多