~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 643747EA93C05F4CE4AC39DBE14C04A8__1717962960 ✰
Заголовок документа оригинал.:
✰ Bellman–Ford algorithm - Wikipedia ✰
Заголовок документа перевод.:
✰ Алгоритм Беллмана-Форда — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/64/a8/643747ea93c05f4ce4ac39dbe14c04a8.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/64/a8/643747ea93c05f4ce4ac39dbe14c04a8__translat.html ✰
Дата и время сохранения документа:
✰ 20.06.2024 02:39:01 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 9 June 2024, at 22:56 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Алгоритм Беллмана-Форда — Википедия Jump to content

Алгоритм Беллмана – Форда

Из Википедии, бесплатной энциклопедии
(Перенаправлено из алгоритма кратчайшего пути )
Алгоритм Беллмана – Форда
Сорт Задача о кратчайшем пути с одним источником (для взвешенных ориентированных графов)
Структура данных График
Худшая производительность
Лучшая производительность
Наихудшая пространственная сложность

Алгоритм Беллмана-Форда — это алгоритм , который вычисляет кратчайшие пути от одной исходной вершины ко всем остальным вершинам взвешенного орграфа . [1] Он медленнее, чем алгоритм Дейкстры для той же задачи, но более универсален, поскольку способен обрабатывать графы, в которых веса некоторых ребер являются отрицательными числами. [2] Алгоритм был впервые предложен Альфонсо Шимбелем ( 1955 ), но вместо этого назван в честь Ричарда Беллмана и Лестера Форда-младшего , которые опубликовали его в 1958 и 1956 годах соответственно. [3] Эдвард Ф. Мур также опубликовал вариант алгоритма в 1959 году , и по этой причине его также иногда называют алгоритмом Беллмана-Форда-Мура . [1]

Отрицательные веса ребер встречаются в различных приложениях графов. Вот почему этот алгоритм полезен. [4] Если граф содержит «отрицательный цикл» (т. е. цикл , сумма ребер которого дает отрицательное значение), до которого можно добраться из источника, то не существует самого дешевого пути: любой путь, имеющий точку в отрицательном цикле, можно сделать дешевле, если еще один обход негативного цикла. В таком случае алгоритм Беллмана-Форда может обнаружить и сообщить об отрицательном цикле. [1] [5]

Алгоритм [ править ]

В этом примере графа, предполагая, что A является источником, а ребра обрабатываются в наихудшем порядке, справа налево, требуется полное | V |−1 или 4 итерации для сходимости оценок расстояния. И наоборот, если ребра обрабатываются в наилучшем порядке, слева направо, алгоритм сходится за одну итерацию.

Как и алгоритм Дейкстры , Беллман-Форд действует путем релаксации , при которой приближения к правильному расстоянию заменяются лучшими, пока они в конечном итоге не достигнут решения. В обоих алгоритмах приблизительное расстояние до каждой вершины всегда является завышением истинного расстояния и заменяется минимумом его старого значения и длиной вновь найденного пути.

Однако алгоритм Дейкстры использует очередь приоритетов для жадного выбора ближайшей вершины, которая еще не была обработана, и выполняет этот процесс релаксации на всех ее исходящих ребрах; напротив, алгоритм Беллмана – Форда просто ослабляет все края и делает это времена, где — количество вершин в графе.

В каждом из этих повторений количество вершин с правильно рассчитанными расстояниями растет, из чего следует, что в конечном итоге все вершины будут иметь свои правильные расстояния. Этот метод позволяет применять алгоритм Беллмана-Форда к более широкому классу входных данных, чем алгоритм Дейкстры. Промежуточные ответы зависят от порядка ослабления ребер, но окончательный ответ остается тем же.

Беллман-Форд вбегает время , где и - количество вершин и ребер соответственно.

