【问题标题】:Finding all shortest paths from every pair of nodes on a graph从图中的每对节点中查找所有最短路径
【发布时间】:2011-01-26 04:03:13
【问题描述】:

我有大约 70k 节点和 250k 边,并且该图不一定是连接的。显然,使用有效的算法至关重要。你有什么推荐的?

作为旁注,我希望得到有关如何在多台机器之间划分任务的建议——这种问题甚至可能吗?

谢谢

【问题讨论】:

  • 你是对的,这不是作业问题,只是一个有趣的项目。我没有考虑近似值,但在这种情况下,我需要获取两个节点之间的实际路径,而不仅仅是距离。在这种情况下,我看不出近似值如何真正有帮助,但如果可以的话,我很想听听。编辑:这是对已删除的评论的回应。哦,好吧。
  • 抱歉我删了!我只是问你是否考虑过使用近似值求解,但后来我决定不问,因为你已经接受了答案。 :)
  • 在这种情况下的近似值是不能保证最短的路径,但保证不会比最短路径长 x%。
  • 您有 18GiB 的内存来存储解决方案吗?你真的需要所有这些吗?

标签: algorithm graph graph-theory shortest-path


【解决方案1】:

您可以使用Floyd-Warshall algorithm。它正好解决了这个问题。

复杂度为 O(V^3)。

还有Johnson's algorithm,复杂度为 O(V^2*log V + VE)。后者也很容易分发,因为它运行了 Dijkstra 的算法 V 次,可以并行完成。

【讨论】:

  • 嗯。但具有O(n^3) 的复杂性。它可能效率不高。
  • @dirkgently:实际上,复杂度大概是 O(V^2+V*E)。这不是火箭快,但如果你想要 V^2 输出,你可能无法获得更多。
  • @jpalecek:我指的是原始帖子,尤其是 Floyd Warshall。
  • 哇,Floyd-Warshall 是一个简洁的算法。如果我没有这么多节点,我肯定会选择它。
【解决方案2】:

MapReduce 是一个很好的分布式算法,虽然它可能有点太强大了。如果您对此感兴趣,请查看this lecture 或此blog post 以获得灵感。 (事实上​​,当我学习 MapReduce 时,这是最早的例子之一。)

对于 250k 边和 70k,图似乎相对稀疏,Dijkstra's algorithm 针对每个节点在 O( E + V log V ) 中运行,整个运行时间(所有来源)为 O( VE + V^2 log V )。这应该足够快,但通常的警告适用于 Dijkstra。 (负边。)

如果您的问题涉及负权重而不是负循环,您也可以查看Johnson's algorithm。具体来说,它也可以是分布式的,因为它采用重新加权的图并从每个节点运行 Dijkstra 算法。

【讨论】:

【解决方案3】:

有两种简单的方法可以并行化这个问题:
1) 识别子组件并将它们分布在不同的计算机上。来自两个不同组件的两个节点之间的路径长度未定义。

2) 将图表加载到不同的计算机中,并为每台计算机提供一个节点列表,以计算所有最短路径。一个节点的结果不依赖于另一个节点的结果,因此您可以并行化此问题。

好处:实现起来并不难,但如果你必须解决这个问题,我只会这样做。如果这是一个反复出现的问题,那么您可能需要查看分布式算法。

使用igraph,它是用 C 编写的,速度非常快,您可以使用 Python 作为包装语言。

【讨论】:

    【解决方案4】:

    查看具有以下关键字的论文/出版物:分布式图搜索算法。 Here 可能会有所帮助。

    还有这个 ACM 帐户专用纸:Distributed computation on graphs: shortest path algorithms

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多