Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CLIO_фокин24.doc
Скачиваний:
10
Добавлен:
24.11.2018
Размер:
3.26 Mб
Скачать

3.5. Потоковые задачи Задача о максимальном потоке (змп).

Пусть S – сеть, т.е. граф (V,E) с выделенными стартовой и терминальной вершинами s, t V; A ={ ij  0} – матрица пропускных способностей ребер,  ij = 0  ребра нет; поток X ={xij}– матрица, удовлетворяющая ограничениям:

0  xij   ij , jxij = kxki ,  i  s,tуравнение баланса.

Максимизируем величину потока, вытекающего из вершины s: F( X ) = jxsj .

Предположение А. r=min{xij, xji} = 0. Иначе проводим операцию ГАШЕНИЕ: xij= xij– r, xji= xji– r. Поток при этом остается допустимым. В том числе xii = 0. Предположение Б. xjs = xtj = 0 (в s ничего не втекает, из t ничего не вытекает).

На диагонали матрицы X стоят нули. Суммы элементов первой строки и последнего столбца равны. Для остальных строк: сумма элементов строки i равна сумме элементов i-го столбца.

Все ограничения и целевая функция линейны  это задача ЛП.

Как и задача о кратчайшем пути, она может решаться волновым алгоритмом.

Пусть W – множество включенных вершин: WV, sW, tW. Обозначим через R(W) ={(v1,v2)E | v1W, v2W}  -разрез,R(W) ={(v1,v2)E | v1W, v2W} -антиразрез,  (R (W )) =  - пропускную способность разреза.

Теорема 1: Для любого потока X и для любого W .

Доказательство. Имеем .

Следствие 1.jxsj = kxkt . Для этого достаточно взять W = V \ {t}.

Следствие 2. Для любого потока X и для любого W имеем F (X) ≤  (R (W )) .

Доказательство: .

Неравенство верно для любых X и W.

Теорема 2 (Форда-Фалкерсона):

Доказательство. Пусть по сети течет поток X. Поток из i в j можно увеличить на величину ij = xji +(αij - xij), погасив поток по обратной дуге (j,i) и послав дополнительный поток по прямой дуге (i,j). Ориен­тированную дугу назовем аугментальной (допускающей увеличение потока), если ij > 0. По крайней мере одна из дуг (i,j) и (j,i) будет аугментальной при любом потоке X. Построим ориентированную A‑сеть из аугментальных дуг и найдем в ней аугментальную цепь L дуг из s в t, решив задачу на достижимость. Сначала включим вершину S. Из включенной вершины i можно включить любую соседнюю вершину j. Алгоритм Форда-Фалкерсона (АФФ) включает вершины в произвольном порядке до тех пор, пока что-либо можно включить. Процесс заканчивается, когда включена вершина t. Обратным ходом находим цепь L из s в t. Пошлем по ней дополнительный поток величины  =. Суммарный поток – допус­тимый, т.к. 0  xij   ij  и выполнены уравнения ба­ланса. Затем все включения отменяем и повторяем все сначала. Алгоритм оста­навливается, когда для разреза R(W) все ij = 0, т.е. все обратные дуги нулевые, а все прямые - насыщены  пропускные способности дуг равны потокам.  По теореме 1 имеем F (X) =  (R (W ))   . ■

Замечание. Если ij для всех дуг – целые числа, то - целое и на каждой итерации поток увеличивается как минимум на 1  через конечное число шагов алгоритм остановится. Но он может не остановиться, если ij иррациональны.

Пример 1. При плохом выборе аугментальных цепочек АФФ может сделать 2000 итераций, т.е. трудоемкость зависит от ПС, а не от числа вершин. Эдмондсон и Карп насыщали аугментальные цепи с минимальным числом ребер.

23. А лгоритм Диница – Карзанова (АДК).

Описание алгоритма дадим на примере 2. На ребрах сети S до запятой стоят пропускные способности, после запятой – сумма потоков на этапах.

а) Основной цикл идет по этапам:

строим слоистую сеть всех кратчайших путей и насыщаем ее за O(n2) операций. Максимальный поток строится за n этапов с общей трудоемкостью O(n3).

Э тап №1: Для текущего потока x строим слоистую сеть S(x). Поиск «сначала вширь», структура – очередь вершин s / 1, 2 / 3, 4 / 5, 6 / t, разбитых на слои. На слой 1 помещаем вершину s, на следующий слой - вершины, достижимые из вершин предыдущего слоя с помощью одного ребра, пропускная способность которого ij = (ij - xij) + xji  0.

