Библиотека Dijkstra python передает значение add_edge в Graph - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь использовать встроенную библиотеку Dijkstar из Python и получаю запрос на передачу значений add_edge. Пожалуйста, помогите.

from dijkstar import find_path, Graph
graph = Graph()

input_file = input('Input the file name')
w = list()
i = 0
with open(input_file, 'r') as file:
    for line in file:
        for word in line.split():
            w.append(word)
        graph.add_edge(w[0], w[1], w[2])
        print(w[0], w[1], w[2])
        i = 0
        w.clear()

print(find_path(graph, 1, 4))

Входной файл следующий, и он отлично работает для w [0], w [1] и w [2]

1 2 1000
2 3 2000
3 4 3000
1 4 4000

Вывод показывает ошибку следующим образом:

raise NoPathError('Could not find a path from {0} to {1}'.format(s, d))
dijkstar.algorithm.NoPathError: Could not find a path from 1 to 4

Есть путь от 1 до 4 двумя способами, то почему он показывает ошибку, понять не смог. Было бы здорово, если бы я смог получить любую помощь.

1 Ответ

1 голос
/ 27 мая 2020

Поверьте, проблема заключалась в том, что вы не преобразовывали ввод в числа (т.е. веса оставались строками).

Попробуйте следующее.

Код

from dijkstar import find_path, Graph

input_file = input('Input the file name: ')

with open(input_file, 'r') as file:
    graph = Graph()                     # place closer to where first used
    for line in file:
      line = line.rstrip()              # remove trailing '\n'
      w = list(map(int, line.split()))  # convert line to list of ints
      graph.add_edge(w[0], w[1], w[2])  # add edge with weights
      print(w[0], w[1], w[2])

print(find_path(graph, 1, 4))

Вход

file.txt

1 2 1000 
2 3 2000 
3 4 3000 
1 4 4000

Выход

PathInfo(nodes=[1, 4], edges=[4000], costs=[4000], total
_cost=4000)

Комментарии

Нет необходимости объявлять w как список или очищать его между использованием

w = list()  # no need
w.clear()   # no need

Вы должны почти всегда удалять завершающий '\ n' при повторении над файлом

 line = line.rstrip()

Это неэффективный способ размещения элементов в w

for word in line.split():
    w.append(word)

Проще просто назначать напрямую.

 w = line.split()

Однако w будет быть заполненным строками, поэтому необходимо сопоставить с целыми числами.

 w = list(map(int, line.split()))

Переменная i не используется (или не требуется), поэтому удалите.

i = 0
...