Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Задача о максимальном потоке
Теория потоков возникла первоначально в связи с разработкой методов решения задач, связанных с рациональной перевозкой грузов. Схема доставки груза представлялась в виде графа, по ребрам которого проходит подлежащий максимизации поток груза. Позднее обнаружилось, что к задачам о максимальном потоке сводятся и другие важные оптимизационные практические задачи. 1. Стационарный поток. Разрез сети. Пусть – ориентированный граф без петель и без параллельных дуг. Каждой дуге поставлен соответствие вес дуги dij – некоторое неотрицательное число, которое назовем пропускной способностью дуги. Среди вершин множества I выделены две вершины: s – источник и t – сток. Стационарным потоком x величины v на сети назовем совокупность чисел x =, которые удовлетворяют двум условиям: , (8.1) \o(I\s\up2( + i - \o(I\s\up2( ( i= (8.2)
Здесь + i – множество вершин сети G, соседних справа для вершины i, ( i – множество вершин сети G, соседних слева для вершины i. Число xij называется дуговым потоком или потоком по дуге. Условие (8.1) означает, что дуговой поток является неотрицательным и не должен превышать пропускной способности дуги. Условие вида (8.2) записывается для каждой вершины сети. Для заданного потока величина v является некоторой константой. Левая часть равенства (8.2) для вершины, , означает, что суммарный «вытекающий» из вершины i поток и суммарный «поступающий» в вершину i поток равны. Условие (8.2) называют условием баланса, или условием неразрывности потока. Пример 1. На сети, представленной на рис. 8.1, первое число, указанное на дуге есть пропускная способность, второе – величина дугового потока. Выяснить, образует ли совокупность дуговых потоков стационарный поток на сети.
Проверка условия (8.2). Для вершины 2: выходящий поток равен 10 по дуге (2, 5), суммарный входящий поток по дугам (s, 2) и (3, 2) также равен 10. В вершине 3 имеем равенство: x32 + x35 + x3t - xs3 - x43 = 6 + 0 + 10 - 10 - 6 = 0. Непосредственной проверкой убеждаемся, что в вершинах 4 и 5 также выполняется условие баланса. Для вершин s и t имеем равенства: xs2 + xs3 + xs4 = 4 + 10 + 16 = 30, - x3t - x4t - x5t = - 10 - 10 - 10 = - 30. Таким образом, условие (8.2) выполняется для всех вершин. Величина потока равна v = 30. Пусть I1 – подмножество I такое, что, . Разрезом на сети G, отделяющим источник s от стока t называется множество таких дуг, что начало каждой из них есть вершина из I1, а конец – вершина из \. Согласно определению I1 I 1= Æ, I1 U 1= I, другими словами, каждая вершина попадает либо в I1, либо в 1. Обозначать разрез будем как пару. Рассмотрим сеть на рис. 8.1. Пусть I1 =, Лемма 8.1. Пусть – сеть с источником s и стоком t. Любой ориентированный маршрут (путь) из источника в сток содержит хотя бы одну дугу произвольного разреза. Доказательство. Пусть s, i1, i2, …, ik, t – последовательность вершин некоторого ориентированного маршрута (пути). – произвольный разрез, отделяющий источник s от стока t. Если вершина i1Ï I1, то i1Î 1, тогда дуга (s, i1) – дуга разреза, и лемма доказана. В противном случае для вершины i2 повторим рассуждения. Если все вершины i1, i2, …, ik попали в I1, то разрезу принадлежит дуга (ik, t), поскольку t Î 1. Следствие. Пусть – сеть с источником s и стоком t, и – произвольный разрез, отделяющий источник s от стока t. Если из G удалить все дуги разреза, то в новой сети не существует путей из вершины s в вершину t. Пропускной способностью разреза называется число d(I1, 1) = Лемма 8.2. Пусть x = – произвольный поток величины v на сети, и (I1, 1) – произвольный разрез, отделяющий источник s от стока t. Тогда величина потока не превосходит пропускной способности разреза, т.е.: v £ d(I1, 1). (8.3) . Доказательство. Для потока x в любой вершине выполняется условие (8.2). Выберем равенства для вершин множества I1 и сложим их почленно. Слагаемое xij, где iÎ I1 и jÎ I1, присутствует в левой части двух равенств: в равенстве для вершины i со знаком «плюс», а в равенстве для вершины j со знаком «минус». При сложении они в сумме дают нуль. Останутся слагаемые xij со знаком плюс, если iÎ I1 и jÎ 1, и слагаемые xij со знаком минус, если iÎ 1 и jÎ I1. Значит, получим: -= v. (8.4) Поскольку xij ³ 0, то -£ =. (8.5) Далее в силу того, что xij £ dij, имеем £ . (8.6) Из цепочки равенств и неравенств (8.4)-(8.6) получаем (8.3). 2. Постановка задачи о максимальном потоке. Теорема Форда-Фалкерсона. Задана сеть, в которой выделены две вершины s и t – источник и сток и заданы пропускные способности дуг. Найти поток из вершины s в вершину t максимальной величины. Таким образом, математическая постановка задачи имеет вид: v ( max,; \I\su(j(\o(I\s\ i (8.7) Данная задача является задачей линейного программирования. Но применение общих методов решения задач ЛП к задаче (8.7) не рационально, поскольку матрица условий является слабо заполненной. Математиками Фордом (Ford L.R.) и Фалкерсоном (Fulkerson D.R.) был предложен новый способ решения. Он основа на следующей теореме, которая носит имя ее авторов. Теорема Форда-Фалкерсона. Пусть – сеть с источником s и стоком t. Величина v максимального потока в сети G равна минимальной пропускной способности из всех разрезов, отделяющих источник s от стока t. Доказательство. Пусть x = – максимальный поток, и его величина равна v. Заметим, что такой поток существует. Почему? Во-первых, в сети G существует, по крайней мере, нулевой поток: с нулевой величиной. Во-вторых, согласно лемме 8.2 величина потока ограничена сверху пропускной способностью любого разреза. По максимальному потоку построим разрез (I1, ). Множество I1 формируем согласно следующим правилам: а) sÎ I1 (правило следует из определения разреза); б) если вершина iÎ I1 и существует дуга (i, j) Î U, где jÏ I1 и xij < dij, то вершину j включаем в множество I1 (см. рис.8.1); в) если вершина iÎ I1 и существует дуга (j, i) Î U, где jÏ I1 и xij > 0, то вершину j включаем в множество I1 (см. рис. 8.2). Затем находим множество. Покажем, что tÎ. Предположим противное: tÎ I1. Тогда среди элементов множества I1 можно выделить последовательность вершин s, i1, i2, …, ik, t, (8.8) в которой две соседние вершины являются смежными. Другими словами, последовательность (8.8) определяет (неориентированную) простую цепь из s в t, на прямых дугах которой дуговой поток не является насыщенным (правило б)), а на обратных дугах не является нулевым (правило в)). Найдем положительное число e = min {e1, e2 }, (8.9) где e1 = min { dij - xij, если (i, j) - прямая дуга в (8.8)}, e2 = min { xij, если (i, j) - обратная дуга в (8.8)}. Сформируем совокупность чисел =: = Очевидно, что для чисел выполняются условия (8.1). Проверим выполнение условий (8.2). Если i = s, и маршрут (8.8) включает дугу, то уравнение имеет вид \o(I\s\up2( + s -\o(I\s\up2( ( s =\o(I\s\up2( + s + -\o(I\s\up2( ( s = =\o(I\s\up2( + s + - \o(I\s\up2( ( s = \o(I\s\up2( + s -\o(I\s\up2( ( s + e = v + e, где + s = + s \ i1. Аналогичный результат получаем, если маршрут (8.8) включает дугу. Если i = t, и маршрут (8.8) включает дугу, то уравнение имеет вид \o(I\s\up2( + t -\o(I\s\up2( ( t - = \o(I\s\up2( + t - \o(I\s\up2( ( t - () = = \o(I\s\up2( + t - \o(I\s\up2( ( t - e = - v - e, где ( t =( t \ ik. Аналогичный результат получаем, если маршрут (8.8) включает дугу. Для вершин, не входящих в последовательность (8.8), уравнения на совокупности совпадает с уравнением баланса на потоке x. Для любой вершины из множества в уравнении присутствуют ровно два слагаемых, соответствующих дугам маршрута. При этом возможны три различные ситуации: обе дуги выходят из вершины, обе дуги входят в вершину или одна является выходящей, а вторая – входящей (см. рис. 8.3). Непосредственный подсчет показывает, что условия баланса имеют место для любой из этих вершин. Следовательно, = – поток на сети, величина которого равна, что противоречит максимальности потока x =. Итак, tÏ I1, а значит, (I1, ) – разрез. По построению дуговой поток на дугах разреза насыщенный, т.е. если Î , то. Если дуга такова, что, , то. Поэтому из (8.4) и (8.5) следует v =-=- 0 = d(I1, ). (8.10) Доказано, что величина потока равна пропускной способности построенного разреза. Осталось показать, что разреза с меньшей пропускной способностью не существует. От противного. Пусть имеется такой разрез (I2, ), что. Тогда, используя лемму 8.2 и выше доказанное равенство (8.10), имеем v £ d(I2, ) < d(I1, ) = v. Полученное неравенство v < v говорит, что построенный разрез имеет минимальную пропускную способность. Теорема доказана. Последовательность (8.8), для которой число e, вычисленное по правилу (8.9), является положительным, называется увеличивающей цепью. Следствие из теоремы Форда-Фалкерсона. Если в сети построен максимальный поток, то в ней нет увеличивающих цепей. 3. Алгоритм Форда-Фалкерсона. Основная идея алгоритма следует из теоремы Форда-Фалкерсона: чтобы найти максимальный поток, надо построить минимальный разрез (найти на сети узкое место, которое не дает увеличить поток). Считаем, что начальный поток на сети задан, в частности им может быть нулевой поток. Каждая итерация состоит из двух частей. На первом этапе строится увеличивающий путь (если его построить не удается, то в сети построен максимальный поток), а на втором этапе осуществляется увеличение потока. И первое, и второе реализуется с помощью присвоения вершинам сети специальных меток. В ходе алгоритма вершина может быть в одном из трех состояний: непомеченная (это начальное состояние всех вершин), помеченная, помеченная и просмотренная. Метка вершины содержит информацию о формируемом пути (первая часть метки) и о величине потока, который можно дополнительно пропустить по этому пути из источника до рассматриваемой вершины. I этап. Все вершины не помечены. Шаг 1. Вершина s получает метку, что означает, что у вершины s нет предшествующих вершин, и мощность источника неограниченна. Шаг 2. Пусть имеется некоторое множество помеченных вершин. Произвольно выбираем из них вершину i, и начинаем процесс ее просмотра. Определяем все смежные с ней, но еще непомеченные вершины. Пусть вершина j – одна из них. Вершина j получает метку в двух следующих случаях: а) если существует дуга, причем, то метка вершины имеет вид. Первая часть метки означает, что вершина j помечена через вершину i, причем дуга является прямой дугой формируемого пути. Вторая часть метки вычисляется по правилу , где ei – вторая часть метки вершины i. б) если существует дуга, причем, то метка вершины имеет вид. Первая часть метки означает, что вершина j помечена через вершину i, причем дуга является обратной дугой формируемого пути. Вторая часть метки вычисляется по правилу . После того, как для всех вершин, смежных с вершиной i, будет решен вопрос с метками, вершина i переходит в разряд помеченных и просмотренных. При выполнении шага 2 одна вершина становится просмотренной, какие-то вершины становятся помеченными. Поскольку рассматриваемые сети являются конечными, то на шаге 2 возможны два исхода: 1) помечена вершина t; 2) все помеченные вершины просмотрены, но вершина t оказалась непомеченной. В первом случае переходим к II этапу. Во втором – процесс решения закончен, в сети построен максимальный поток. Чтобы найти его величину, найдем пропускную способность разреза, где множество помеченных и просмотренных вершин, – множество непомеченных вершин. II этап. Строим увеличивающую цепь из вершины s в вершину t. Первая часть метки вершины t указывает вершину ik, которая в цепи предшествует вершине t. Затем первая часть метки вершины ik указывает вершину ik-1, которая предшествует вершине ik, и так далее, пока первая часть метки некоторой вершины не укажет на вершину s. Выбирается направление в цепи: из вершины s в вершину t. На прямых дугах цепи дуговые потоки увеличиваются на величину et, а на обратных дугах уменьшается на эту величину. Переход к новой итерации. Пример 2. На сети, представленной на рис. 8.1, найти максимальный поток. Итерация 1. I этап. Все вершины не помечены. Шаг 1. Вершина s получает метку. Шаг 2. Операции этого шага поместим в таблицу:
II этап. Увеличивающая цепь проходит через вершины s, 4, t. На дугах и дуговые потоки увеличиваем на 6 единиц. Полученный новый поток указан на рис. 8.4. Итерация 2. I этап. Все вершины не помечены. Шаг 1. Вершина s получает метку. Шаг 2.
II этап. Увеличивающая цепь проходит через вершины s, 2, 3, t. На дугах (s, 2) и (3, t) дуговые потоки увеличиваем на 1 единицу, на дуге (3, 2) дуговой поток уменьшаем. Полученный новый поток указан на рис. 8.5. Итерация 3. I этап. Все вершины не помечены. Шаг 1. Вершина s получает метку. Шаг 2.
II этап. Увеличивающая цепь проходит через вершины. На дугах, и (5, t) дуговые потоки увеличиваем на 5 единиц, на дуге (3, 2) дуговой поток уменьшаем. Полученный новый поток указан на рис. 29. Итерация 4. I этап. Все вершины не помечены. Шаг 1. Вершина s получает метку. Шаг 2.
Все помеченные вершины просмотрены. Вершина t не помечена. Поток, указанный на рис. 8.6 является максимальным. Определим его величину. Последней итерации соответствует разрез, где, , (I1; ) = {, , }. Его пропускная способность равна d(I1; ) = 10 + 22 + 10 = 42 = v.
|
Последнее изменение этой страницы: 2017-03-15; Просмотров: 1449; Нарушение авторского права страницы