Автор оригинала: Team Python Pool.
Реализация алгоритма Дейкстры в Python
Всякий раз, когда нам нужно представить и сохранить связи или связи между элементами, мы используем структуры данных, известные как графики. В графе у нас есть узлы (вершины) и ребра. Узлы-это объекты (значения), а ребра-линии, соединяющие узлы. В python мы представляем графики с помощью вложенного словаря. Мы представляем узлы графа как ключ, а его связи-как значение. Нам часто нужно найти кратчайшее расстояние между этими узлами, и мы обычно используем алгоритм Дейкстры в python. График в целом выглядит так-
Таким образом, алгоритм Дейкстры используется для нахождения кратчайшего расстояния между исходным узлом и целевым узлом. Подход, которому следует алгоритм Дейкстры, известен как Жадный подход. Хотя сегодня речь идет о понимании логики и реализации алгоритма Дейкстры в python, если вы не знакомы с такими терминами, как Жадный подход и графики, потерпите некоторое время, и мы попытаемся объяснить все и вся в этой статье.
Концепция Алгоритма Дейкстры
Что такое Жадный подход?
Во Введении мы говорили вам, что алгоритм Дейкстры работает на жадном подходе, так что же это за Жадный подход?
С точки зрения непрофессионалов, Жадный подход-это стратегия, в которой мы выбираем наилучший из возможных вариантов, предполагая, что он приведет нас к наилучшему решению.
Подумайте об этом таким образом, мы выбрали лучшее решение в тот момент, не задумываясь о последствиях в будущем.
Описание алгоритма Дейкстры
Шаг 1: Создайте временный граф, который хранит значение исходного графа, и назовите его не посещенным графом. Кроме того, инициализируйте список, называемый путем, чтобы сохранить кратчайший путь между источником и целью.
Шаг 2: Нам нужно вычислить минимальное расстояние от исходного узла до каждого узла.
Первоначально отметьте total_distance для каждого узла как бесконечность ( ∞ ), а исходный узел отметьте total_distance как 0, так как расстояние от исходного узла до исходного узла равно 0. Кроме того, отметьте этот исходный узел как current_node.
Исходный узел/current_node-это “A”, отметьте его как 0.
Шаг 3: Из current_node выберите соседние узлы (узлы, которые непосредственно связаны) в любом случайном порядке. Проверьте, является ли текущее значение этого узла (изначально оно будет (∞)) выше (значение current_node + значение ребра, соединяющего этот соседний узел с current_node ).
Если да, то замените важность этого соседнего узла значением current_node + значением ребра, соединяющего этот соседний узел с current_node. Повторите этот процесс для всех соседних узлов текущего узла
При C, как 2 < ∞, обновите значение C с ∞ до 2.
При B, как 5 < ∞, обновите значение B от ∞ до 5.
Шаг 4: После того, как мы обновили все соседние узлы значений текущего узла, пришло время удалить текущий узел из unvisited_nodes.
Из всех тех узлов, которые были соседями текущего узла, сосед выбрал сосед с минимальным расстоянием и установил его как current_node.
При D (путь A->C->D), 9 (7+2) меньше ∞, обновите значение от ∞ до 9.
Шаг 5: Повторяйте шаги 3 и 4 до тех пор, пока не будут посещены все узлы в unvisited_visited узлах.
Как только все узлы будут посещены, мы получим самый короткий href=”https://en.wikipedia.org/wiki/Distance”>расстояние от исходного узла до целевого узла. href=”https://en.wikipedia.org/wiki/Distance”>расстояние от исходного узла до целевого узла.
Когда мы снова приходим к D (на этот раз путь A->B ->D), значение D становится 8.
Наконец, после 15 < =, так что расстояние будет обновляться от = до 15.
Выход, который мы получили здесь, составляет 15.
Теперь, когда у нас есть представление о том, как работает алгоритм Дейкстры, давайте сделаем для него программу на python и проверим наш вывод сверху.
Реализация алгоритма Дейкстры в Python
def dijkstra(nodes, distances): # These are all the nodes which have not been visited yet unvisited = {node: None for node in nodes} # It will store the shortest distance from one node to another visited = {} # It will store the predecessors of the nodes # Running the loop while all the nodes have been visited while True: # iterating through all the unvisited node for neighbour, distance in distances[current].items(): # Iterating through the connected nodes of current_node (for # example, a is connected with b and c having values 10 and 3 # respectively) and the weight of the edges if neighbour not in unvisited: continue + distance if unvisited[neighbour] is None or unvisited[neighbour] > newDistance: # Till now the shortest distance between the source node and target node # has been found. Set the current node as the target node del unvisited[current] if not unvisited: break candidates = [node for node in unvisited.items() if node[1]] current,(candidates, x: x[1])[0] return visited nodes = ('A', 'B', 'C', 'D', 'E', 'F', 'G') distances = { 'B': {'A': 5, 'D': 1, 'G': 2}, 'A': {'B': 5, 'D': 3, 'E': 12, 'F' :5}, 'D': {'B': 1, 'G': 1, 'E': 1, 'A': 3}, 'G': {'B': 2, 'D': 1, 'C': 2}, 'C': {'G': 2, 'E': 1, 'F': 16}, 'E': {'A': 12, 'D': 1, 'C': 1, 'F': 2}, 'F': {'A': 5, 'E': 2, 'C': 16}} print(dijkstra(nodes, distances))
Выход-
{'B': 0, 'D': 1, 'E': 2, 'G': 2, 'C': 3, 'A': 4, 'F': 4}
Ответ тот же, что мы получили от алгоритма.
Должен Читать
- Как преобразовать строку в нижний регистр в
- Как вычислить Квадратный корень
- Пользовательский ввод | Функция ввода () | Ввод с клавиатуры
- Лучшая книга для изучения Python
Вывод
Алгоритм Дейкстры в python очень удобен, когда мы хотим найти кратчайшее расстояние между источником и целью. Он может работать как для направленных, так и для неориентированных графов. Ограничение этого алгоритма заключается в том, что он может давать или не давать правильный результат для отрицательных чисел. В Google Maps для поиска кратчайшего маршрута между одним источником и другим мы используем алгоритм Дейкстры. Другое приложение находится в сети, где оно помогает в отправке пакета от источника к месту назначения.
Попробуйте запустить программы на вашей стороне и дайте нам знать, если у вас есть какие-либо вопросы.
Счастливого кодирования!