Рубрики
Без рубрики

Реализация алгоритма Дейкстры в Python

Чтобы найти кратчайшее расстояние между исходным узлом и узлом назначения и его путь в графе, мы используем алгоритм Дейкстры в python.

Автор оригинала: Team Python Pool.

Реализация алгоритма Дейкстры в Python

Всякий раз, когда нам нужно представить и сохранить связи или связи между элементами, мы используем структуры данных, известные как графики. В графе у нас есть узлы (вершины) и ребра. Узлы-это объекты (значения), а ребра-линии, соединяющие узлы. В python мы представляем графики с помощью вложенного словаря. Мы представляем узлы графа как ключ, а его связи-как значение. Нам часто нужно найти кратчайшее расстояние между этими узлами, и мы обычно используем алгоритм Дейкстры в python. График в целом выглядит так-

Алгоритм Дейкстры Python
Алгоритм Дейкстры Python

Таким образом, алгоритм Дейкстры используется для нахождения кратчайшего расстояния между исходным узлом и целевым узлом. Подход, которому следует алгоритм Дейкстры, известен как Жадный подход. Хотя сегодня речь идет о понимании логики и реализации алгоритма Дейкстры в python, если вы не знакомы с такими терминами, как Жадный подход и графики, потерпите некоторое время, и мы попытаемся объяснить все и вся в этой статье.

Концепция Алгоритма Дейкстры

Что такое Жадный подход?

Во Введении мы говорили вам, что алгоритм Дейкстры работает на жадном подходе, так что же это за Жадный подход?

С точки зрения непрофессионалов, Жадный подход-это стратегия, в которой мы выбираем наилучший из возможных вариантов, предполагая, что он приведет нас к наилучшему решению.

Подумайте об этом таким образом, мы выбрали лучшее решение в тот момент, не задумываясь о последствиях в будущем.

Описание алгоритма Дейкстры

Шаг 1: Создайте временный граф, который хранит значение исходного графа, и назовите его не посещенным графом. Кроме того, инициализируйте список, называемый путем, чтобы сохранить кратчайший путь между источником и целью.

Алгоритм Дейкстры python
Алгоритм Дейкстры python

Шаг 2: Нам нужно вычислить минимальное расстояние от исходного узла до каждого узла.

Первоначально отметьте total_distance для каждого узла как бесконечность ( ∞ ), а исходный узел отметьте total_distance как 0, так как расстояние от исходного узла до исходного узла равно 0. Кроме того, отметьте этот исходный узел как current_node.

Алгоритм Дейкстры python
Алгоритм Дейкстры python

Исходный узел/current_node-это “A”, отметьте его как 0.

Шаг 3: Из current_node выберите соседние узлы (узлы, которые непосредственно связаны) в любом случайном порядке. Проверьте, является ли текущее значение этого узла (изначально оно будет (∞)) выше (значение current_node + значение ребра, соединяющего этот соседний узел с current_node ).

Если да, то замените важность этого соседнего узла значением current_node + значением ребра, соединяющего этот соседний узел с current_node. Повторите этот процесс для всех соседних узлов текущего узла

Алгоритм Дейкстры python
Алгоритм Дейкстры python

При C, как 2 < ∞, обновите значение C с ∞ до 2.

Алгоритм Дейкстры python
Алгоритм Дейкстры python

При B, как 5 < ∞, обновите значение B от ∞ до 5.

Шаг 4: После того, как мы обновили все соседние узлы значений текущего узла, пришло время удалить текущий узел из unvisited_nodes.

Из всех тех узлов, которые были соседями текущего узла, сосед выбрал сосед с минимальным расстоянием и установил его как current_node.

Алгоритм Дейкстры python
Алгоритм Дейкстры python

При 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”>расстояние от исходного узла до целевого узла.

Алгоритм Дейкстры python
Алгоритм Дейкстры python

Когда мы снова приходим к D (на этот раз путь A->B ->D), значение D становится 8.

Алгоритм Дейкстры python
Алгоритм Дейкстры python

Наконец, после 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 для поиска кратчайшего маршрута между одним источником и другим мы используем алгоритм Дейкстры. Другое приложение находится в сети, где оно помогает в отправке пакета от источника к месту назначения.

Попробуйте запустить программы на вашей стороне и дайте нам знать, если у вас есть какие-либо вопросы.

Счастливого кодирования!