функция  BellmanFord(  вершины списка  ,  ребра списка  ,  вершин  источник  ) // 

     Эта реализация принимает граф, представленный 
     // списками вершин (представленных как целые числа [0..n-1]) и ребер, 
     // и заполняет два массивы (расстояние и предшественник), содержащие 
     // кратчайший путь от источника до каждой вершины 

      расстояние :=  список  размера  n 
      предшественник :=  список  размера  n 

     // Шаг 1: инициализировать граф 
     для каждой  вершины v  в  вершинах  do 
          // Инициализируем расстояние до всех вершин до бесконечности 
          расстояние[v] :=  инф 
          // И имея нулевого предшественника 
          предшественник[v]:=  ноль 
    
      // Расстояние от источника до самого себя, естественно, равно нулю 
      расстояние[источник] := 0 

      // Шаг 2: релаксация ребер многократно 
     повторяется  |V|−1  раз  : 
          для каждого  ребра (u, v)  с  весом w  в  ребрах  делать 
             , если  расстояние[u] + w < расстояние[v]  , тогда 
                  расстояние[v] := расстояние[u] + w 
                  предшественник[v] := u 

      // Шаг 3: проверка циклов отрицательного веса 
     для каждого  ребра (u, v)  с  весом w  в  ребрах сделать 
         , если  расстояние[u] + w < расстояние[v]  , тогда 
              предшественник[v] := u 
              // Существует отрицательный цикл;   найти вершину в цикле 
              посещено :=  список  размера  n,  инициализированный значением  false 
              посетил[v] :=  true 
             , пока   не  посетил[u]  сделать 
                  посетил[u] :=  true 
                  u := предшественник[u] 
              // u — вершина отрицательного цикла, находим сам цикл 
              nцикл := [и] 
              v := предшественник[u] 
              пока  v != ты  делаешь 
                  ncycle := concatenate([v], ncycle) 
                  v := предшественник[v] 
              ошибка  «График содержит цикл с отрицательным весом», ncycle 
      обратное  расстояние, предшественник 
 

Проще говоря, алгоритм инициализирует расстояние до источника равным 0, а все остальные узлы — бесконечностью. Затем для всех ребер, если расстояние до пункта назначения можно сократить, взяв ребро, расстояние обновляется до нового нижнего значения.

Ядром алгоритма является цикл, который сканирует все ребра в каждом цикле. Для каждого , в конце -я итерация из любой вершины v по следу предшественника, записанному в предшественнике , дает путь, общий вес которого не превышает distance[v] , и, кроме того, distance[v] является нижней границей длины любого пути от источника до v , который использует не более i ребер.

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

Ребро (u, v), найденное на шаге 3, должно быть достижимо из отрицательного цикла, но оно не обязательно является частью самого цикла, поэтому необходимо следовать по пути предшественников назад, пока цикл не будет обнаружен. . Приведенный выше псевдокод использует логический массив ( visited), чтобы найти вершину в цикле, но поиска для поиска вершины в цикле можно использовать любой алгоритм цикла.

Общим улучшением при реализации алгоритма является ранний возврат, когда на итерации шага 2 не удается ослабить какие-либо ребра, что означает, что все кратчайшие пути найдены и, следовательно, отрицательных циклов нет. В этом случае сложность алгоритма снижается с к где — максимальная длина кратчайшего пути в графе.

Доказательство правильности [ править ]

Корректность алгоритма можно показать по индукции : [2]

Лемма . После i повторений цикла for ,

  • если Distance( u ) не бесконечен, оно равно длине некоторого пути от s до u ; и
  • если существует путь от s до u с не более чем i ребрами, то Distance(u) — это не более длины кратчайшего пути от s до u с не более чем i ребрами.

Доказательство . Для базового случая индукции рассмотрим i=0и за мгновение до этого цикл for выполняется впервые. Тогда для исходной вершины source.distance = 0, что правильно. Для остальных вершин u , u.distance = infinity, что также верно, поскольку не существует пути от источника до u с 0 ребрами.

