- •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)).
Описание алгоритма Прима:
Шаг 0: Инициализация (Если не 0, то пишем в таблицу, если =0, то не пишем)
W(1) = O(1) = 1, W(i)=O(i)=0 i >1
i S(1) : O(i)=1, D(i)=d(1,i)
Можно считать, что граф полный. Если ребра (i,j) нет, то d(i,j) = ∞. Или для всех вершин должны быть заданы списки S(i) номеров соседних с i вершин.
Основной шаг:
k = argmin D(i), где iW -1(0) O -1(>0) , т.е. W (i) = 0 & O (i) 0.
т.е. берем минимум по «видимым» вершинам. Если таких вершин нет, но пройдены не все вершины, то выход: граф не связен; если пройдены все вершины, то выход: кратчайшее остовное дерево (нормальное завершение)
W(k)=1 – включить эту вершину
j S(k) & Wj = 0 : O(j)=0 или D(j)>d(k,j)коррекция: O(j)=k и D(j)=d(k,j).
Число основных шагов должно быть равно n-1, если пройдем по всем вершинам.
Остовное дерево состоит из ребер (i,O(i)).
Трудоемкость алгоритма Прима: (волновой алгоритм)
И нициализация – линейное время
|
О сновной шаг (повторяется (n-1) раз):
Трудоемкость = (n-1)O(n)=O(n2) |
Корректность алгоритма Прима.
Каждый раз подключается новая вершина строится связный граф без циклов и с n-1 ребром алгоритм Прима строит дерево. Почему это МОД?
Утверждение: d(G0)=d(G1), где G0-дерево, построенное алгоритмом Прима, G1-МОД.
Д оказательство. Множества вершин в G0 = (V, E0) и G1 = (V, E1) совпадают. Пронумеруем вершины и ребра G0 в порядке их включения алгоритмом Прима.
У каждой вершины только один сосед в G0 с меньшим номером – «отец»!
Введем целочисленное расстояние
Пусть E0 E 1. Выберем ребро e = (n1, n2)E0 \ E1 с минимальным номером. Пусть n1<n2 . Ребра G1 не нумерованы. Пойдем по ним от вершины n1 к n2, пока впервые не встретим такое ребро l = (n3, n4), что n3<n2≤n4.
n 2=n4 l E0 , иначе n2 имеет в G0 двух соседей n1,n3 < n2.
n2<n4 если l E0 , то номер ребра l больше номера ребра e.
В любом случае граф G2 = (V, E1 + e - l) является деревом и ρ (G0,G2) < ρ (G0,G1) (число ребер = n-1, при добавлении ребра e появился цикл, а при удалении ребра l из цикла связность не нарушится, min номер ребра в E0 \ E1 увеличивается).
Ребра e,l R (W) на шаге n2 и алгоритм Прима выбрал ребро e d(e) ≤ d(l) d(G2) ≤ d(G1). Но G1 – МОД. Поэтому d(G2)=d(G1). G2 – тоже МОД.
Повторим в цикле выбор ребер e и l и переход от Gk к Gk+1. На каждом шаге ρ (Gk,G1) убывает по крайней мере на 1 и не позже, чем через n-1 шаг будет =0, т.е. деревья G0 и Gk совпадут. Получили цепочку: d(Gk = G0) = … = d(G1).
Пример. На шаге n2=7 вершины n1=2 и n3=5 будут включены, а n2 и n4=9 нет.
№
Этап 1. Этап
2. Этап
3.
NKS |
BV |
i |
Соседи (SSV) |
I |
4 |
1 |
2 4 5 |
II |
3 |
2 |
1 5 3 |
II |
2 |
3 |
2 5 6 |
I |
1,5 |
4 |
1 5 7 |
I |
4 |
5 |
1 4 7 8 6 3 2 |
III |
9 |
6 |
3 5 8 9 7 |
IV |
8 |
7 |
6 8 5 4 |
IV |
7 |
8 |
9 6 5 7 |
III |
6 |
9 |
8 6 |
На каждом шаге число операций ≈ числу дуг=2R<6n
Формируем списки SSV соседей всех вершин.
Для всех вершин находим ближайшую вершину BV и строим симметричное замыкание BV: если BV(i)=j и BV(j) ≠ i, то в BV(j) добавляем i. В замыкании будет не более (n-1) неориен.ребра.
П
k = 0; NKS = 0;
for (j = 1; j < n; j++) if NKS(j)=0 {
Q = { j }; SKS(++k) = ;
while (Q ≠ ) { i = pop( Q );
NKS(i)=k; SKS(k)+=i;
for all m BV(i)
if NKS(m) then Q+= m }}
оиском сначала вширь по массиву BV выделяем компоненты связности.
NKS(j) – номер компоненты связности j-ой вершины,
SKS(k) –список вершин k-ой компоненты связности,
Q – текущая очередь при поиске k –компоненты,
pop(Q) – выбор первой вершины из очереди.
Списки вершин компонент связности на выходе:
I: 1,4,5 II: 2,3 III: 6,9 IV: 7,8
Трудоемкость этой части = числу ребер в симметрическом замыкании < 2n.
Ч
R.d = ∞; Q = ; kk=k;
for (t = 1; t < kk; t++) {
for all i SKS(t)
for all j SSV(i) {
k=NKS(j);
if R[k].d > d(i,j)
then{ Q+= k;
R[k]={d (i, j),i, j}}
while (Q ≠ )
R[pop(Q)].d= ∞; }
ИСТКА. Формируем ребра макрографа в виде списков соседних компонент связности, просматривая по списку SKS вершины текущей компоненты. Если в списке соседей очередной вершины i встретится вершина j из другой компоненты k с более коротким ребром между компонентами, то запишем в список соседних макровершин блок k/d (i, j), где d – длина кратчайшего ребра между вершинами компонент.
Список соседей до очистки |
|
Список соседей после очистки |
|||||||
I |
_ II _ , |
_ IV_ , |
_III_ |
|
I |
_ II _ , |
_ IV_ , |
_III_ |
|
4(1,2) |
3(4,7) |
4(5,6) |
|
4(1,2) |
3(4,7) |
4(5,6) |
|||
II |
__I_ , |
_III_ |
|
|
II |
__I_ , |
_III_ |
|
|
4(2,1) |
3(3,6) |
|
|
4(2,1) |
3(3,6) |
|
|||
III |
__II_ , |
__I_, |
_IV_ , |
__IV_ |
III |
__II_ , |
__I_ , |
_IV_ |
|
3(6,3) |
4(6,5) |
6(6,8) |
4(6,7) |
3(6,3) |
4(6,5) |
4(6,7) |
|||
IV |
_III_, |
__I__ |
__I__ |
|
IV |
_III_, |
__I__ |
|
|
4(7,6) |
5(7,5) |
3(7,4) |
|
4(7,6) |
3(7,4) |
|
Этап 4. Все вершины одной компоненте STOP.
Особенность реализации алгоритма: Заводим и обнуляем массив структур R из n компонент прямого доступа, которому соответствует на рисунке одна строка таблицы списков соседей. Когда в какую-либо структуру вносится информация, адрес структуры заносим в «журнал» Q. Для очистки массива R мы обнуляем поля, адреса которых есть в журнале. При этом очистка не требует большей работы, чем запись. Иначе только очистка может потребовать n2 операций.
Макрограф планарного графа – планарен, а трудоемкость удовлетворяет неравенству Tn<Cn+Tn/2, линейна по n.