Как использовать кратчайший путь Дейкстры на взвешенном графике для вычисления среднего значения весов? [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 действительно грязный

Если у вас есть идея получше, пожалуйста, дайте мне знать вашу точку зрения. Благодарю.

0 ответов

Другие вопросы по тегам