Алгоритм
Форда-Фалкерсона.
Впервые
был предложен в 1956г. До этого времени задача решалась с помощью методов
линейного программирования, что было крайне не эффективно. Алгоритм является
псевдополиномиальным и имеет оценку O(nm log U),
где m = |E|, n = |V|, U = max(Cij).
Алгоритм
начинает свою работу с нулевого потока и на каждой своей итерации увеличивает
поток в сети. На каждом шаге находится увеличивающая величину потока цепь.
Поток увеличивается вдоль дуг этой цепи, пока она не станет насыщенной.
Увеличивающей
цепью является цепь из источника в сток, все дуги которой допустимы. Дугу из
вершины a в вершину b назовем допустимой, если
выполняется одно из следующих условий:
1.
f(e) < c(e) и дуга согласованна
2.
f(e) > 0 и дуга
несогласованна
По
увеличивающей цепи можно пустить поток величины Q, где Q = min{q(ei), 1 ≤ i ≤ l} и q(e) =
{с(e) – f(e), если дуга согласованна, f(e), если дуга не согласованна}. Для
того, чтобы увеличить величину потока сети на Q,
необходимо увеличить на Q
поток на каждой согласованной дуге цепи и уменьшить на каждой несогласованной.
В
своей работе [3] Форд и Фалкерсон (Ford and Fulkerson) доказали, что поток в
сети, для которой нельзя построить увеличивающую цепь, является максимальным.
Для
нахождения увеличивающей цепи ими был предложен “Метод расстановки пометок”.
Процесс расстановки меток начинается в источнике сети и заканчивается в ее
стоке. Как только сток оказался помеченным, мы можем говорить о существовании
увеличивающей цепи из источника в сток. Метка, “наносимая” на вершины сети,
содержит необходимый минимум информации, достаточный для того, чтобы
восстановить эту цепь и определить величину, на которую можно изменить поток в
ней. Вершина сети может находиться в одном из 3-х состояний: “непомеченная”,
“помеченная” и “просмотренная”.
Этап 1. Расстановка меток.
Все
вершины получают статус непомеченных.
Процедура расстановки меток.
Возьмем
произвольный помеченный, но не просмотренный узел x. Пусть он имеет пометку [i, +, e(x)], где i
– вершина из которой был помечен x; флаг, показывающий, что дуга (i,x) согласованна; e
– величина потока, который можно пропустить по этой дуге. Рассмотрим все непомеченные
смежные вершины y,
такие что дуга (x, y) согласованна. Пометим
вершину y меткой [x, +, e(y)], где e(y) = min{e(x) , c(x, y) – f(x, y)}. Затем рассмотрим все непомеченные
смежные вершины y,
соединенные с ней несогласованной дугой. Пометим их меткой [x, -, e(y)],
где e(y) = min{e(x), f(y,x)}.
Теперь все рассмотренные узлы y
имеют статус помеченных, а узел x
- просмотренный.
Эта
общая для всех узлов сети процедура. Пометим источник меткой [~, ~, ∞] и
будем последовательно вызывать ее для всех смежных узлов, постепенно двигаясь
по сети. Как только процедура будет вызвана для стока, будет получена
увеличивающая цепь и следует перейти ко второму этапу. В противном случае
процедура будет вызываться, пока все помеченные вершины не станут
просмотренными, и если сток сети не был достигнут – увеличивающая цепь не может
быть построена и по теореме Форда-Фалкерсона имеющийся поток сети является
максимальным.
Этап 2. Изменение потока.
Процедура
изменения потока дуги.
Возьмем узел x.
Если он имеет метку [y,
+, e], то увеличим
поток по дуге (y, x) на e. Если он имеет метку [y, -, e], то уменьшим поток по дуге (y, x) на e. Если y
не является источником, то вызовем процедуру для узла y.
Эта
процедура, будучи вызвана для стока сети, позволяет пройти по найденной увеличивающей
цепи к стоку, изменяя поток на ее дугах.
Следует
особо отметить, что узлы, имеющие статус “помеченных”, больше не участвуют в
процессе поиска увеличивающей цепи, весьма эффективно с вычислительной точки
зрения.
Алгоритм
Форда-Фалкерсона гарантирует нахождение максимального потока только в сетях с
целочисленными пропускными способностями. На практике “чистый” алгоритм
Форда-Фалкерсона не применяется, т.к. оценка его производительности зависит от
величины пропускных способностей дуг сети. Все дело в том, что в нем не дается
каких либо правил выбора увеличивающей цепи.
Рассмотрим
сеть на рис. 1. Предположим, что реализован алгоритм, отдающий предпочтение
увеличивающим цепям максимальной длины. В этом случае на первом шаге мы пустим
дополнительный поток по цепи (0,1),(1,2),(2,3).
рис. 1 рис. 2
На
втором шаге выберем цепь (0,2),(2,1),(1,3). Так как дуга (2,1) несогласованна,
величина пущенного по ней потока будет вычитаться из величины потока,
полученного на предыдущем шаге. Мы получили сеть (рис. 3) практически
эквивалентную исходной.
рис. 3
Очевидно,
что для нахождения максимального потока понадобиться 1000 итераций! В то время,
как если бы мы на первом шаге выбрали цепь (0,1),(1,3), то результат был бы
получен за одну итерацию! На практике, величина пропускных способностей часто
зависит от единиц измерения, и может принимать огромные значения. Если же
допустить иррациональные пропускные способности дуг, то можно привести пример
невычислимой сети [4]. Величина потока в такой сети не
превысит даже четверти истинного значения.
Подобная неопределенность длилась не долго, уже в начале 70-х г. были
предложены сразу 2 правила выбора увеличивающих цепей, которые существенно улучшают
алгоритм Форда-Фалкерсона.