Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину — различия между версиями
(→Пример несходящегося алгоритма) |
|||
Строка 1: | Строка 1: | ||
− | Алгоритм Форда-Фалкерсона — алгоритм, решающий задачу нахождения максимального потока в транспортной сети. | + | '''Алгоритм Форда-Фалкерсона''' — алгоритм, решающий задачу нахождения максимального потока в транспортной сети. |
== Идея == | == Идея == | ||
Строка 5: | Строка 5: | ||
== Реализация == | == Реализация == | ||
− | dfs(u, Cmin): //Cmin - пропускная способность в текущем подпотоке | + | '''function''' dfs(u, Cmin): //Cmin - пропускная способность в текущем подпотоке |
− | if (u = t) | + | '''if''' (u = t) |
− | return Cmin | + | '''return''' Cmin |
u.col = true | u.col = true | ||
− | for (v in u.children) | + | '''for''' (v in u.children) |
uv = edge(u, v) | uv = edge(u, v) | ||
− | if (!v.col) | + | '''if''' (!v.col) '''and''' (uv.f < uv.c) |
delta = dfs(v, min(Cmin, uv.c - uv.f)) | delta = dfs(v, min(Cmin, uv.c - uv.f)) | ||
− | if (delta > 0) | + | '''if''' (delta > 0) |
uv.f += delta | uv.f += delta | ||
uv.backEdge.f -= delta | uv.backEdge.f -= delta | ||
− | return delta | + | '''return''' delta |
− | return 0 | + | '''return''' 0 |
== Оценка производительности == | == Оценка производительности == | ||
Строка 25: | Строка 25: | ||
=== Пример несходящегося алгоритма === | === Пример несходящегося алгоритма === | ||
[[Файл:F-f.5.png|thumb|right|рис. 1]] | [[Файл:F-f.5.png|thumb|right|рис. 1]] | ||
− | Рассмотрим приведённую справа сеть с источником <tex>\ s</tex>, стоком <tex>\ t</tex>, пропускными способностями рёбер <tex>\ e_1</tex>, <tex>\ e_2</tex> и <tex>\ e_3</tex> соответственно <tex>\ 1</tex>, <tex>r= | + | Рассмотрим приведённую справа сеть с источником <tex>\ s</tex>, стоком <tex>\ t</tex>, пропускными способностями рёбер <tex>\ e_1</tex>, <tex>\ e_2</tex> и <tex>\ e_3</tex> соответственно <tex>\ 1</tex>, <tex>r=\dfrac{\sqrt{5}-1}{2}</tex> и <tex>\ 1</tex> и пропускной способностью всех остальных рёбер, равной целому числу <tex>M \geqslant 2</tex>. Константа <tex>\ r</tex> выбрана так, что <tex>\ r^2 = 1 - r</tex>. Мы используем пути из остаточного графа, приведённые в таблице, причём <tex>\ p_1 = \{ s, v_4, v_3, v_2, v_1, t \}</tex>, <tex>\ p_2 = \{ s, v_2, v_3, v_4, t \}</tex> и <tex>\ p_3 = \{ s, v_1, v_2, v_3, t \}</tex>. |
{| class="wikitable" style="text-align: center" | {| class="wikitable" style="text-align: center" |
Версия 14:39, 24 января 2016
Алгоритм Форда-Фалкерсона — алгоритм, решающий задачу нахождения максимального потока в транспортной сети.
Содержание
Идея
Идея алгоритма заключается в следующем. Изначально величине потока присваивается значение обхода в глубину (dfs). Процесс повторяется, пока можно найти увеличивающий путь.
: для всех из . Затем величина потока итеративно увеличивается посредством поиска увеличивающего пути (путь от источника s к стоку t, вдоль которого можно послать ненулевой поток). В данной статье рассматривается алгоритм, осуществляющий этот поиск с помощьюРеализация
function dfs(u, Cmin): //Cmin - пропускная способность в текущем подпотоке if (u = t) return Cmin u.col = true for (v in u.children) uv = edge(u, v) if (!v.col) and (uv.f < uv.c) delta = dfs(v, min(Cmin, uv.c - uv.f)) if (delta > 0) uv.f += delta uv.backEdge.f -= delta return delta return 0
Оценка производительности
Добавляя поток увеличивающего пути к уже имеющемуся потоку, максимальный поток будет получен, когда нельзя будет найти увеличивающий путь. Тем не менее, если величина пропускной способности — иррациональное число, то алгоритм может работать бесконечно. В целых числах таких проблем не возникает и время работы ограничено
, где — число рёбер в графе, — максимальный поток в графе, так как каждый увеличивающий путь может быть найден за и увеличивает поток как минимум на .
Пример несходящегося алгоритма
Рассмотрим приведённую справа сеть с источником
, стоком , пропускными способностями рёбер , и соответственно , и и пропускной способностью всех остальных рёбер, равной целому числу . Константа выбрана так, что . Мы используем пути из остаточного графа, приведённые в таблице, причём , и .Шаг | Найденный путь | Добавленный поток | Остаточные пропускные способности | ||
---|---|---|---|---|---|
Заметим, что после шага
, как и после шага , остаточные способности рёбер , и имеют форму , и , соответственно, для какого-то натурального . Это значит, что мы можем использовать увеличивающие пути , , и бесконечно много раз, и остаточные пропускные способности этих рёбер всегда будут в той же форме. Полный поток после шага равен . За бесконечное время полный поток сойдётся к , тогда как максимальный поток равен . Таким образом, алгоритм не только работает бесконечно долго, но даже и не сходится к оптимальному решению.Пример медленной работы алгоритма Форда-Фалкерсона с использованием поиска в глубину по сравнению с реализацией, использующей поиск в ширину
При использовании поиска в ширину алгоритму потребуется всего лишь два шага. Дана сеть (рис. 2).
Благодаря двум итерациям (рис. 3 и рис. 4)
рёбра
насытились лишь на . Конечная сеть будет получена ещё через 1998 итераций (рис. 5).См. также
Источники информации
- Википедия: Алгоритм Форда — Фалкерсона
- Томас Х. Кормен и др. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1