Для индуктивного случая сначала докажем первую часть. Рассмотрим момент, когда расстояние вершины обновляется на v.distance := u.distance + uv.weight. По индуктивному предположению u.distance— длина некоторого пути от источника до u . Затем u.distance + uv.weight — длина пути от источника до v , который следует по пути от источника до u и затем переходит в v .

Во второй части рассмотрим кратчайший путь P (их может быть несколько) от источника до v с не более чем i ребрами. Пусть u — последняя вершина перед v на этом пути. Тогда часть пути от источника до u является кратчайшим путем от источника до u с не более чем -1-м i-1 ребром, так как если бы это было не так, то должен существовать некоторый строго более короткий путь от источника до u с не более чем i ребром. 1 ребер, и затем мы могли бы добавить ребро uv к этому пути, чтобы получить путь с не более чем i ребрами, который строго короче P — противоречие. По индуктивному предположению u.distanceпосле i −1 итераций не превышает длину этого пути от источника до u . Поэтому, uv.weight + u.distanceне более длины P . я В й итерация, v.distance сравнивается с uv.weight + u.distance, и устанавливается равным ему, если uv.weight + u.distanceменьше. Следовательно, после i итераций v.distance не превышает длину P , т. е. длину кратчайшего пути от источника до v , который использует не более i ребер.

Если нет циклов с отрицательным весом, то каждый кратчайший путь посещает каждую вершину не более одного раза, поэтому на шаге 3 дальнейшие улучшения не могут быть сделаны. И наоборот, предположим, что никаких улучшений добиться невозможно. Тогда для любого цикла с вершинами v [0], ..., v [ k −1],

v[i].distance <= v[i-1 (mod k)].distance + v[i-1 (mod k)]v[i].weight

Суммируя цикл, члены v [ i ].distance и v [ i −1 (mod k )].distance сокращаются, оставляя

0 <= sum from 1 to k of v[i-1 (mod k)]v[i].weight

Т.е. каждый цикл имеет неотрицательный вес.

отрицательных циклов Нахождение

Когда алгоритм используется для поиска кратчайших путей, существование отрицательных циклов является проблемой, не позволяющей алгоритму найти правильный ответ. Однако, поскольку он завершается при обнаружении отрицательного цикла, алгоритм Беллмана-Форда можно использовать для приложений, в которых эта цель является целью - например, в отмены цикла методах при анализе сетевых потоков . [1]

Приложения в маршрутизации [ править ]

Распределенный вариант алгоритма Беллмана-Форда используется в протоколах маршрутизации с вектором расстояния , например, в протоколе информации о маршрутизации (RIP). Алгоритм является распределенным, поскольку он включает в себя несколько узлов (маршрутизаторов) в автономной системе (AS) , совокупности IP-сетей, обычно принадлежащих интернет-провайдеру. Он состоит из следующих шагов:

  1. Каждый узел вычисляет расстояния между собой и всеми другими узлами в пределах AS и сохраняет эту информацию в виде таблицы.
  2. Каждый узел отправляет свою таблицу всем соседним узлам.
  3. Когда узел получает таблицы расстояний от своих соседей, он вычисляет кратчайшие маршруты ко всем другим узлам и обновляет свою таблицу, чтобы отразить любые изменения.

Основные недостатки алгоритма Беллмана-Форда в этой ситуации заключаются в следующем:

  • Он плохо масштабируется.
  • Изменения в топологии сети не отражаются быстро, поскольку обновления распространяются по узлам.
  • Считайте до бесконечности, если сбои канала или узла делают узел недоступным для некоторого набора других узлов, эти узлы могут потратить вечность, постепенно увеличивая свои оценки расстояния до него, и тем временем могут возникнуть петли маршрутизации.


Улучшения [ править ]

