【问题标题】:The unambiguity of choosing the shortest path in NetworkxNetworkx中最短路径选择的明确性
【发布时间】:2017-12-30 18:21:53
【问题描述】:

我有一个图表:

为什么在使用最短路径函数后:

nx.shortest_path(g, 0, 6)

为什么输出路径是[0, 3, 6]?为什么不[0, 2, 6]?在上述情况下,算法shortest_path() 的路径[0, 3, 6] 的选择是否总是明确的?

【问题讨论】:

  • “明确”是什么意思?这恰好是在搜索顺序中首先找到的路径...如果您以不同的顺序连接节点或边缘存储的底层实现发生变化,那么可能首先尝试通过节点2 的路由.. .
  • 这可能取决于您指定边缘的顺序。所以同一张图可以有不同的最短路径。您总是获得一条最短路径。
  • 如果您查看 networkx 代码,您应该能够看到它是如何存储其边缘的......它是否意味着对邻接列表的任何排序或使用其他东西将提供更多细节......
  • 如果 networkx 按照添加的顺序遍历边缘......那么是的......否则 - 排序可能是它们存储方式的副作用,并且在这种情况下恰好发生 -第一条搜索路径恰好穿过边缘到节点 3 而不是节点 2...
  • 总而言之……这取决于networkx是否将您的图形存储为{0: [3, 2], 2: [6, 4], 3: [5, 6]},并且边缘是有序的,因为它们是列表,或者是{0: {3, 2}, 2: {6, 4}, 3: {5, 6}},它们是更有效的集合检查目标,但迭代顺序是幸运的(尽管一致,除非它们发生突变)

标签: python networkx shortest-path


【解决方案1】:

@jon-clements 在问题的 cmets 中有正确答案。如果有多个最短路径,函数networkx.shortest_path() 将返回其中之一。您获得的具体路径取决于数据在networkx 图形数据结构(基于 Python 字典)中的存储方式,并不保证是确定性的。如果您愿意,您可以获得所有最短路径,甚至可以对它们进行排序以提供稳定的顺序 - 例如

In [1]: import networkx as nx

In [2]: G = nx.Graph({0: [3, 2], 2: [6, 4], 3: [5, 6]})

In [3]: nx.shortest_path(G, 0, 6)
Out[3]: [0, 2, 6]

In [4]: list(nx.all_shortest_paths(G, 0,6))
Out[4]: [[0, 3, 6], [0, 2, 6]]

In [5]: sorted(nx.all_shortest_paths(G, 0,6))
Out[5]: [[0, 2, 6], [0, 3, 6]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2014-06-21
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多