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

Почему теория графика настолько удивительная? – Часть 4, работа с весами и Dijkstra

В окончании предыдущей статьи мы сказали, что по ширине – первый поиск может быть изменен для получения CO … Теги с теорией графика, информатики, алгоритмы, Python.

В концом Предыдущая статья Мы сказали, что широта – первый поиск может быть изменен для получения совершенно другого поведения. Сегодня мы увидим, как именно мы можем изменить BFS для получения совершенно нового алгоритма. Во-первых, мы должны ввести уверенное поведение по графику. Это последние статьи в этой мини-серии Почему теория графика настолько удивительная? На следующей неделе мы собираемся исследовать еще один интересный вычислительный предмет!

Взвешенные графики

Взвешенный график представляет собой график, в котором каждый край имеет прикрепленный вес (или стоимость) к нему.

Например, график выше, пусть его будет называться G представляет собой взвешенный график: край (2, 5) имеет вес 10, край (1,3) Имеет вес 15 и так далее.

С практической точки зрения взвешенный график может означать сеть дорог, с каждым преимуществом, представляющим расстояние между двумя городами, или, работая с живыми данными, своего рода коэффициент времени, который может быть затронут событиями трафика – несчастные случаи, обслуживание Работа и так далее.

Теперь мы можем задать следующий вопрос: как мы можем пойти от узла Я на узел J с минимальными затратами?

Вычисления кратчайшего пути

Один популярный алгоритм для вычисления кратчайшего пути от узла к другому называется Алгоритм Dijkstra После голландского компьютерного ученого (среди прочего) Edsger Wybe Dijkstra. В интервью, указанном в 2001 году, Dijkstra заявила, что алгоритм был разработан без ручки и бумаги, сидя в кафе с женихом. Алгоритм следует довольно упрощенным и элегантным подходом. Мы можем рассмотреть это брат из широта первого поиска, из которых я дал более подробный обзор Эта статья Отказ Основное отличие – это порядок, в котором алгоритм посещает узлы: вместо расширения узлов в Порядок, в котором они были помещены в очередь, в первом месте, в первую очередь Алгоритм вспоминает, для каждого узла стоимость, с которыми она была достигнута, Расширение узлов, достигнутых с более низкой стоимостью первым Отказ

Пусть начальный узел называется Начать и узел, к которому мы хотим найти стоимость быть называемым Готово Отказ Пусть Стоимость быть массивом, который содержит стоимость для достижения каждого из N Узлы на нашем графике. Формально алгоритм должен следовать следующим шагам:

  1. Отметьте все узлы как невизмы; Более того, отметьте стоимость узла Начать с 0 и стоимость, чтобы добраться до любого другого узла с очень высоким значением; поставить Начать в очереди.
  2. Пока в очереди есть узлы, и мы не нашли стоимость для Готово узел:

    • Поп-узел из очереди, пусть его называют U Отказ
    • Если узел уже был посещен (т. Е. Мы могли бы добраться до него из нескольких направлений, поэтому мы помещаем его в очередь несколько раз, с разные затраты ), нет необходимости ввести его снова, как у нас есть уже расширил лучший способ достичь его; Продолжайте алгоритм.
    • Если узел еще не посетил, поиск по соседям; для любого соседа Я мы проверяем ли из U может улучшить ее стоимость (I. e., Если текущая стоимость добраться до Я больше, чем стоимость, чтобы добраться до U Плюс стоимость края (ты, я) ; Если это так, положите Я в очереди, с соответствующей стоимостью.

      • После взгляда на все соседи U Марк U Как посещалось и вернитесь к 2 .

Теперь, давайте будем работать в направлении реализации алгоритма ДижКСТРА.

Представление взвешенных графов в памяти

Вы можете вспомнить Adjectency_list.py Файл мы написали для первой статьи. Для того, чтобы этот график «упаковка» для обработки взвешенных графиков нам нужно изменить два фундаментальных веща в его структуре:

  1. Для узла Я , каждая запись в своем списке соседей теперь должна вспомнить кортеж: узел, который оно ведет и стоимость края.
  2. IS_Valid_Tuple Функция, которую мы использовали для проверки ввода пользователя, должны быть изменены только для проверки только двух элементов узлов кортежа; В частности, эта строка должна быть изменена: Длина кортежа должна быть изменена до 3, и, как вы видите, мы использовали встроенный Python Все () Функция для проверки узлов. Мы можем изменить наш итеративный, х , чтобы вернуть только первые два элемента, изменив его на х [0: 2] Отказ Этот синтаксис Python называется расширенным нарезкой. При использовании это как [Пуск: остановка] он возвращает счетчик объекта, содержащий элементы из Запуск индекса к Индекс Стоп-1 от того, что мы применили синтаксис. Наконец, наша линия станет:

Еще одна вещь, которую мы должны учитывать, – это способ, которым мы полностью извлекаем результат нашего пути самого низкого затрат, на каждом этапе алгоритма (мы рассмотрим график G с N Узлы):

  • Мы можем использовать обычный массив для построения очереди наших кандидатов и просматривать все его записи каждый раз – это N Записи, для каждого кандидата на нашем кратчайшем пути.
  • Мы можем оптимизировать время выполнения, используя соответствующую структуру данных: A Двоичная куча , с логарифмической минимальной добычей и вставкой – делать примерно log (n) Операции для каждого кратчайшего кандидата пути.

К счастью, библиотека Python содержит Приоритеткую Коллекция, которая удовлетворяет нашим потребностям для реализации более быстрых варианта Dijkstra, если мы не слишком заинтересованы в реализации структуры данных, такие как сами.

Алгоритм, который я описал ниже, только дает нам Стоимость пути, но не с самой дорогой. Тем не менее, мы можем вычислить его просто просто, если каждый раз мы вычислили лучший кандидат на стоимость пути, мы запомним бы «родительский» узел, узел, который мы расширили, чтобы добраться туда, в дополнение к себе. Затем мы можем использовать рекурсию, чтобы перейти от «родительского» на «родитель» и напечатайте узлы, которые мы сталкиваемся с последующими рекурсивными вызовами.

Ниже приведена модифицированная версия обработки графа, а также реализация алгоритма:

Фрагмент выводит наименьшую стоимость пути как 7, с маршрутом 1 -> 4 -> 3, когда мы хотим вычислить стоимость от 1 до 3. Глядя на график, мы видим, что это действительно ответ.

Заключение

Эта статья этой недели заканчивается здесь. Это последняя запись в этой мини-серии Почему теория графика настолько удивительная? Во время которого я надеюсь, что я предложил несколько четкое изображение на том, какие графики есть и некоторые забавные способы их использования. К сожалению, субъект слишком широко, чтобы лечиться всего лишь в серии статей. На следующей неделе мы собираемся представить совершенно новый аспект информатики. До тех пор вы можете пройти время, прочитав другую статью в серии!

Оригинал: “https://dev.to/kruzzy/why-is-graph-theory-so-amazing-part-4-working-with-weights-dijkstra-450k”