我是使用NetworkX的初学者,我正试图找到一种方法来检测哪些节点彼此之间的距离为x。 我已经开始使用这个算法来获得所有对
path=nx.all_pairs_dijkstra_path(G)
但我仍然不确定如何使用for循环检测节点之间的距离。
我很感激任何帮助。谢谢
答案 0 :(得分:8)
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 = nx.all_pairs_shortest_path(G)
>>> sp["A"]["E"]
['A', 'B', 'C', 'D', 'E']
>>> spl = 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!)
如果您有任何疑问,请与我们联系。