Алгоритм Форда – Фулкерсона - Ford–Fulkerson algorithm

В Метод Форда – Фулкерсона или Алгоритм Форда – Фулкерсона (FFA) это жадный алгоритм который вычисляет максимальный поток в проточная сеть. Иногда его называют «методом», а не «алгоритмом», так как подход к поиску дополнительных путей в остаточном графе не полностью определен.[1] или он указан в нескольких реализациях с разным временем работы.[2] Он был опубликован в 1956 г. Л. Р. Форд-младший и Д. Р. Фулкерсон.[3] Название «Форд – Фулкерсон» также часто используется для обозначения Алгоритм Эдмондса – Карпа, который является полностью определенной реализацией метода Форда – Фулкерсона.

Идея алгоритма заключается в следующем: пока существует путь от источника (начальный узел) до приемника (конечный узел) с доступной емкостью на всех ребрах пути, мы отправляем поток по одному из путей. Потом находим другой путь и так далее. Путь с доступной пропускной способностью называется расширение пути.

Алгоритм

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

Ограничения мощностиПоток по ребру не может превышать его пропускную способность.
Косая симметрияЧистый поток от ты к v должен быть противоположен чистому потоку из v к ты (см. пример).
Сохранение потокаЧистый поток к узлу равен нулю, за исключением источника, который «производит» поток, и стока, который «потребляет» поток.
Значение (f)Поток, уходящий из s должен быть равен потоку, приходящему на т.

Это означает, что поток через сеть юридический поток после каждого раунда в алгоритме. Мы определяем остаточная сеть быть сетью с пропускной способностью и никакого потока. Обратите внимание, что может случиться так, что поток из v к ты разрешено в остаточной сети, но запрещено в исходной сети: если и тогда .

Алгоритм Форд – Фулкерсон
Входы Учитывая сеть с пропускной способностью c, исходный узел s, и приемный узел т
Вывод Вычислить поток ж от s к т максимальной стоимости
  1. для всех краев
  2. Пока есть путь п от s к т в , так что для всех краев :
    1. найти
    2. Для каждого края
      1. (Отправьте поток по пути)
      2. (Поток может быть "возвращен" позже)
  • «←» означает назначение. Например, "самый большойпредмет"означает, что стоимость самый большой изменяет стоимость предмет.
  • "вернуть"завершает алгоритм и выводит следующее значение.

Путь на шаге 2 можно найти, например, с помощью поиск в ширину (BFS) или поиск в глубину в . Если вы используете первое, алгоритм называется Эдмондс-Карп.

Когда больше нет путей на шаге 2, s не сможет добраться т в остаточной сети. Если S это набор узлов, достижимых s в остаточной сети, то общая емкость в исходной сети ребер из S к остатку V с одной стороны, равна общему потоку, который мы нашли из s к т, а с другой стороны, служит верхней границей для всех таких потоков, что доказывает, что найденный поток максимален. Смотрите также Теорема о максимальном расходе и минимальном разрезе.

Если график имеет несколько источников и приемников, мы действуем следующим образом: Предположим, что и . Добавить новый источник с краю от к каждому узлу , с емкостью . И добавить новую раковину с краю из каждого узла к , с емкостью . Затем примените алгоритм Форда – Фулкерсона.

Также, если узел ты имеет ограничение мощности , мы заменяем этот узел двумя узлами , и край , с емкостью . Затем примените алгоритм Форда – Фулкерсона.

Сложность

Путем добавления пути увеличения потока к потоку, уже установленному на графике, максимальный поток будет достигнут, когда на графике больше не будет путей увеличения потока. Однако нет уверенности в том, что эта ситуация когда-либо будет достигнута, поэтому лучшее, что можно гарантировать, - это то, что ответ будет правильным, если алгоритм завершится. В случае, если алгоритм работает вечно, поток может даже не сходиться к максимальному потоку. Однако такая ситуация возникает только при иррациональных значениях расхода.[нужна цитата ] Когда емкости являются целыми числами, время выполнения Форда – Фулкерсона ограничено (увидеть нотация большой O ), где - количество ребер в графе и - максимальный поток на графике. Это потому, что каждый путь увеличения можно найти в времени и увеличивает поток на целое число не менее , с верхней границей .

Вариантом алгоритма Форда – Фулкерсона с гарантированным завершением и временем выполнения, не зависящим от максимального значения потока, является алгоритм Алгоритм Эдмондса – Карпа, который работает в время.

Интегральный пример

В следующем примере показаны первые шаги Форда – Фулкерсона в потоковой сети с 4 узлами, источник и тонуть . Этот пример показывает наихудшее поведение алгоритма. На каждом этапе только поток отправляется по сети. Если бы вместо этого использовался поиск в ширину, потребовалось бы всего два шага.

