NetworkX 具有自动计算加权和未加权图的最短路径(或仅路径长度)的方法。确保针对您的用例使用正确的方法。
networkx.all_pairs_shortest_path https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.unweighted.all_pairs_shortest_path.html#networkx.algorithms.shortest_paths.unweighted.all_pairs_shortest_path- 计算一个网络中所有节点之间的最短路径未加权的 graph
networkx.all_pairs_shortest_path_length https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.unweighted.all_pairs_shortest_path_length.html#networkx.algorithms.shortest_paths.unweighted.all_pairs_shortest_path_length- 计算一个网络中所有节点之间的最短路径的长度未加权的 graph
networkx.all_pairs_dijkstra_path https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path.html#networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path- 计算a中所有节点之间的最短路径weighted graph
networkx.all_pairs_dijkstra_path_length https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path_length.html#networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path_length- 计算a中所有节点之间的最短路径的长度weighted graph
这些方法中的每一种,当在图上执行时,都会计算节点的字典矩阵(“字典的字典”),以相应的最短路径或最短路径的长度作为值。我将用一个例子来证明这一点:
>>> 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"]
。然后它将返回两个节点之间的整个最短路径。最短路径长度的方法以类似的方式工作,但它只会返回任意两个给定节点之间的边数。
下一个代码片段可能会让我对字典矩阵的意思更加清楚。如果我请求所有条目sp
对于节点"A"
,它返回另一个字典,其中包含每个其他节点的条目:
>>> 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!)