Только ориентированные ребра, идущие с предыдущего слоя на следующий, у которых ij  0, включаются в сеть S(x).

Шаг1. k=2, ƒ=F=6. Для всех вершин i ≠ s, t найдем характеристики:

  • входная пропускная способность (вхПСВ(i) =по входящим дугам);

  • выходная пропускная способность (выхПСВ(i) =по исходящим дугам)

ОЧИСТКА: Если ƒ = 0, то вершина k – зависшая, пускать нечего и можно сразу удалить вершину k.  На последнем слое останется только одна вершина - t.

Принцип ТЯНИ-ТОЛКАЯ: если из вершины k = argmin ПСВ(i) толкать в разные сторо­ны поток ƒ = ПСВ(k) со слоя на слой, то все придет слева в s (на слое 0 одна вершина s), а справа – в t (после ОЧИСТКИ там осталась одна вершина t).

Принцип НАКОПЛЕНИЯ: за счет послойной обработки дуг в процессе про­тягивания-проталкивания потока все входящие в вершину потоки сначала суммируются, а затем выталкиваются из вершины 1 раз.

b ) Цикл внутри этапа по шагам: проталкиваем из вершины k = argmin ПСВ(i) поток ƒ = ПСВ(k) в разные стороны со слоя на слой, пока слева поток не дойдет до s, а справа - до t. Проталкивание из k в s называют протягиванием из s в k. На пройденных ребрах величину потока вычитаем из вх и выхПСВ. После протягивания удаляем вершину k и проводим очистку сети S(x): удаляем провисшие ребра, суммарный поток по ним переносим в основную сеть, а их остаточные ПС вычитаем из соответствующих ПСВ слоистой сети.

Э тап 2: f=1, F=15

Слоистая сеть является цепью  min ПСВ =  алгоритма Форда-Фалкерсона, вычислять ПСВ не надо. У нас цепь,  = 1  сразу переносим поток в сеть S.

Этап 3: W = {s,1,2,4}. Больше включить ничего нельзя. Величина текущего потока равна сумме пропускных способностей ребер разреза R(W): 15 = 4+3+1+3+4  поток – максимален, а разрез – минимален.

Отличия АФФ от АДК. 1) АФФ недетерминирован и АДК уточняет его.

2) Итерации АДК разделены на 2 типа: этапы и шаги. 3) АДК насыщает не цепь, а слоистую сеть  на следующей итерации отключено не ребро (одно из n·n), а вершина (одна из n на весь этап). 4) Умное проталкивание потока со слоя на слой с однократным за шаг выталкиванием потока из любой вершины.

Трудоемкость: Докажем сначала, что любой этап имеет трудоемкость N 2.

  1. построение слоистой сети и вычисление пропускных способностей всех ребер и вершин (ПСВ) ~ числу ребер ~ O(N 2)

  2. на каждом шаге основного цикла:

1). Находим вершину с min ПСВ ~ N

2). Протянуть и протолкнуть ~ О(числа ребер) ~ O(N 2)

3). Удаляем вершину ~ O(N) вместе с очисткой. Результаты шага переносим в основной граф при удалении ребра из слоистой сети.

При пропускании любого потока по любой дуге слоистой сети мы вешаем на ней один флаг: если дугу насытили, то – красный, иначе – зеленый. На каждом шаге мы тянем-толкаем поток из вершины k волновым алгоритмом, т.е. со слоя на слой. При этом прийти в промежуточную вершину можно по многим дугам с разными флагами на них, а при выходе мы вешаем красные флаги до тех пор, пока нам не удастся вытолкнуть весь остаток потока, и тогда вешаем зеленый флаг. Т.к. на шаге поток из любой вершины выталкивается 1 раз, а число шагов на этапе  N (на каждом шаге удаляется вершина),  число зеленых флагов за этап = NN = N 2. Число красных флагов за этап  числа дуг (по красной дуге поток не пускаем). Трудоемкость этапа определяется общим числом красных и зеленых флагов ~ O(N 2), а число этапов < N (т.к. номер слоя, содержащий вершину t, строго возрастает от этапа к этапу).  Общая трудоемкость алгоритма = O(N 3).

Иллюстрацию работы алгоритма дает в примере 2 шаг 1 этапа 1: при выталкивании потока величины 6 из вершины 2 мы вешаем один красный флаг на ребре (2,3) и один зеленый на ребре (2,4). При обработке вершины 5 на этом же шаге поток суммируется по всем входящим в нее ребрам и выталкивается из вершины 5 с одним!!! зеленым флагом.

