【问题标题】:How does osmnx know which edges to plot in shortest pathosmnx 如何知道在最短路径中绘制哪些边
【发布时间】:2021-04-17 18:31:06
【问题描述】:

根据文档,边缘由三个参数唯一定义:uvk。所以即使 u 和 v 可以相同,参数k 也会区分边缘

当我计算两个节点之间的最短路径时,我使用nx.shortest_path。这为我提供了最短路径中的节点列表。

举个例子,我们考虑节点1和2。现在我计算它们之间的最短路径,结果如下:

[1, 4, 6, 7, 2]

如果有一个 egde u=4, v=6, k=0 和另一个 u=4, v=6, k=1 我怎么知道哪一个是最短路径? osmnx 怎么知道它可以绘制给定的最短路径?

提前谢谢你。

【问题讨论】:

    标签: python networkx osmnx


    【解决方案1】:

    我是 OSMnx 的开发者。听起来你在问它的plot_graph_route 功能。对于沿最短路径的平行边(即,某个节点u 和某个节点v 之间的多条边),OSMnx 选择长度较短的边。你可以确切地看到它是如何处理这个here的。

    【讨论】:

    • 我看不到处理相同长度边的语句。我想如果长度相同,选择哪个并不重要?
    • 正确。如果值相等,则取决于 min 函数返回的任意值。
    • 感谢您的澄清!
    【解决方案2】:

    这似乎有两个问题。涉及networkx的部分我可以回答。

    Graph:

    有点迂腐(因为我在想象未来的人会在谷歌上搜索这个),这确实取决于您正在使用的图表类型。我们将从通用图表开始:

    import networkx as nx
    
    G = nx.path_graph(5)
    G.add_edge(2, 8, weight=0.3)   # A
    G.add_edge(2, 8, weight=0.6)   # B
    G.add_edge(1, 8, weight=1.0)
    
    for u, v, w in G.edges(data=True):
        print(u, v, k)
    

    ...并考虑如果我们切换标记为AB 的行的顺序会发生什么:

    import networkx as nx
    
    G = nx.path_graph(5)
    G.add_edge(2, 8, weight=0.6)   # B
    G.add_edge(2, 8, weight=0.3)   # A
    G.add_edge(1, 8, weight=1.0)
    
    for u, v, w in G.edges(data=True):
        print(u, v, k)
    

    在这两种情况下:网络看起来都一样:

    但是我们网络的参数在这两种情况下是不同的:

    # A first
    0 1 {}
    1 2 {}
    1 8 {'weight': 1.0}
    2 3 {}
    2 8 {'weight': 0.6}
    3 4 {}
    

    # B first
    0 1 {}
    1 2 {}
    1 8 {'weight': 1.0}
    2 3 {}
    2 8 {'weight': 0.3}
    3 4 {}
    

    所以这里:答案是uvk 是唯一的,shortest_path 返回的列表将是唯一的。

    MultiDiGraph:

    我 90% 确定这是问题要问的情况。在MultiDiGraph 中,节点仍由uv 索引,但可以有多个权重k

    import networkx as nx
    
    GM = nx.MultiDiGraph()
    GM.add_edge(0, 2, weight=0.3)
    GM.add_edge(0, 2, weight=0.15)
    GM.add_edge(1, 2, weight=0.1)
    GM.add_edge(0, 1, weight=0.1)
    GM.add_edge(2, 3, weight=0.4)
    GM.add_edge(2, 3, weight=0.5)
    
    for u, v, w in GM.edges(data=True):
        print(u, v, w)
    
    path = nx.shortest_path(GM, source=0, target=3, weight='weight')
    print(path)
    # [0, 2, 3]
    

    nx.shortest_path 返回的列表不明确,但重构最小权重路径非常简单:

    for u, v in zip(path[0:], path[1:]):
        edge_data = GM.get_edge_data(u, v)
        min_weight = min([edge_data[edge]['weight'] for edge in edge_data])
        print(f"{u}---({min_weight})---{v}")
    

    结果:

    0---(0.15)---2
    2---(0.4)---3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2020-09-12
      • 2015-04-05
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多