Алгоритм Беллмана-Форда на практике можно улучшить (хотя и не в худшем случае), если заметить, что если итерация основного цикла алгоритма завершается без внесения каких-либо изменений, алгоритм можно немедленно завершить, поскольку последующие итерации будут больше не вносить изменений. При таком условии раннего завершения основной цикл в некоторых случаях может использовать намного меньше, чем | В | − 1 итерация, хотя худший случай алгоритма остается неизменным. Все следующие улучшения сохраняют наихудшая временная сложность.

Вариант алгоритма Беллмана-Форда, описанный Муром (1959) , уменьшает количество шагов релаксации, которые необходимо выполнить на каждой итерации алгоритма. Если вершина v имеет значение расстояния, которое не изменилось с тех пор, как в последний раз ребра из v были расслаблены, то нет необходимости расслаблять ребра из v во второй раз. Таким образом, по мере роста количества вершин с правильными значениями расстояний число исходящих ребер, которые необходимо ослаблять на каждой итерации, сокращается, что приводит к экономии времени в постоянном коэффициенте для плотных графов . Этот вариант можно реализовать, сохраняя набор вершин, исходящие ребра которых необходимо ослабить, удаляя из этой коллекции вершину, когда ее ребра ослаблены, и добавляя в коллекцию любую вершину, значение расстояния которой изменяется на шаг релаксации. В Китае этот алгоритм популяризировал Фаньдин Дуань, который заново открыл его в 1994 году, как «быстрый алгоритм кратчайшего пути». [6]

Йен (1970) описал еще одно усовершенствование алгоритма Беллмана – Форда. Его усовершенствование сначала присваивает некоторый произвольный линейный порядок всем вершинам, а затем делит множество всех ребер на два подмножества. Первое подмножество, E f , содержит все ребра ( vi , что v j ) такие, i < j ; второй, E b , содержит ребра ( vi что , v j ) такие, i > j . Каждая вершина посещается в порядке v 1 , v 2 , ..., v | В | , расслабляя каждое исходящее ребро из этой вершины в E f . Затем каждая вершина посещается в порядке v | В | , в | V |−1 , ..., v 1 , расслабляя каждое исходящее ребро из этой вершины в E b . Каждая итерация основного цикла алгоритма после первой добавляет как минимум два ребра к набору ребер, чьи расслабленные расстояния соответствуют правильным расстояниям кратчайшего пути: одно из E f и одно из E b . Эта модификация уменьшает наихудшее количество итераций основного цикла алгоритма с | В | − от 1 до . [7] [8]

Другое усовершенствование, предложенное Bannister & Eppstein (2012) , заменяет произвольный линейный порядок вершин, использованный во втором улучшении Йена, случайной перестановкой . Это изменение делает наихудший случай улучшения Йена (в котором края кратчайшего пути строго чередуются между двумя подмножествами E f и E b ) очень маловероятным. При случайно переставленном порядке вершин ожидаемое количество итераций, необходимых в основном цикле, не превышает . [8]

Примечания [ править ]

  1. ^ Перейти обратно: а б с д Банг-Дженсен и Гутин (2000)
  2. ^ Перейти обратно: а б Лекция 14 stanford.edu
  3. ^ Писатель (2005)
  4. ^ Седжвик (2002) .
  5. ^ Кляйнберг и Тардос (2006) .
  6. ^ Дуань, Фандинг (1994). «О быстром алгоритме SPFA для поиска кратчайшего пути [Об алгоритме SPFA]» . Журнал Юго-Западного университета Цзяотун 29 ( 2): 207–212.
  7. ^ Кормен и др., 4-е изд., Задача 22-1, с. 640.
  8. ^ Перейти обратно: а б Седжвика См. веб-упражнения по алгоритмам , 4-е изд., упражнения 5 и 12 (получено 30 января 2013 г.).

Ссылки [ править ]

Первоисточники [ править ]

Вторичные источники [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 643747EA93C05F4CE4AC39DBE14C04A8__1717962960
URL1:https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm
Заголовок, (Title) документа по адресу, URL1:
Bellman–Ford algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)