П ример 3. Этап 1: ОЧИСТКА. Осталась цепочка.

Зависшие вершины – удаляем сразу. = F=1.

Э тап 2:

65 = x56 +(α65 - x65) =1+1=2

= 2, F=3.

Э тап 3:

Fmax = 3. Мин. разрез показан волнистой линией.

24. Минимальный разрез в графе за O(n·|E|): алгоритм Поддерюгина.

Найти минимальный разрез в графе можно с трудоемкостью O(n5), выполнив алгоритм Диница-Карзанова для всех пар вершин S и T. Алгоритм Поддерюгина решает эту же задачу за O(n | E |): на i-том этапе ищется по шагам максимальный поток в вершину с номером i+1 из объединения U всех вершин с номерами j  i.

Шаг А) Пускаем поток по всем прямым ребрам из U в вершину с номером i+1.

Шаг Б) Пускаем поток по всем путям длины 2 из U в вершину с номером i+1. Для этого строим пересечение списков LU и Li+1 (соседи объединения и соседи вершины i+1).

Шаг В) Пускаем поток по всем путям длины  3 из U в вершину с номером i+1, удалив сначала насыщенные ребра. Строим слоистую сеть, используя обычный поиск сначала вширь (как в алгоритмах Прима и Дейкстры).

Пример.

Этап 1. А) Есть 1 прямой путь из U= {1} в 2. fА= 1.

Б) LU = {2,3,4}; L2 = {1,3,5}; LU  L2 = {3}; fБ= 1.

В) W={1 | 4 | 3,8 | 6,7 | 5 | 2}; fВ= 1.

W1 ={1}. F1= 3.

Этап 2. А) Есть 2 прямых пути из U= {1,2} в 3. fА= 2.

Б) LU= {3,4,5}; L3 = {1,2,4}; LU  L3 = {4}; fБ= 1.

В) W2 ={1,2 | 5 | 6,7 | 8 | 4}; fВ= 0. F2= 3.

Этап 3. А) Есть 2 прямых пути из U= {1,2,3} в 4. fА= 2.

Б) LU= {4,5}; L4 = {1,3,8}; LU  L4 = {}; fБ= 0.

В) W={1,2,3 | 5 | 6,7 | 8 | 4}; fВ= 1.

W3 ={1,2,3}. F3= 3.

Этап 4. А) Есть прямой путь из U= {1,2,3,4} в 5. fА= 1.

Б) LU= {5,8}; L5 = {2,6,7}; LU  L5 = {}; fБ= 0.

В) W={1,2,3,4 | 8 | 6,7 | 5}; fВ= 1.

W4 ={1,2,3,4}. F4= 2.

Этап 5. А) Есть прямой путь из U={1,2,…,5} в 6. fА= 1.

Б) LU= {6,7,8}; L6 = {5,7,8}; LU  L6 = {7,8}; fБ= 2.

В) W5 ={1,2,3,4,5}; fВ= 0. F5= 3.

Этап 6. А) Есть 2 прямых пути из U={1,…,6} в 7. fА= 2.

Б) LU= {7,8}; L7 = {5,6,8}; LU  L7 = {8}; fБ= 1.

В) W6 ={1,2,3,4,5,6 | 8}; fВ= 0. F6= 3.

Этап 7. А) Есть 3 прямых пути из U={1,…,7} в 8. fА= 3.

Б) LU= {8}; L8 = {4,6,7}; LU  L8 = {}; fБ= 0.

В) W7 ={1,2,3,4,5,6,7}; fВ= 0. F7= 3.

Минимальный разрез (Fmin = 2) определяется на шаге 4 = argmin Fi множеством включенных вершин W=W4 ={{1,2,3,4}}. Трудоемкость алгоритма: можно упорядочить списки соседей и найти их пересечение за линейное время; число итераций шага B за все этапы ≤ n, т.к. никакая вершина не может быть пред­последней в жирных цепочках более одного раза. На этом же этапе нельзя из-за ПСР=1, а уже на следующем этапе вершина попадет на слой 1 (т.к. соседняя с ней последняя вершина жирной цепочки включается в U). Но на шаге В номер предпоследнего слоя  2!!! Шаги А и Б оцениваются легко.

Обоснование корректности алгоритма: пусть R(W) - минимальный разрез графа, 1W и k=minW ≥2  R(W) будет найден на шаге k.

25. Задача о потоке минимальной стоимости (ПМС).