Русская Википедия:Задача о максимальном потоке
В теории оптимизации и теории графов, задача о максимальном потоке заключается в нахождении такого потока по транспортной сети, что сумма потоков из истока, или, что то же самое, сумма потоков в сток максимальна.
Задача о максимальном потоке является частным случаем более трудных задач, как например задача о циркуляции.
История
После вступления США во Вторую мировую войну в 1941 году математик Джордж Бернард Данциг поступил на работу в отдел статистического управления Военно-воздушных сил США в Вашингтоне. С 1941 по 1946 годы он возглавлял подразделение анализа боевых действий (Combat Analysis Branch), где работал над различными математическими проблемами.[1][2] Впоследствии c использованием работы Данцига задача о максимальном потоке была впервые решена в ходе подготовки воздушного моста во время блокады Западного Берлина, происходившей в 1948—1949 году.[3][4][5]
В 1951 году Джордж Данциг впервые сформулировал задачу в общем виде.[6]
В 1955 году, Лестер Форд и Шаблон:Нп2 впервые построили алгоритм, специально предназначенный для решения этой задачи. Их алгоритм получил название алгоритм Форда-Фалкерсона.[7][8]
В дальнейшем решение задачи много раз улучшалось.
В 2010 году исследователи Джонатан Кёлнер (Jonathan Kelner) и Александер Мондры (Aleksander Mądry) из МТИ вместе со своими коллегами Дэниелем Спилманом (en:Daniel Spielman) из Йельского университета и Шень-Хуа Тенем (en:Shang-Hua Teng) из Южно-Калифорнийского университета продемонстрировали очередное улучшение алгоритма, впервые за 10 лет.[3][9][10]
Определение
Дана транспортная сеть <math> N = (V, E) </math> с источником <math> s \in V</math>, стоком <math> t \in V</math> и пропускными способностями <math> c</math>.
- Величиной потока (value of flow) называется сумма потоков из источника <math> |f| = \sum_{v \in V} f_{sv}</math>. В статье «Транспортная сеть» доказано, что она равна сумме потоков в сток <math>\ \sum_{w \in V} f(w,t)</math>.
Задача о максимальном потоке заключается в нахождении такого потока, где величина потока максимальна.
Решения
Следующая таблица перечисляет некоторые алгоритмы решения задачи.
Метод | Сложность | Описание | |
---|---|---|---|
Линейное программирование | Зависит от конкретного алгоритма. Для симплекс-метода экспоненциальна. | Представить задачу о максимальном потоке как задачу линейного программирования. Переменными являются потоки по рёбрам, а ограничениями — сохранение потока и ограничение пропускной способности. | |
Алгоритм Форда-Фалкерсона | f|)</math> таких поисков. | Найти любой увеличивающий путь. Увеличить поток по всем его рёбрам на минимальную из их остаточных пропускных способностей. Повторять, пока увеличивающий путь есть. Алгоритм работает только для целых пропускных способностей. В противном случае он может работать бесконечно долго, не сходясь к правильному ответу. | |
Алгоритм Эдмондса-Карпа | V | ^2)</math> | Выполняем алгоритм Форда-Фалкерсона, каждый раз выбирая кратчайший увеличивающий путь (находится поиском в ширину). |
Алгоритм Диница | V|^2|E|)</math> или <math>O(|V| \surd |E|)</math> для единичных пропускных способностей <math>O(|V | \log(|V|))</math> с использованием динамических деревьев Слетора и Тарьяна[11] | Усовершенствование алгоритма Эдмондса-Карпа (но хронологически был найден раньше). На каждой итерации, используя поиск в ширину, определяем расстояния от источника до всех вершин в остаточной сети. Строим граф, содержащий только такие рёбра остаточной сети, на которых это расстояние растёт на 1. Исключаем из графа все тупиковые вершины с инцидентными им рёбрами, пока все вершины не станут нетупиковыми. (Тупиковой называется вершина, кроме источника и стока, в которую не входит ни одно ребро или из которой не исходит ни одного ребра.) На получившемся графе отыскиваем кратчайший увеличивающий путь (им будет любой путь из s в t). Исключаем из остаточной сети ребро с минимальной пропускной способностью, снова исключаем тупиковые вершины, и так пока увеличивающий путь есть. |
Алгоритм проталкивания предпотока | V|^2|E|)</math> | Вместо потока оперирует с предпотоком. Отличие в том, что для любой вершины u, кроме источника и стока, сумма входящих в неё потоков для потока должна быть строго нулевой (условие сохранения потока), а для предпотока — неотрицательной. Эта сумма называется избыточным потоком в вершину, а вершина с положительным избыточным потоком называется переполненной. Кроме того, для каждой вершины алгоритм сохраняет дополнительную характеристику, высоту, являющуюся целым неотрицательным числом. Алгоритм использует две операции: проталкивание, когда поток по ребру, идущему из более высокой в более низкую вершину, увеличивается на максимально возможную величину, и подъём, когда переполненная вершина, проталкивание из которой невозможно из-за недостаточной высоты, поднимается. Проталкивание возможно, когда ребро принадлежит остаточной сети, ведёт из более высокой вершины в более низкую, и исходная вершина переполнена. Подъём возможен, когда поднимаемая вершина переполнена, но ни одна из вершин, в которые из неё ведут рёбра остаточной сети, не ниже её. Он совершается до высоты на 1 большей, чем минимальная из высот этих вершин. Изначально высота источника V, по всем рёбрам, исходящим из источника, течёт максимально возможный поток, а остальные высоты и потоки нулевые. Операции проталкивания и подъёма выполняются до тех пор, пока это возможно. | |
Алгоритм «поднять в начало» | V|^3)</math> или <math>O(|V | \log(|V|^2/|E|))</math> с использованием динамических деревьев | Вариант предыдущего алгоритма, специальным образом определяющий порядок операций проталкивания и подъёма. |
Алгоритм двоичного блокирующего потока Шаблон:Ref | E| \min\{|V|^{2/3}, \surd{|E|}\} \log(|V|^2/|E|) \log(\max|f|))</math> |
Для более подробного списка, см. Шаблон:Ref и Список алгоритмов нахождения максимального потока.
Теорема о целом потоке
Если пропускные способности целые, максимальная величина потока тоже целая.
Теорема следует, например, из теоремы Форда—Фалкерсона.
Обобщения, сводящиеся к исходной задаче
Некоторые обобщения задачи о максимальном потоке легко сводятся к исходной задаче.
Произвольное число источников и/или стоков
Если источников больше одного, добавляем новую вершину S, которую делаем единственным источником. Добавляем рёбра с бесконечной пропускной способностью от S к каждому из старых источников.
Аналогично, если стоков больше одного, добавляем новую вершину T, которую делаем единственным стоком. Добавляем рёбра с бесконечной пропускной способностью от каждого из старых стоков к T.
Неориентированные рёбра
Каждое неориентированное ребро (u, v) заменяем на пару ориентированных рёбер (u, v) и (v, u).
Ограничение пропускной способности вершин
Каждую вершину v с ограниченной пропускной способностью <math>c_v</math> расщепляем на две вершины vin и vout. Все рёбра, до расщепления входящие в v, теперь входят в vin. Все рёбра, до расщепления исходящие из v, теперь исходят из vout. Добавляем ребро (vin,vout) с пропускной способностью <math>c_v</math>.
Ограничение пропускной способности рёбер снизу
В данном варианте постановки задачи значение потока каждого ребра дополнительно ограничено снизу функцией <math>c'\colon E \to \mathbb{N}^+</math>. Таким образом величина потока для любого ребра не может превысить его пропускную способность, но и не может быть меньше заданного минимума, т.е. <math>c'(e) \leqslant f(e) \leqslant c(e)</math>. Для решения задачи необходимо преобразовать исходную транспортную сеть <math>G = (V, E, s, t, c, c')</math> в транспортную сеть <math>G' = (V', E', s', t', c)</math> следующим образом:
- Добавь новые источник <math>s'</math> и сток <math>t'</math>.
- Для каждого ребра <math>(v, w)</math>:
- Создай две новые вершины <math>x</math> и <math>y</math>.
- Установи <math>c(v, x) = c(v, w)</math> и <math>c(y, w) = c(v, w)</math>.
- Установи <math>c(x, y) = c(v, w) - c'(v, w)</math>.
- Установи <math>c(s', y) = c'(v, w)</math> и <math>c(x, t') = c'(v, w)</math>.
- Установи <math>c(t, t') = c(s, s') = \sum_{e \in E}c(e)</math>.
В <math>G</math> определён поток, удовлетворяющий условию об ограничении пропускной способности ребёр снизу, тогда и только тогда, когда в <math>G'</math> определен максимальный поток, в котором все рёбра вида <math>(s', y)</math> и <math>(x, t')</math> "насыщены". Благодаря такому построению алгоритм нахождения потока, ограниченного снизу будет следующим:
- Из <math>G</math> построй <math>G'</math>.
- Найди поток <math>f'</math> графа <math>G'</math>, предпочитая рёбра вида <math>(s', y)</math> и <math>(x, t')</math>.
- Если <math>f' < f + \sum_{e \in E(G)} c'(e)</math>, где <math>f</math> - поток графа <math>G</math> в котором опущена пропускная способность рёбер снизу, то решения не существует.
- Иначе вычисли поток <math>f</math> из потока <math>f'</math>, т.е. <math>f(a, b) = f(a, x)</math>.
Ограничение пропускной способности рёбер снизу с альтернативой
Такой вариант задачи идентичен предыдущему с той разницей, что значение потока для каждого ребра может быть также равно <math>0</math>, т.е. <math>c'(e) \leqslant f(e) \leqslant c(e)</math> или <math>f(e) = 0</math>. Несмотря на незначительное изменение условия, не существует полиноминального решения данной проблемы, если классы P и NP не равны. В качестве доказательства утверждения можно привести полиноминальную редукцию к проблеме Exact-3-SAT.
См. также
Примечания
Литература
- Schrijver, Alexander, «On the history of the transportation and maximum flow problems», Mathematical Programming 91 (2002) 437—445
- Книга:CLRS. Глава 26. Максимальный поток.
- Шаблон:NoteШаблон:Статья
- Шаблон:NoteШаблон:Статья
- Шаблон:NoteШаблон:Статья
- Шаблон:NoteШаблон:Статья
- Шаблон:NoteШаблон:Статья
- Шаблон:Книга
- ↑ Шаблон:MacTutor Biography
- ↑ Cottle, Richard; Johnson, Ellis; Wets, Roger, «George B. Dantzig (1914—2005)» Шаблон:Wayback, Notices of the American Mathematical Society, v.54, no.3, March 2007. Cf. p.348
- ↑ 3,0 3,1 Hardesty, Larry, «First improvement of fundamental algorithm in 10 years» Шаблон:Wayback, MIT News Office, September 27, 2010
- ↑ Borndörfer, Ralf; Grötschel, Martin; Löbel, Andreas, «Alcuin’s Transportation Problems and Integer Programing» Шаблон:Wayback, Konrad-Zuse-Zentrum für Informationstechnik, Berlin, Germany, November 1995. Cf. p.3
- ↑ Powell, Stewart M., «The Berlin Airlift», Air Force Magazine, June 1998.
- ↑ Dantzig, G.B., «Application of the Simplex Method to a Transportation Problem» Шаблон:Wayback, in T.C. Koopman (ed.): Activity Analysis and Production and Allocation, New York, (1951) 359—373.
- ↑ Ford, L.R., Jr.; Fulkerson, D.R., «Maximal Flow through a Network», Canadian Journal of Mathematics (1956), pp.399-404.
- ↑ Ford, L.R., Jr.; Fulkerson, D.R., Flows in Networks, Princeton University Press (1962).
- ↑ Kelner, Jonathan, «Electrical Flows, Laplacian Systems and Faster Approximation of Maximum Flow in Undirected Graphs» Шаблон:Wayback, talk at CSAIL, MIT, Tuesday, September 28 2010
- ↑ Electrical Flows, Laplacian Systems, and Faster Approximation of Maximum Flow in Undirected Graphs Шаблон:Wayback, by Paul Cristiano et al., October 19, 2010.
- ↑ Шаблон:Cite web