- •1.1. Введение.
- •1.2. Оптимизационные задачи в 2.
- •1.4. Понятие о nр-полноте.
- •Условие целочисленности решения задачи лп.
- •Критерий полной унимодулярности.
- •Задача о назначениях.
- •Задача коммивояжера.
- •2. Принятие решений и элементы теории игр.
- •2.1. Задачи многокритериальной оптимизации.
- •2.3. Игры.
- •Дележи.
- •3. Сетевые модели.
- •3.1. Способы задания графов.
- •3.2. Изоморфизм графов.
- •Поиск простейших узких мест графа за o(|e|).
- •3.3. Остовные деревья.
- •Описание алгоритма Прима:
- •Корректность алгоритма Прима.
- •3.4. Кратчайшие пути в графах. Волновой алгоритм построения дкп (Дейкстра)
- •Нахождение кратчайшего пути для ациклического орграфа
- •3.5. Потоковые задачи Задача о максимальном потоке (змп).
- •На входе: матрицы а –пропускных способностей, и c – цен, c ij 0 - стоимость пропуска единицы потока по ребру (I,j), f0 - ограничение на величину потока.
- •3.6. Приближенное решение np-полных задач.
- •Задача о максимальной клике.
- •3.7. Точные методы решения np-полных задач.
- •4. Элементы теории массового обслуживания.
- •4.1. Пуассоновский поток событий
- •4.2. Моделирование простейшего потока.
- •4.3. Процессы гибели и размножения.
- •Классификация систем массового обслуживания:
- •4.4. Открытая система м | м | 1 (один врач).
- •4.5. Замкнутые системы с резервированием. Будем различать горячий и холодный резервы, т.Е. Исправные, но включенные или выключенные приборы.
- •4.6. Задачи проектирования сетей технического обслуживания.
- •3.5. Алгоритм Тарьяна (для планарных графов мод строится за o(n)).
3.5. Потоковые задачи Задача о максимальном потоке (змп).
Пусть S – сеть, т.е. граф (V,E) с выделенными стартовой и терминальной вершинами s, t V; A ={ ij 0} – матрица пропускных способностей ребер, ij = 0 ребра нет; поток X ={x ij}– матрица, удовлетворяющая ограничениям:
0 x ij ij , j x ij = k x ki , i s,t – уравнение баланса.
Максимизируем величину потока, вытекающего из вершины s: F( X ) = j x sj .
Предположение А. r = min{x ij, x ji} = 0. Иначе проводим операцию ГАШЕНИЕ: x ij = x ij – r, x ji = x ji – r. Поток при этом остается допустимым. В том числе x ii = 0. Предположение Б. x js = x tj = 0 (в s ничего не втекает, из t ничего не вытекает).
На диагонали матрицы X стоят нули. Суммы элементов первой строки и последнего столбца равны. Для остальных строк: сумма элементов строки i равна сумме элементов i-го столбца.
Все ограничения и целевая функция линейны это задача ЛП.
Как и задача о кратчайшем пути, она может решаться волновым алгоритмом.
Пусть
W
– множество включенных вершин: WV,
sW,
tW.
Обозначим через R(W) ={(v1,v2)E | v1W, v2W}
-разрез,R(W) ={(v1,v2)E | v1W, v2W} -антиразрез,
(R (W )) =
- пропускную способность разреза.
Теорема
1: Для любого
потока X
и для любого W
.
Доказательство.
Имеем
.
Следствие 1. j x sj = k x kt . Для этого достаточно взять 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 x ij 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.
-
построение слоистой сети и вычисление пропускных способностей всех ребер и вершин (ПСВ) ~ числу ребер ~ O(N 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) - минимальный разрез графа, 1W и k=minW ≥2 R(W) будет найден на шаге k.
№25. Задача о потоке минимальной стоимости (ПМС).
