
Алгоритм Беллмана–Форда
Алгоритм Беллмана–Форда — алгоритм поиска кратчайшего пути во взвешенном графе. За время O(|V| × |E|) алгоритм находит кратчайшие пути от одной вершины графа до всех остальных. В отличие от алгоритма Дейкстры, алгоритм Беллмана–Форда допускает рёбра с отрицательным весом.
Алгоритм носит имя двух американских учёных: Ричарда Беллмана (Richard Bellman) и Лестера Форда (Lester Ford). Форд фактически изобрёл этот алгоритм в 1956 г. при изучении другой математической задачи, подзадача которой свелась к поиску кратчайшего пути в графе, и Форд дал набросок решающего эту задачу алгоритма. Беллман в 1958 г. опубликовал статью, посвящённую конкретно задаче нахождения кратчайшего пути, и в этой статье он чётко сформулировал алгоритм в том виде, в котором он известен нам сейчас.
Алгоритм маршрутизации RIP (алгоритм Беллмана–Форда) был впервые разработан в 1969 году, как основной для сети ARPANET.
Формулировка задачи
Дан ор. или неор. граф G со взвешенными рёбрами. Длина пути - сумма весов рёбер, входящих в этот путь. Найти кратчайшие пути от выделенной вершины sдо всех вершин графа (их м. не существовать, т.к., в графе, содерж. цикл с отрицат. суммарным весом, существует сколь угодно короткий путь от одной вершины этого цикла до другой) Цикл, сумма весов рёбер которого отрицательна, называется отрицательным циклом.
А. Б.–Ф. позволяет оч. просто определить, существует ли в графе G отрицательный цикл, достижимый из вершины s. Достаточно произвести внешнюю итерацию цикла не | V | − 1, a ровно |V| раз. Если при исполнении последней итерации длина кратчайшего пути до к.-л. В-ы строго уменьшилась, то в графе есть отрицат. цикл, достижимый изs. На основе этого м. предложить след. Оптимизацию: отслеживать изменения в графе и, как только они закончатся, дальнейшие итерации будут бессмысленны. Значит м. сделать выход из цикла.
Решение задачи на графе без отрицательных циклов
Для нахождения кратчайших путей от одной вершины до всех остальных, восп-ся методом динамического программирования. Построим матрицу Aij, элементы кот. будут обозначать следующее: Aij — это длина кратчайшего пути из s в i, содержащего не более j рёбер.
Путь, содержащий 0 рёбер, существует только до вершины s.Т. о., Ai0 равно 0 при i = s, и +∞ в противном случае.
А kD[1]D[2]D[3]D[4]D[5]
1 2 3 4 5 0 6 ∞ 7 ∞
1 ∞ 6 ∞ 7 ∞ от 1 1 0 6 4 7 2
2 ∞ ∞ 1 8 -4 от след. 2 (ч. 2 и 4) 0 2 4 7 -2
3 ∞ -2 ∞ ∞ ∞ 3 0 2 4 7 -2
4 ∞ ∞ -3 ∞ 9
5 ∞ ∞ 7 ∞ ∞
Ребра перебираются по порядку
1) (2 - 3) (2 - 4) (2 - 5) (4 - 3) (4 - 5)
2) (3 - 2) (2 - 4) (2 – 5) (4 - 3) (4 - 5)
3) (5 - 3) (5 - 1) (1 - 2) (1 - 4)
Похоже на поиск в ширину от всех смежных вершин
Для заданного взвешенного ориентированного графа G= (V, Е) с истокомSи весовой функциейw: Е —»Rалгоритм Беллмана-Форда возвращает лог. значение, указыв., содержится ли в графе цикл с отрицат. весом, достижимый из истока. Если такой цикл существует, в алгоритме указывается, что решения не существует. Если же таких циклов нет, алгоритм выдает кратчайшие пути и их вес.
Procedure Bellman_Ford (G,w,S) - алгоритм Беллмана –Форда O(VE)
{в орграфе мин-ный путь из одной в-ны ко всем (ребра любые, без циклов <0)}
Initz (G,S) инициализируем граф
For i 1 to |V[G]| - 1 для всех вершин, кроме S
Do For каждого ребра (u,v) E|G|
Do Relax(u,v,w) релаксируем каждое ребро
For каждого ребра (u,v) E|G| проверяем нет ли отрицат цикла
Do If D[v] > D[u]+ w(u,v) Then Return False отрицательный цикл
Return True
В целом, а. Дейкстры, по сравнению с а. Беллмана-Форда, обеспечивает более реальную оценку ситуации в сети, более быструю реакцию на важные изменения в сети (такие, как включение новой линии связи) и уменьшает зацикливание пакетов; однако а. Дейкстры сложнее в реализации и требует в несколько раз больше памяти.