Алгоритм Форда – Фулкерсона
![]() | Было предложено алгоритм Эдмондса – Карпа включить в эту статью. ( Обсудить ) Предлагается с апреля 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 collections
class 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
СМИ, связанные с алгоритмом Форда-Фалкерсона, на Викискладе?