Алгоритм Форда – Фулкерсона
![]() | Было предложено алгоритм Эдмондса – Карпа включить в эту статью. ( Обсудить ) Предлагается с апреля 2024 г. |
Метод Форда-Фалкерсона или алгоритм Форда-Фалкерсона ( FFA ) — это жадный алгоритм , который вычисляет максимальный поток в потоковой сети . Иногда его называют «методом», а не «алгоритмом», поскольку подход к поиску увеличивающих путей в остаточном графе не полностью определен. [1] или указано в нескольких реализациях с разным временем работы. [2] Он был опубликован в 1956 году Л.Р. Фордом-младшим и Д.Р. Фулкерсоном . [3] Название «Форд-Фалкерсон» часто также используется для алгоритма Эдмондса-Карпа , который представляет собой полностью определенную реализацию метода Форда-Фалкерсона.
Идея алгоритма заключается в следующем: пока существует путь от источника (начального узла) до приемника (конечного узла) с доступной пропускной способностью на всех ребрах пути, мы отправляем поток по одному из путей. Затем мы находим другой путь и так далее. Путь с доступной пропускной способностью называется расширяющим путем .
Алгоритм
[ редактировать ]Позволять — граф, и для каждого ребра от u до v пусть быть емкостью и быть потоком. Мы хотим найти максимальный поток от источника s к стоку t . После каждого шага алгоритма сохраняется следующее:
Ограничения мощности Поток вдоль ребра не может превышать его пропускную способность. Косая симметрия Чистый поток от u к v должен быть противоположен чистому потоку от v к u (см. пример). Сохранение потока Чистый поток к узлу равен нулю, за исключением источника, который «производит» поток, и приемника, который «потребляет» поток. Значение(ф) Поток, выходящий из s, должен быть равен потоку, приходящему в t .
Это означает, что поток через сеть является законным потоком после каждого раунда алгоритма. Определим остаточную сеть быть сетью с пропускной способностью и нет потока. Обратите внимание, что может случиться так, что поток от v к u разрешен в остаткесети, хотя в исходной сети это запрещено: если и затем .
Algorithm Ford–Fulkerson
- Входные данные с учетом сети с пропускной способностью c , узлом-источником s и узлом-приемником t
- Выходные данные Вычислить поток f от s до t максимального значения.
- для всех краев
- Хотя существует путь p от s до t в , такой, что для всех краев :
- Находить
- Для каждого края
- ( Отправить поток по пути )
- ( Поток может быть «возвращен» позже )
- « ←» означает присвоение . Например, « самый большой ← элемент » означает, что значение самого большого изменяется на значение элемента .
- « return » завершает алгоритм и выводит следующее значение.
Путь на шаге 2 можно найти, например, с помощью поиска в ширину (BFS) или поиска в глубину в . Первый известен как алгоритм Эдмондса-Карпа .
Если больше путей на шаге 2 не найдено, s не сможет достичь t в остатке.сеть. Если S — набор узлов, достижимых для s в остаточной сети, то общее количествопропускная способность исходной сети ребер от S до остатка V с одной стороныравный общему потоку, который мы нашли от s до t ,и, с другой стороны, служит верхней границей для всех таких потоков.Это доказывает, что найденный нами поток является максимальным. См. также Теорему о максимальном потоке и минимальном разрезе .
Если график имеет несколько источников и стоков, мы действуем следующим образом:Предположим, что и . Добавить новый источник с краем от к каждому узлу , с емкостью . И добавить новую раковину с краем из каждого узла к , с емкостью . Затем примените алгоритм Форда – Фулкерсона.
Кроме того, если узел u имеет ограничение пропускной способности , заменим этот узел двумя узлами , и край , с емкостью . Затем примените алгоритм Форда – Фулкерсона.
Сложность
[ редактировать ]Добавляя путь увеличения потока к потоку, уже установленному на графике, максимальный поток будет достигнут, когда на графике больше не будет путей увеличения потока. Однако нет уверенности в том, что такая ситуация когда-либо наступит, поэтому лучшее, что можно гарантировать, — это то, что ответ будет правильным в случае завершения алгоритма. В случае, если алгоритм работает вечно, поток может даже не сходиться к максимальному потоку. Однако такая ситуация возникает только при нерациональных значениях расхода. [4] Когда мощности являются целыми числами, время работы Форда – Фулкерсона ограничено (см. большое обозначение O ), где количество ребер в графе и — максимальный поток на графике. Это связано с тем, что каждый дополняющий путь можно найти в время и увеличивает поток на целое число, по крайней мере, , с верхней границей .
Разновидностью алгоритма Форда-Фалкерсона с гарантированным завершением и временем выполнения, не зависящим от максимального значения потока, является алгоритм Эдмондса-Карпа , который работает в время.
Пример целочисленного потока
[ редактировать ]В следующем примере показаны первые шаги Форда-Фалкерсона в потоковой сети с 4 узлами, источник и тонуть . Этот пример показывает худшее поведение алгоритма. На каждом этапе только поток отправляется по сети. Если бы вместо этого использовался поиск в ширину, потребовалось бы всего два шага.
Незавершающийся пример
[ редактировать ]
Рассмотрим сеть потоков, показанную справа, с источником , раковина , мощности ребер , и соответственно , и а пропускная способность всех остальных ребер некоторое целое число . Константа был выбран так, что . Мы используем дополняющие пути согласно следующей таблице, где , и .
Шаг | Дополняющий путь | Отправленный поток | Остаточные мощности | ||
---|---|---|---|---|---|
0 | |||||
1 | |||||
2 | |||||
3 | |||||
4 | |||||
5 |
Обратите внимание, что после шага 1, как и после шага 5, остаточные емкости ребер , и находятся в форме , и , соответственно, для некоторых . Это означает, что мы можем использовать дополняющие пути , , и бесконечно много раз и остаточные емкости этих ребер всегда будут в одном и том же виде. Общий поток в сети после шага 5 равен . Если мы продолжим использовать увеличивающие пути, как указано выше, общий поток сходится к . Однако обратите внимание, что существует поток ценностей. , отправив единицы потока вдоль , 1 единица потока вдоль , и единицы потока вдоль . Следовательно, алгоритм никогда не завершается, и поток даже не сходится к максимальному потоку. [5]
Другой непрерывный пример, основанный на алгоритме Евклида, приведен в работе Backman & Huynh (2018) , где они также показывают, что время работы алгоритма Форда-Фалкерсона в наихудшем случае в сети в порядковых числах это .
Реализация Эдмондса – Карпа на Python алгоритма
[ редактировать ]import collectionsclass Graph: """ This class represents a directed graph using adjacency matrix representation. """ def __init__(self, graph): self.graph = graph # residual graph self.row = len(graph) def bfs(self, s, t, parent): """ Returns true if there is a path from source 's' to sink 't' in residual graph. Also fills parent[] to store the path. """ # Mark all the vertices as not visited visited = [False] * self.row # Create a queue for BFS queue = collections.deque() # Mark the source node as visited and enqueue it queue.append(s) visited[s] = True # Standard BFS loop while queue: u = queue.popleft() # Get all adjacent vertices of the dequeued vertex u # If an adjacent has not been visited, then mark it # visited and enqueue it for ind, val in enumerate(self.graph[u]): if (visited[ind] == False) and (val > 0): queue.append(ind) visited[ind] = True parent[ind] = u # If we reached sink in BFS starting from source, then return # true, else false return visited[t] # Returns the maximum flow from s to t in the given graph def edmonds_karp(self, source, sink): # This array is filled by BFS and to store path parent = [-1] * self.row max_flow = 0 # There is no flow initially # Augment the flow while there is path from source to sink while self.bfs(source, sink, parent): # Find minimum residual capacity of the edges along the # path filled by BFS. Or we can say find the maximum flow # through the path found. path_flow = float("Inf") s = sink while s != source: path_flow = min(path_flow, self.graph[parent[s]][s]) s = parent[s] # Add path flow to overall flow max_flow += path_flow # update residual capacities of the edges and reverse edges # along the path v = sink while v != source: u = parent[v] self.graph[u][v] -= path_flow self.graph[v][u] += path_flow v = parent[v] return max_flow
См. также
[ редактировать ]- Теорема Бержа
- Приближенная теорема о максимальном потоке и минимальном сокращении
- Маршрутизация ограничения поворота
- Алгоритм Динича
Примечания
[ редактировать ]- ^ Лаунг-Тернг Ван, Яо-Вэнь Чанг, Кван-Тин (Тим) Ченг (2009). Автоматизация электронного проектирования: синтез, проверка и тестирование . Морган Кауфманн. стр. 204 . ISBN 978-0080922003 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Томас Х. Кормен; Чарльз Э. Лейзерсон; Рональд Л. Ривест; Клиффорд Стоун (2009). Введение в алгоритмы . С Прессой. стр. 714 . ISBN 978-0262258104 .
- ^ Форд, LR ; Фулкерсон, Д.Р. (1956). «Максимальный поток через сеть» (PDF) . Канадский математический журнал . 8 : 399–404. дои : 10.4153/CJM-1956-045-5 . S2CID 16109790 .
- ^ «Алгоритм маркировки максимального потока Форда-Фалкерсона». 1998. CiteSeerX 10.1.1.295.9049 .
- ^ Цвик, Ури (21 августа 1995 г.). «Наименьшие сети, в которых процедура максимального потока Форда – Фулкерсона может не завершиться» . Теоретическая информатика . 148 (1): 165–170. дои : 10.1016/0304-3975(95)00022-О .
Ссылки
[ редактировать ]- Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Штейн, Клиффорд (2001). «Раздел 26.2: Метод Форда – Фулкерсона». Введение в алгоритмы (второе изд.). MIT Press и МакГроу-Хилл. стр. 651–664. ISBN 0-262-03293-7 .
- Джордж Т. Хайнеман; Гэри Поллис; Стэнли Селков (2008). «Глава 8: Алгоритмы сетевых потоков». Коротко об алгоритмах . Орейли Медиа . стр. 226–250. ISBN 978-0-596-51624-6 .
- Джон Кляйнберг ; Ева Тардос (2006). «Глава 7: Расширение задачи о максимальном потоке» . Алгоритм проектирования . Пирсон Образование. стр. 378–384 . ISBN 0-321-29535-8 .
- Самуэль Гутекунст (2019). МАШИНОСТРОЕНИЕ 1101 . Корнелльский университет.
- Бэкман, Спенсер; Хьюнь, Тони (2018). «Трансфинитный Форд – Фулкерсон в конечной сети». Вычислимость . 7 (4): 341–347. arXiv : 1504.04363 . дои : 10.3233/COM-180082 . S2CID 15497138 .
Внешние ссылки
[ редактировать ]- Учебное пособие, объясняющее метод Форда – Фулкерсона для решения проблемы максимального потока.
- Еще одна Java-анимация
- Приложение Java Web Start
СМИ, связанные с алгоритмом Форда-Фалкерсона, на Викискладе?