Как использовать кратчайший путь Дейкстры на взвешенном графике для вычисления среднего значения весов? [Python]
Я хочу вычислить кратчайший путь Дейкстры во взвешенном графике, чтобы вычислить среднее значение весов. Я не нашел ничего полезного в Интернете, поэтому, пожалуйста, помогите мне, потому что я думаю, что это может быть полезно не только для меня.
У меня есть список словарей:
list_of_dictionaries= [
{"RA":"1","RB":"2","SPEED":"100"}
...
{"RA":"1","RB":"8250","SPEED":"150"}
{"RA":"2","RB":"3","SPEED":"120"}
...
{"RA":"2","RB":"8250","SPEED":"150"}
...
...
{"RA":"350","RB":"351","SPEED":"130"}
...
...
]
Я создаю взвешенный неориентированный граф, а затем использую кратчайший путь Дейкстры для вычисления средней скорости (а не общей скорости). Давайте начнем:
import networkx as nx
graph = nx.Graph()
for row in list_of_dictionaries:
source = row['RA']
target = row['RB']
if not graph.has_node(source):
graph.add_node(source)
if not graph.has_node(target):
graph.add_node(target)
graph.add_edge(source, target, speed=float(row['SPEED']))
Я проверил, что график подключен, и это так! Теперь я сначала получаю путь, который содержит список узлов (не ребер), затем беру два узла за раз, я проверяю в графе вес (скорость) ребра, созданного двумя узлами. Я повторяю эту процедуру для всех узлов пути, а затем вычисляю среднюю скорость.
Это, конечно, очень много времени и неэффективно
tot_speed = 0.0
path = nx.dijkstra_path(graph, source, target, 'speed')
for k, node in enumerate(path[:-1]):
n1 = path[k]
n2 = path[k + 1]
speed = graph[n1][n2]['speed']
tot_speed += speed
avg_speed = tot_speed / len(path)-1
Как видите, это не очень хороший способ, и здесь есть две основные проблемы:
1) если я попробую nx.dijkstra_path(graph, 1, 1, 'speed')
У меня проблемы, потому что знаменатель в формуле avg_speed равен нулю.
2) цикл for действительно грязный
Если у вас есть идея получше, пожалуйста, дайте мне знать вашу точку зрения. Благодарю.