【问题标题】:Compute distance between combinations of points in a grid计算网格中点组合之间的距离
【发布时间】:2017-12-15 15:14:42
【问题描述】:

我正在寻找以下问题的有效解决方案。这应该适用于 python,但不必在 in python

我有一个二维矩阵,矩阵的每个元素代表二维正交网格中的一个点。我想计算网格中几个点之间的最短距离。如果网格中没有“障碍”,这将是微不足道的。

图帮解释:

图中的每个单元格都是矩阵的一个元素(矩阵是正方形的,但也可以是矩形的)。 灰色单元格是障碍物,两点之间的任何路径都必须绕过它们。 绿色细胞是我感兴趣的。我对红色细胞不感兴趣,但可以通过它们。

像A和B这样的点之间的距离计算起来很简单,但是如何计算如图所示的A和C之间的路径呢?

我已经阅读了A* algorithm,但由于我正在使用一个相当大的网格,通常是(几百)x(几百),我想知道是否有更智能的替代方案。请记住:我必须找到所有“绿色细胞”之间的距离,而不仅仅是其中两个之间的距离。如果我有 n 个绿色单元格,我将有多个等于二项式系数 (n 2) 的组合。

网格是固定的,我必须计算一次所有距离,然后它们会在进一步的计算中使用它们,比如根据矩阵中的相关索引访问它们。

注意:问题不是this one,坐标在列表中。我的 2D 坐标组织在 2D 网格中,问题是如何利用这一方面来获得更有效的算法。

【问题讨论】:

  • 灰色和红色有什么区别?
  • 如果你需要计算 all 最短距离,那么你有(大致)要存储的绿色单元格距离数的平方;修复网格如何解决这个问题?
  • 灰色和红色:如前所述,灰色是障碍物,路径不能通过它们。红色只是“无趣”的点,实际上是缺少数据,无需获取与它们的距离。可能无关紧要,但我想我会提到它。
  • 关于“所有最短距离”:不,它不是绿色单元格(n)数量的平方,它是二项式系数(n 2),两个单元格的(无序)组合在所有的绿色中。与网格固定这一事实没有直接关系。
  • 您可以在this visualisation of search algorithms 中尝试您的数据的可能情况并决定哪一种可能获得最快的结果。

标签: python arrays matrix distance a-star


【解决方案1】:

我想最直接的解决方案是Floyd-Warshall 算法,它计算图中所有节点对之间的最短距离。这不一定利用您碰巧有一个 2D 网格的事实(它也可以在其他类型的图表上工作),但它应该可以正常工作。与必须为任何任意图编写实现相比,您确实拥有 2D 网格这一事实可能使您能够更有效地实现它(例如,您可以只存储在矩阵中计算的距离,而不是一些效率较低的数据结构)。

常规版本仅生成所有最短路径的距离作为输出,实际上并不将路径本身存储为输出。维基百科页面上有关于如何修改算法以使您能够在必要时有效地重建路径的附加信息。

直觉上,我怀疑更有效的实现可能会利用您拥有 2D 网格这一事实,可能使用来自Rectangular Symmetry Reduction 和/或Jump Point Search 的想法。这两个想法传统上都与 A* 一起用于单对寻路查询,但我不知道有任何工作将它们用于所有对最短路径计算。我的直觉说它们也可以在那里被利用,但是在需要准确地弄清楚并正确实施它的时候,你可能会更容易地实施和运行 Floyd-Warshall。

【讨论】:

  • 谢谢,非常有用的信息。
  • 而且,顺便说一下,我不需要路径,只需要距离,所以更重要的是。
  • 而且,作为参考,它甚至有一个 python (scipy) 实现:docs.scipy.org/doc/scipy/reference/generated/…
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 2013-05-21
  • 2017-11-24
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多