【问题标题】:Computing graph from the distances between points从点之间的距离计算图
【发布时间】:2021-02-05 15:02:57
【问题描述】:

我有一组地理点(纬度、经度),我想计算一个有向图,其中:

  • 节点就是那些点
  • 如果 X 之间的最快路径存在,则存在一条边 X->Y(在节点 XY 之间) > 和 Y 不通过另一个节点 Z

我能够计算任意一对节点之间路径的持续时间。 现在,我正在做以下事情:

  1. 计算每对节点之间的持续时间
  2. 对于每对节点 X,Y,如果存在 XY 之间的边没有节点 Z 使得 X->Z 加上 Z->YX->Y 的持续时间相同。

我已经为节点的子集测试了这种方法,它似乎有效,但由于我有大约 2000 个节点并且节点之间持续时间的计算在计算上很昂贵(因为它涉及计算最短路径),我会想知道是否有更好的方法。

一些额外的(可能不相关的)信息:

任何帮助将不胜感激

【问题讨论】:

  • 查看Minimum Spanning Tree (MST),我相信这正是您所寻求的。有更快的方法来构建它们。此外,查看“距离矩阵”的 API 文档(他们将其称为“表格服务”),它将返回一个 200x200 矩阵,告诉您所有事物之间的距离。然后你只需要从中构建 MST。 project-osrm.org/docs/v5.23.0/api/#table-service
  • 虽然可能可以优化餐桌服务,因为您真的不需要知道所有 200x200 距离。假设这些 X 中至少有一个在您的 200 个位置内,则获取最近的 X 位置的表服务可能会正常工作。否则,餐桌服务可能是最好的途径。
  • @Nuclearman 谢谢你的回答。但是,MST 是针对无向图的,我的图必须是有向的(因为它对应一个道路网络)。我遇到了 Chu–Liu/Edmonds 的算法,它相当于有向图的 MST,但它生成的图是每个节点只有一个传入边,这在我的情况下不成立。
  • 嗯,添加了一个答案,但最坏的情况是,如果您的最短路径非常复杂,不确定您是否可以比所有路径做得更好。该方法基本上尝试从三角测量开始以估计应该是最短路径,然后尝试验证它们实际上是最短路径。

标签: graph openstreetmap graph-theory geo osrm


【解决方案1】:

我将从运行 Delaunay 三角剖分开始,这将使您了解路径结构“应该”是什么样子(理论上)。理论上,一旦你有了 delaunary 三角测量,就很容易找到最短路径。然而,在实践中,您使用的是道路网络而不是点对点距离,因此您必须挑战这些假设。

  1. 首先构建一个给出 Delaunay 三角剖分的方法。三角剖分的示例如下所示。假设 HJG 点位于市中心,其周围的点是围绕它的高速公路。以 65 英里/小时左右的速度限制说。这意味着从 ABCG 出发可能比 AHG 更快。

  2. 对于 Delaunay 三角剖分中的每条边。确定两个方向上边缘的持续时间。这将为您提供初始权重(如果您可以确定 AH 的最短路径实际上是 ABH,它也可能影响三角测量)。如果没有办法绕过更快的路线。 ABCG 比 AHG 示例快。那么你可能已经完成了。如果不是,你将不得不尝试收缩边缘,这取决于你的数据,可能需要做所有的路线,因为你不能确定一些模糊的路径可以让它更快。遗憾的是,三角测量无法解释边缘之间的速度差异。

  1. 如果您可以将其设置为告诉您它确实通过了哪个点,那么您就可以避免在所有路径上运行它。 IE:如果你可以说让它告诉你最快的路径 AF,并且它说它使用 AHGF,那么你可以合理地确定 AHG 和 HGF 是 AG 和 HF 之间的最短路径,你不需要运行那些.但是,如果你发现AF实际上取的是ABCEF,那么显然两条路线之间的速度差异很大,你还应该检查到AG的最快路线,以确保它实际上是AHG。每当您找到更快的边缘时,请务必添加到三角测量中。您实际上可能能够添加多个边缘。基本上这里的想法是,如果速度无关紧要,三角测量可以让您了解什么应该是最快的路线。但是,您需要确认或拒绝该假设。基本上每个节点。通过 BFS 找到到所有点的最短路径。走最长的路去探索吧。

  2. 为了帮助#3,它可能有助于图中边缘的顶点路径覆盖。创建从每个点到所有最远点的路径,直到覆盖所有点。 IE:ABCD ABCE AHGF AHJKL AIK(也是方向相反的顺序)。然后您可以从 AD、AE、AF、AL 和 AK 运行最短路径。如果这些路径与预期路径匹配,那么您就完成了。如果没有,您将在上面#3 使用的方法中不断改进。但最坏的情况是,我不确定有没有办法比所有最短路径都快得多,理论上这种方法大约是 O(VE)。

  3. 理论上#4 需要从每个顶点开始。但是,如果连接路径作为最短路径有效,则可以跳过顶点,因此我可能会建议开始检查具有最少(未验证?)边数的顶点。尽管如此,您可能需要对所有对进行 100% 确保只有最短的边连接每个节点。

  4. 对于测试,我建议这样做:随机选择 2000 个点中的 10-200 个。在这 10-200 点上运行算法。然后在这些点上运行所有路径。如果他们不同意,请仔细查看他们不同意的原因。随时在您的答案和评论中添加任何“例外”案例。重复多次,看看有没有分歧。注意所有的分歧。如果没有分歧,请尝试在整个 2000 点集上运行。我强烈建议在第 2 步之后进行此测试。Delaunay 图有可能非常接近最优值,具体取决于您的数据集。

【讨论】:

  • 在最坏的情况下,创建一个用于验证最短路径的 2000X2000 表可能很有用。并标记边缘,因为您已验证它们是最短的边缘。理论上,检查这些是否是最短路径大约是 V^2。如果你必须做 BFS 来找到最短路径,这可能比所有最短路径都要好。
  • 非常感谢您的详细解释。我会试一试并在这里报告我的发现。干杯
猜你喜欢
  • 2014-11-29
  • 2014-02-28
  • 2010-10-30
  • 1970-01-01
  • 2011-04-23
  • 2014-11-14
相关资源
最近更新 更多