NetworkX 具有自动计算加权图和未加权图的最短路径(或仅计算路径长度)的方法。确保为您的用例使用正确的方法。
networkx.all_pairs_shortest_path - 计算未加权图中所有节点之间的最短路径
networkx.all_pairs_shortest_path_length - 计算未加权图中所有节点之间的最短路径长度
networkx.all_pairs_dijkstra_path - 计算加权图中所有节点之间的最短路径
networkx.all_pairs_dijkstra_path_length - 计算加权图中所有节点之间最短路径的长度
这些方法中的每一个,当在图上执行时,将计算节点的字典矩阵(“字典的字典”),其值可以是各自的最短路径或最短路径的长度。我会用一个例子来证明这一点:
>>> import networkx as nx
>>> G = nx.Graph()
>>> G.add_nodes_from(["A", "B", "C", "D", "E"])
>>> G.add_edges_from([("A", "B"), ("B", "C"), ("C", "D"), ("D", "E")])
>>> sp = dict(nx.all_pairs_shortest_path(G))
>>> sp["A"]["E"]
['A', 'B', 'C', 'D', 'E']
>>> spl = dict(nx.all_pairs_shortest_path_length(G))
>>> spl["A"]["E"]
4
如您所见,我生成了一个包含五个节点的图,并通过一条边将每个节点链接到下一个节点。我在sp 中存储了一个最短路径矩阵,在spl 中存储了一个最短路径长度矩阵。当我需要知道两个节点之间的最短路径时,例如节点"A" 和节点"E",我只是像矩阵或字典一样访问sp:sp["A"]["E"]。然后它将返回两个节点之间的整个最短路径。最短路径长度的方法以类似的方式工作,但它只会返回任意两个给定节点之间的边数。
下一个代码 sn-p 可能会让我对字典矩阵的意思更清楚。如果我为节点 "A" 请求 sp 中的所有条目,它会返回另一个字典,其中包含每个其他节点的条目:
>>> sp["A"]
{'B': ['A', 'B'], 'A': ['A'], 'E': ['A', 'B', 'C', 'D', 'E'], 'C': ['A', 'B', 'C
'], 'D': ['A', 'B', 'C', 'D']}
如果您想使用for 循环检查所有节点之间的距离,您可以只遍历矩阵的第一个字典的键,然后遍历该字典内的字典。这比听起来容易:
>>> for node1 in spl:
... for node2 in spl[node1]:
... print("Length between", node1, "and", node2, "is", spl[node1][node2])
...
Length between B and B is 0
Length between B and A is 1
Length between B and E is 3
Length between B and C is 1
Length between B and D is 2
Length between A and B is 1
... (and so on!)