Как получить вес наименьшего пути между двумя узлами? - PullRequest
2 голосов
/ 25 мая 2019

У меня есть граф networkx в Python, со взвешенными ребрами. Я хочу получить вес наименьшего пути между двумя узлами.

В настоящее время я получаю узлы в кратчайшем пути из реализации nx.shortest_path, а затем перебираю каждую пару и суммирую весовые коэффициенты между каждой парой узлов.

shortest_path = nx.shortest_path(G, source, destination, 'distance')

#function to iterate over each pair

import itertools
def pairwise(iterable):
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

weightSum = 0
for adjPair in pairwise(shortest_path):
    weightSum = weightSum + G[adjPair[0]][adjPair[1]]['distance']

Есть ли лучшая (встроенная) альтернатива этому?

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Вы ищете single_source_dijkstra:

from networkx.algorithms.shortest_paths.weighted import single_source_dijkstra

single_source_dijkstra(G,s,t)

пример

import networkx as nx
from networkx.algorithms.shortest_paths.weighted import single_source_dijkstra

G = nx.Graph()

G.add_edge('a', 'b', weight=0.6)
G.add_edge('a', 'c', weight=6)
G.add_edge('c', 'd', weight=0.1)
G.add_edge('c', 'e', weight=0.7)
G.add_edge('c', 'f', weight=0.9)
G.add_edge('a', 'd', weight=0.3)

single_source_dijkstra(G,'b','f')

выход

(1.9, ['b', 'a', 'd', 'c', 'f'])
0 голосов
/ 25 мая 2019

В документации по networkx есть эта страница: кратчайшие пути .

Есть несколько вариантов, но, похоже, shortest_path_length() - это то, что вам нужно.

Для ясности:

shortest_path = nx.shortest_path_length(G, source, destination, 'distance')
...