【问题标题】:Finding all-pairs shortest path for a portion of nodes查找部分节点的所有对最短路径
【发布时间】:2022-01-18 22:00:58
【问题描述】:

使用 NetworkX "all_pairs_dijkstra_path" 函数,可以在图形G 中找到所有对的最短路径。现在,假设图 G 非常大,比如包含 100,000 个节点,而我只想找到节点子集的最短路径,比如 1,000 个随机绘制的节点。

使用 NetworkX 的“dijkstra_path”函数,我可以遍历节点子集并找到我要查找的内容。但是,这样做似乎效率不高,因为我会调用函数n 次(假设子集的长度是n)并且到目前为止调查的信息将被丢弃。我阅读了多篇文章,提到 all_pairs 函数更适合搜索所有对之间的路径,而不是在循环中使用单个源到目标函数。有没有办法在 NetworkX 中提供节点子集作为输入?或者下一个最好的方法是什么?

该问题与this 未回答的问题重复。

【问题讨论】:

    标签: python networkx shortest-path


    【解决方案1】:

    特别是对于networkx 的all_pairs_dijkstra_path,调用nsingle_source_dijkstra_path 不会损失任何性能。如果您查看all_pairs_dijkstra_path 的实现,这将变得清晰:

    def all_pairs_dijkstra_path(G, cutoff=None, weight="weight"):
        """ < docs """
        path = single_source_dijkstra_path
        # TODO This can be trivially parallelized.
        for n in G:
            yield (n, path(G, n, cutoff=cutoff, weight=weight))
    

    如果您需要更多信息,您应该更具体地说明您的情况:

    • 有向与无向
    • 未加权 vs 加权,如果加权了哪种权重,例如负权重可能吗?
    • 是有向无环图吗?或任何其他特定类型的图表?
    • 在您的用例中是否使用截止(参见上面的函数)?
    • 图是单个(强)连通分量吗?

    但可能更重要的是,您是否简单地尝试过 1000 个节点上的循环? (或从 30 开始并检查运行时)。许多事情取决于您的用例以及您想要计算或近似的内容。

    【讨论】:

    • 我正在处理的图是一个连通的、循环的、有向的和加权的图。截止不适用。循环工作完全正常,但正在寻找可能的改进。
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多