Python 计算网格中点组合之间的距离

Python 计算网格中点组合之间的距离,python,arrays,matrix,distance,a-star,Python,Arrays,Matrix,Distance,A Star,我正在寻找以下问题的有效解决方案。这应该适用于python,但不必在python中 我有一个二维矩阵,矩阵的每个元素代表二维正交网格中的一个点。我想计算网格中成对点之间的最短距离。如果网格中没有“障碍”,这将是微不足道的 图有助于解释: 图中的每个单元格都是矩阵的一个元素(矩阵是正方形,但也可以是矩形)灰色单元格是障碍物,两点之间的任何路径都必须绕过它们。绿色单元格是我感兴趣的。我对红细胞不感兴趣,但有一条路可以穿过它们 像A和B这样的点之间的距离很容易计算,但是如何计算A和C之间的路径,如图所

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

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

图有助于解释:

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

像A和B这样的点之间的距离很容易计算,但是如何计算A和C之间的路径,如图所示

我读过关于的文章,但由于我使用的是一个相当大的网格,通常是(几百)x(几百),我想知道是否有更聪明的替代方案。记住:我必须找到所有“绿色细胞”对之间的距离,而不仅仅是两个。如果我有n个绿色单元格,我将有许多组合等于二项式系数(n2)

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


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

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

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


直观地说,我怀疑可能会有更高效的实现,它们利用了您拥有2D网格这一事实,可能使用了来自和/或的想法。这两种思想传统上都与A*一起用于单对寻路查询,但我不知道有任何工作将它们用于所有对最短路径计算。我的直觉告诉我,它们也可以在那里被利用,但在准确地找出并正确地实施它所需要的时间里,你可能会更容易地实施和运行Floyd Warshall。

灰色和红色之间的区别是什么?如果你需要计算所有最短距离,那么你(大致)就有了要存储的绿色单元格距离的平方;固定的网格有什么帮助?灰色和红色:如前所述,灰色是障碍物,路径无法通过它们。红色是简单的“无趣”点,实际上缺少数据,不需要获得与它们的距离。可能不重要,但我想我会提到它。关于“所有最短距离”:不,它不是绿色单元格数(n)的平方,它是一个二项式系数(n2),所有绿色单元格中两个单元格的(非有序)组合。与网格是固定的这一事实没有直接关系。您可以在中尝试数据的可能情况,并决定哪种情况可能会得到最快的结果。谢谢,非常有用的信息。顺便说一句,我不需要路径,只需要距离,所以更接近点。并且,作为参考,它甚至有一个python(scipy)实现: