В теорії оптимізації та теорії графів, задача про максимальний потік полягає у знаходженні такого потоку за транспортною мережею, щоб сума потоків з витоку, або, що означає те ж саме, сума потоків до стоку була максимальна.

Задача про максимальний потік є окремим випадком більш складних задач, таких, як, наприклад, задача про циркуляцію.

Історія Після вступу США у Другу світову війну у 1941 році математик Джордж Бернард Данціг почав працювати у відділі статистичного управління Військово-повітряних сил США у Вашингтоні. З 1941 по 1946 роки він очолював підрозділ аналізу військових дій (Combat Analysis Branch), де працював над різноманітними математичними проблемами.Cottle, Richard; Johnson, Ellis; Wets, Roger, «George B. Dantzig (1914–2005)» , Notices of the American Mathematical Society, v.54, no.3, March 2007. Cf. p.348 Згодом з використанням роботи Данцига задача про максимальний потік була вперше розв'язана у ході підготовки повітряного мосту під час Берлінського повітряного мосту, що відбувався у 1948–1949 роках.Hardesty, Larry, «First improvement of fundamental algorithm in 10 years» , MIT News Office, September 27, 2010Borndörfer, Ralf; Grötschel, Martin; Löbel, Andreas, «Alcuin's Transportation Problems and Integer Programing» , Konrad-Zuse-Zentrum für Informationstechnik, Berlin, Germany, November 1995. Cf. p.3Powell, Stewart M., «The Berlin Airlift», Air Force Magazine, June 1998.

У 1951 році Джордж Данциг вперше сформулював задачу у загальному вигляді.Dantzig, G.B., «Application of the Simplex Method to a Transportation Problem» , in T.C. Koopman (ed.): Activity Analysis and Production and Allocation, New York, (1951) 359–373.

У 1955 році і вперше побудували алгоритм, призначений для вирішення цього завдання. Їх алгоритм отримав назву алгоритм Форда — Фалкерсона.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).

Надалі рішення задачі багато разів поліпшувалося.

У 2010 році дослідники Джонатан Келнер (Jonathan Kelner) і Олександр Мондри (Aleksander Mądry) з МТІ разом зі своїми колегами Даніелєм Спілманом з Єльського університету і з університету Південної Каліфорнії продемонстрували чергове покращення алгоритму, вперше за 10 років.Kelner, Jonathan, «Electrical Flows, Laplacian Systems and Faster Approximation of Maximum Flow in Undirected Graphs» , talk at CSAIL, MIT, Tuesday, September 28 2010Electrical Flows, Laplacian Systems, and Faster Approximation of Maximum Flow in Undirected Graphs , by Paul Cristiano et al., October 19, 2010.

Визначення Розглянемо транспортну мережу з джерелом , стоком та пропускними здатностями .

Величиною потоку (value of flow) називається сума потоків з джерела . У статті «Транспортна мережа» доведено, що вона дорівнює сумі потоків у сток .

Задача про максимальний потік полягає в знаходженні потоку такого, щоб величина потоку була максимальна.

Розв'язання В таблиці перераховано деякі алгоритми розв'язування задачі. Метод Складність Опис Лінійне програмування Залежить від конкретного алгоритму. Для симплекс-методу експоненціальна. Розглянемо задачу про максимальний потік як задачу лінійного програмування. Змінними є потоки по ребрах, а обмеженнями — збереження потоку й обмеження пропускної здатності. Алгоритм Форда — Фалкерсона Залежить від алгоритму пошуку шляху, що збільшується. Потребує O(max| f |) таких пошуків. Знайти будь-який шлях, що збільшується. Збільшити потік по всіх його ребрах на мінімальну з їх залишкових пропускних здатностей. Повторювати, поки є шлях, що збільшується. Алгоритм працює тільки для цілих пропускних здатностей. В іншому випадку, він може працювати нескінченно довго, не сходячись до правильної відповіді. Алгоритм Едмондса-Карпа O(VE²) Виконуємо алгоритм Форда — Фалкерсона, щоразу обираючи найкоротший шлях, що збільшується (знаходиться пошуком у ширину). Алгоритм Дініца O(V²E) для одиничних пропускних здатностей з використанням динамічних дерев Слетора і Тар'яна Удосконалення алгоритму Едмондса-Карпа (але хронологічно був знайдений раніше). На кожній ітерації, використовуючи пошук у ширину, визначаємо відстані від джерела до всіх вершин у залишковій мережі. Будуємо граф, який містить лише такі ребра залишкової мережі, на яких ця відстань зростає на 1. Виключаємо з графу усі тупикові вершини з інцидентними їм ребрами, поки всі вершини стануть не тупиковими. (Тупиковою називається вершина, в яку не входить і з якої не виходить жодне ребро, крім джерела і стоку.) На отриманому графі відшукуємо найкоротший шлях, що збільшується (їм буде будь-який шлях з s в t). Виключаємо із залишкової мережі ребро з мінімальною пропускною здатністю, знову виключаємо тупикові вершини, і так поки ще існують шляхи, що збільшуються. O(V²E) Замість потоку оперує з передпотоком. Різниця в тому, що для будь-якої вершини u, крім джерела і стоку, сума потоків, що входять до неї для потоку повинна бути строго нульовою (умова збереження потоку), а для передпотока — невід'ємною. Ця сума називається надмірним потоком у вершину, а вершина з позитивним надмірним потоком називається переповненою . Крім того, для кожної вершини алгоритм зберігає додаткову характеристику, висоту, яка є цілим невід'ємним числом. Алгоритм використовує дві операції: просування , коли потік по ребру, що йде з більш високої в нижчу вершину, збільшується на максимально можливу величину, і підйом , коли переповнена вершина, просування з якої неможливо через недостатню висоту, підіймається. Просування можливо, коли ребро належить залишковій мережі, коли воно веде з більш високої вершини в більш низьку, і вихідна вершина переповнена. Підйом можливий, коли вершина, що піднімається, переповнена, але жодна з вершин, в котру з неї ведуть ребра залишкової мережі, не нижче за неї. Він вчиняється до висоти на 1 більшою, ніж мінімальна з висот цих вершин. Спочатку висота джерела V, по всім ребрам, що виходять з джерела, тече максимально можливий потік, а решта висоти і потоки нульові. Операція просування і підйому виконуються до тих пір, поки це можливо. O(V³)O(VE log(V²/E)) з використанням динамічних дерев Варіант попереднього алгоритму, що спеціальним чином визначає порядок операцій просовування і підйому.Алгоритм двійкового блокуючого потоку

Для детальнішого списку, див. .

Теорема про цілий потік Якщо пропускні спроможності цілі, максимальна величина потоку теж ціла.

Теорема випливає, наприклад, з теореми Форда — Фалкерсона.

Узагальнення, що зводяться до вихідної задачі Деякі узагальнення задачі про максимальний потік легко зводяться до вихідної задачі.

Довільне число джерел та / або стоків

Якщо джерел більше одного, додаємо нову вершину S, яку робимо єдиним джерелом. Додаємо ребра з нескінченною пропускною здатністю від S до кожного зі старих джерел.

Аналогічно, якщо стоків більше одного, додаємо нову вершину T, яку робимо єдиним стоком. Додаємо ребра з нескінченною пропускною здатністю від кожного зі старих стоків до T.

Неорієнтовані ребра Кожне неорієнтоване ребро (u, v) замінюємо на пару орієнтованих ребер (u, v) і (v, u).

Обмеження пропускної здатності вершин

Кожну вершину v з обмеженою пропускною здатністю розщеплюємо на дві вершини vin і vout. Всі ребра, які до розщеплення входять до v, тепер входять в vin. Всі ребра, які до розщеплення виходять з v, тепер виходять з vout. Додаємо ребро (vin,vout) з пропускною здатністю .

Див. також Потокова мережа

Примітки

Джерела

Schrijver, Alexander, «On the history of the transportation and maximum flow problems» , Mathematical Programming 91 (2002) 437—445