Алгоритм Беллмана-Форда.pptx
- Количество слайдов: 15
Алгоритм Беллмана-Форда Алгоритм маршрутизации (алгоритм Беллмана– Форда) был впервые разработан в 1969 году, как основной для сети ARPANET.
Алгоритм Беллмана–Форда — алгоритм поиска кратчайшего пути во взвешенном графе. За время O(|V| × |E|) алгоритм находит кратчайшие пути от одной вершины графа до всех остальных. В отличие от алгоритма Дейкстры, алгоритм Беллмана–Форда допускает рёбра с отрицательным весом. Предложен независимо Ричардом Беллманом и Лестером Фордом.
Максимальная пропускная способность графа Рассмотрим алгоритм Форда на примере графа изображенного на рис. 1. Допустим, у нас исток будет в 1 узле, а сток в 4 узле. Алгоритм можно разбить на три шага:
Шаг 1 Поиск произвольного пути из истока к стоку. Если такого нет, то выдаем значение максимальной пропускной способности и алгоритм завершается.
Шаг 2 Нахождение в выбранном пути ребра с минимальной пропускной способностью. Прибавляем значение этого ребра к пропускной способности, которая в начале выполнения алгоритма равна 0.
Шаг 3 Вычитание из всех значений ребер пути, значения минимального ребра этого пути. При этом само ребро обратиться в 0 и его уже нельзя учитывать в дальнейшем. Далее продолжаем с шага 1.
В начале у нас пропускная способность равна 0 (P=0). Допустим, мы нашли путь из истока 1 в сток 4 через вершины 2 и 3, т. е. весь путь можно записать как (1 -2 -3 -4). В этом пути минимальное ребро соединяет вершины 2 и 3, его значение 5, увеличиваем пропускную способность на 5 (Р=5). Вычитаем 5 из ребер соединяющих вершины 1 и 2, 2 и 3, 3 и 4. Из исходного графа у нас выпадает ребро соединяющее вершины 2 и 3.
Получился граф изображенный на рис. 2. В этом графе снова ищем произвольный путь из 1 в 4. Нашли (1 -2 -5 -4), где минимальное ребро соединяет 2 и 5, его значение 6. Увеличиваем пропускную способность на 6 (P=5+6=11).
Вычитаем 6 из всех ребер пути, выпадает ребро 2 -5 (рис. 3). На следующем шаге находим путь (1 -6 -5 -4), минимальное ребро 1 -6 равно 7, тогда P=11+7=18.
Вычитаем из ребер пути 6, при этом выпадает ребро 1 -6 и граф распадается на две компоненты рис. 4. Мы не находим пути из истока в сток и алгоритм завершается. Получаем максимальную пропускную способность из 18.
Решение задачи на графе без отрицательных циклов Дан ориентированный или неориентированный граф G со взвешенными рёбрами. Длиной пути назовём сумму весов рёбер, входящих в этот путь. Требуется найти кратчайшие пути от выделенной вершины S до всех вершин графа. Кратчайших путей может не существовать. Так как, в графе, содержащем цикл с отрицательным суммарным весом, существует сколь угодно короткий путь от одной вершины этого цикла до другой (каждый обход цикла уменьшает длину пути). Цикл, сумма весов рёбер которого отрицательна, называется отрицательным циклом.
Здесь V — множество вершин графа G, E — множество его рёбер, а w — весовая функция, заданная на ребрах графа. Внешний цикл выполняется раз, поскольку кратчайший путь не может содержать большее число ребер, иначе он будет содержать цикл, который точно можно выкинуть. Вместо массива d можно хранить всю матрицу A, но это требует O(V²) памяти. Зато при этом можно вычислить и сами кратчайшие пути, а не только их длинны.
Чтобы вычислить и сами кратчайшие пути, а не только их длины мы заведем матрицу Pij. Если элемент Aij содержит длину кратчайшего пути из s в i, содержащего j рёбер, то Pij содержит предыдущую вершину до i в одном из таких кратчайших путей (ведь их может быть несколько).
После выполнения этого алгоритма элементы содержат длины кратчайших путей от s до i с количеством ребер j, и из всех таких путей следует выбрать самый короткий. А сам кратчайший путь до вершины i с j ребрами восстанавливается так:
Граф с отрицательными циклами Алгоритм Беллмана–Форда позволяет очень просто определить, существует ли в графе G отрицательный цикл, достижимый из вершины s. Достаточно произвести внешнюю итерацию цикла не |V|-1 , a ровно |V| раз. Если при исполнении последней итерации длина кратчайшего пути до какой-либо вершины строго уменьшилась, то в графе есть отрицательный цикл, достижимый из s. На основе этого можно предложить следующую оптимизацию: отслеживать изменения в графе и, как только они закончатся, сделать выход из цикла (дальнейшие итерации будут бессмысленны).
Алгоритм Беллмана-Форда.pptx