Jump to content

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

Метод Форда-Фалкерсона или алгоритм Форда-Фалкерсона ( 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 максимального значения.
  1. для всех краев
  2. Хотя существует путь p от s до t в , такой, что для всех краев :
    1. Находить
    2. Для каждого края
      1. ( Отправить поток по пути )
      2. ( Поток может быть «возвращен» позже )
  • « ←» означает присвоение . Например, « самый большой элемент » означает, что значение самого большого изменяется на значение элемента .
  • « return » завершает алгоритм и выводит следующее значение.

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

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

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


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

Сложность

[ редактировать ]

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

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

Пример целочисленного потока

[ редактировать ]

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

Шаг Проточная сеть
Начальная проточная сеть.
Поток направляется по увеличивающему пути . Здесь узким местом является край, поэтому возможна только одна единица потока.
Здесь одна единица потока направляется по увеличивающему пути. . В этом случае поток «отталкивается» от к . Поток в которое изначально пришло из теперь происходит от , и теперь можно свободно отправлять поток в напрямую. В результате край остается с нулевым потоком, но общий поток увеличивается на единицу.
Промежуточные этапы 1998 года здесь опущены.
Конечная проточная сеть с общим потоком 2000 единиц.

Незавершающийся пример

[ редактировать ]

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

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

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

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

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

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Лаунг-Тернг Ван, Яо-Вэнь Чанг, Кван-Тин (Тим) Ченг (2009). Автоматизация электронного проектирования: синтез, проверка и тестирование . Морган Кауфманн. стр. 204 . ISBN  978-0080922003 . {{cite book}}: CS1 maint: несколько имен: список авторов ( ссылка )
  2. ^ Томас Х. Кормен; Чарльз Э. Лейзерсон; Рональд Л. Ривест; Клиффорд Стейн (2009). Введение в алгоритмы . С Прессой. стр. 714 . ISBN  978-0262258104 .
  3. ^ Форд, LR ; Фулкерсон, Д.Р. (1956). «Максимальный поток через сеть» (PDF) . Канадский математический журнал . 8 : 399–404. дои : 10.4153/CJM-1956-045-5 . S2CID   16109790 .
  4. ^ «Алгоритм маркировки максимального потока Форда-Фалкерсона». 1998. CiteSeerX   10.1.1.295.9049 .
  5. ^ Цвик, Ури (21 августа 1995 г.). «Наименьшие сети, в которых процедура максимального потока Форда – Фулкерсона может не завершиться» . Теоретическая информатика . 148 (1): 165–170. дои : 10.1016/0304-3975(95)00022-О .
[ редактировать ]

СМИ, связанные с алгоритмом Форда-Фалкерсона, на Викискладе?

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 45a9dbc1d884b0e583bf2901fa90212e__1717093320
URL1:https://arc.ask3.ru/arc/aa/45/2e/45a9dbc1d884b0e583bf2901fa90212e.html
Заголовок, (Title) документа по адресу, URL1:
Ford–Fulkerson algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)