Networkx: получить расстояние между узлами

Я новичок в использовании NetworkX, и я пытаюсь найти способ определить, какие узлы имеют расстояние x друг от друга. Я начал с использования этого алгоритма, чтобы получить все пары

path=nx.all_pairs_dijkstra_path(G)

но я все еще не уверен, как определить расстояние между узлами с помощью цикла for.

Я был бы признателен за любую помощь. Спасибо

1 ответов


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. Когда мне нужно знать кратчайший путь между двумя узлами, например node "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!)

пожалуйста, дайте мне знать если вы имеете любые вопросы.