【问题标题】:Is all_pairs_dijkstra faster than multiple dijkstra_path?all_pairs_dijkstra 是否比多个 dijkstra_path 快?
【发布时间】:2023-03-25 04:00:02
【问题描述】:

all_pairs_dijkstra 只是一个带有 for 循环的 dijkstra_path,还是在 all_pairs_dijkstra 中一次性计算出所有最短路径?

在 for 循环中执行一个 all_pairs_dijkstra 或多个 dijkstra_path 是否更快?

【问题讨论】:

  • 你为什么不测试一下?
  • 我会的,但我想在更改代码之前先了解一下算法。我没有图形分析方面的经验。

标签: python networkx graph-theory shortest-path dijkstra


【解决方案1】:

all_pairs_dijkstra 等的 Networkx 实现使用记忆化 in form of a heap 来记忆已经访问过的节点。与迭代叉积和手动使用 nx.shortest_path 相比,这使其速度更快。

import networkx as nx
from itertools import product

G = nx.grid_2d_graph(20,20)
%timeit -n 3 -r 2 sum([nx.shortest_path_length(G, u, v) for u, v in product(G.nodes, G.nodes)])
17.2 s ± 158 ms per loop (mean ± std. dev. of 2 runs, 3 loops each)
%timeit -n 3 -r 2 sum([ d for t in nx.all_pairs_dijkstra_path_length(G) for d in t[1].values() ])
335 ms ± 1.29 ms per loop (mean ± std. dev. of 2 runs, 3 loops each)

【讨论】:

  • 是的,由于内存限制,我最终没有使用所有对。感谢您的意见!
  • @NicolasCadieux 万一这件事又发生了:碰巧我 wrote something 昨天关于所有对最短路径的事情。图形工具部分在内存上更轻。
【解决方案2】:

虽然我无法具体说明 networkx 是如何实现此功能的,但使用 Dijkstra 算法解决所有对最短路径问题仅意味着从图中的每个节点开始运行 Dijkstra 算法的副本以计算成对距离。

在决定是使用 for 循环围绕单个调用还是使用 all_pairs_dijkstra 函数时,我建议使用 all_pairs_dijkstra ,除非您有令人信服的理由不这样做,因为该函数明确电报你的意图。另外,如果在幕后进行了任何优化,您将能够利用它们。

但特别是对于networkx,有什么理由不只使用更简单的all_shortest_paths 函数吗?我想这更简单,除非你有特定的理由使用all_pairs_dijkstra,否则这将是一个不错的选择。

【讨论】:

  • 所有对都会给我每个节点到每个节点对吗?这意味着如果我有 10 个节点,我将有 100 条路径? (减去对角线(如节点 1 到节点 1)。通过删除图形中间的节点,可以加快速度还是我需要在每个边上都有节点才能使用边?(我是新手如您所见的图表。)
  • 是的,所有对最短路径 (APSP) 将为您提供所有节点对之间的最佳路径。如果图形是无向的,通过对称性,您可以消除大约一半(从 A 到 B 的路径与从 B 到 A 的路径匹配)。如果您只需要知道某些节点对之间的路径长度,则可以通过仅计算来自这些节点的最短路径来比 APSP 做得更好。但是,您可能仍需要考虑图表中的其他节点,因为即使您稍后对它们不感兴趣,最短路径也可能会通过它们。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2015-06-06
  • 1970-01-01
  • 2016-07-14
  • 2016-06-25
  • 1970-01-01
相关资源
最近更新 更多