【问题标题】:K-shortest paths using networkx package in python在 python 中使用 networkx 包的 K-最短路径
【发布时间】:2023-04-06 07:18:01
【问题描述】:

我使用 osmnx 包创建了荷兰高速公路的多向图。

该图是从 osmnx 返回的多向图。由于我有兴趣计算起点和终点之间的 k 最短路径,因此我尝试了 networkx 库。但是,networkx 似乎不适用于多向图。我只能计算最短路径。

我想问一下是否有其他方法可以在 python over multidigraph 上执行 k-最短路径计算。

【问题讨论】:

    标签: python-3.x networkx osmnx


    【解决方案1】:

    尝试使用 networkx 命令shortest_simple_paths (documentation)。

    它返回一个生成器,它一次返回一条从最短到最长的路径。

    G = nx.karate_club_graph()
    X = nx.shortest_simple_paths(G, 0, 5)
    k = 5
    for counter, path in enumerate(X):
         print(path)
         if counter == k-1:
             break
    > [0, 5]
    > [0, 6, 5]
    > [0, 10, 5]
    > [0, 6, 16, 5]
    > [0, 4, 6, 5]
    

    这适用于DiGraphs,但我不确定MultiDiGraph。但是,我不清楚道路网络是否会是 MultiDiGraph。

    【讨论】:

    • nx.info(graph) 的输出表明该图是多向图。但是,当我尝试运行 nx.shortest_simple_paths(graph, origin,destination) 时,它输出:networkx.exception.NetworkX NotImplemented: not implemented for multigraph type
    • 它是否需要成为一个多向图而不仅仅是一个有向图?如果你用它创建一个有向图,你会丢失任何信息吗?
    • 现实世界的街道网络通常是 MultiDiGraph。但是,值得检查您的具体情况,看看这是否重要。例如,如果您的图不包含平行边,那么您可以将其转换为 networkx DiGraph 而不会丢失信息。此外,如果它包含非常少的平行边,您可以将其转换为具有最小(并且可能是可接受的)信息损失的 networkx DiGraph。这将为您的模型打开只能在有向图对象上运行的 networkx 算法。
    • 如果我将其转换为有向图,我将无法绘制路线。 osmnx 绘图功能仅适用于 mulitdigraph。
    • 您可以创建一个有向图版本的副本并运行 networkx 算法。在您的情况下,我看不到任何平行边缘,因此这可能不会丢失任何东西。然后,您可以使用 DiGraph 和原始 MultiDiGraph 中的路径。否则,也许您可​​以修改 networkx 代码,但我不确定这会有多难。
    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多