ДорожкаВместимостьРезультирующая поточная сеть
Сеть начального потокаПример Форда-Фулкерсона 0.svg
Ford-Fulkerson, пример 1.svg
Ford-Fulkerson, пример 2. svg
После 1998 года больше шагов ...
Сеть конечного потокаПример Форда-Фулкерсона final.svg

Обратите внимание, как поток "отталкивается" от к при поиске пути .

Пример без завершения

Форд-Фулкерсон forever.svg

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

ШагРасширение путиОтправленный потокОстаточные мощности
0
1
2
3
4
5

Обратите внимание, что после шага 1, а также после шага 5 остаточные мощности ребер , и находятся в форме , и соответственно для некоторых . Это означает, что мы можем использовать дополнительные пути , , и бесконечно много раз, и остаточные емкости этих ребер всегда будут в одном и том же виде. Общий поток в сети после шага 5 составляет . Если мы продолжим использовать дополнительные пути, как указано выше, общий поток сходится к . Однако обратите внимание, что существует поток стоимости , отправив единиц потока по , 1 ед. Потока по , и единиц потока по . Следовательно, алгоритм никогда не завершается, и поток даже не сходится к максимальному потоку.[4]

Другой пример без завершения, основанный на Евклидов алгоритм дан кем-то Бакман и Хюин (2018), где они также показывают, что в худшем случае время работы алгоритма Форда-Фулкерсона в сети в порядковые номера является .

Реализация Python Эдмондс-Карп алгоритм

импорт коллекциикласс График:    "" "Этот класс представляет ориентированный граф, использующий представление матрицы смежности." ""    def __в этом__(я, график):        я.график = график  # остаточный график        я.ряд = len(график)    def бойфренды(я, s, т, родитель):        "" "Возвращает истину, если существует путь от источника 's' к 't' в        остаточный граф. Также заполняет parent [] для хранения пути. "" "        # Пометить все вершины как непосещенные        посетил = [Ложь] * я.ряд        # Создаем очередь для BFS        очередь = коллекции.дек()        # Отметить исходный узел как посещенный и поставить его в очередь        очередь.добавить(s)        посетил[s] = Правда        # Стандартный цикл BFS        в то время как очередь:            ты = очередь.поплефт()            # Получить все смежные вершины исключенной из очереди вершины u            # Если соседний еще не был посещен, отметьте его            # посетил и поставил в очередь            для инд, вал в перечислять(я.график[ты]):                если (посетил[инд] == Ложь) и (вал > 0):                    очередь.добавить(инд)                    посетил[инд] = Правда                    родитель[инд] = ты        # Если мы достигли стока в BFS, начиная с источника, то возвращаем        # истина, иначе ложь        вернуть посетил[т]    # Возвращает максимальный поток от s до t в заданном графике    def edmonds_karp(я, источник, тонуть):        # Этот массив заполняется BFS и хранит путь        родитель = [-1] * я.ряд        max_flow = 0  # Изначально нет потока        # Увеличиваем поток, пока есть путь от источника до стока        в то время как я.бойфренды(источник, тонуть, родитель):            # Найти минимальную остаточную пропускную способность ребер вдоль            # путь заполнен BFS. Или мы можем сказать, найти максимальный поток            # по найденному пути.            path_flow = плавать(«Инф»)            s = тонуть            в то время как s != источник:                path_flow = мин(path_flow, я.график[родитель[s]][s])                s = родитель[s]            # Добавить поток пути к общему потоку            max_flow += path_flow            # обновить остаточные мощности кромок и обратных кромок            # по пути            v = тонуть            в то время как v != источник:                ты = родитель[v]                я.график[ты][v] -= path_flow                я.график[v][ты] += path_flow                v = родитель[v]        вернуть max_flow

Смотрите также

Заметки

  1. ^ Лаунг-Тернг Ван, Яо-Вэнь Чанг, Кван-Тинг (Тим) Ченг (2009). Автоматизация электронного проектирования: синтез, проверка и тестирование. Морган Кауфманн. стр.204. ISBN  0080922007.CS1 maint: несколько имен: список авторов (ссылка на сайт)
  2. ^ Томас Х. Кормен; Чарльз Э. Лейзерсон; Рональд Л. Ривест; Клиффорд Штайн (2009). Введение в алгоритмы. MIT Press. стр.714. ISBN  0262258102.
  3. ^ Форд, Л. Р.; Фулкерсон, Д. (1956). «Максимальный поток через сеть» (PDF). Канадский математический журнал. 8: 399–404. Дои:10.4153 / CJM-1956-045-5.
  4. ^ Цвик, Ури (21 августа 1995 г.). «Наименьшие сети, в которых процедура максимального потока Форда – Фулкерсона может не завершиться». Теоретическая информатика. 148 (1): 165–170. Дои:10.1016 / 0304-3975 (95) 00022-О.

использованная литература

внешние ссылки

СМИ, связанные с Алгоритм Форда-Фулкерсона в Wikimedia Commons