Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции САОД.docx
Скачиваний:
18
Добавлен:
25.11.2019
Размер:
3.28 Mб
Скачать

13.10.2012 Построение остова минимального веса

1)Жадный алгоритм - стратегия в которой глобально оптимальное решение складывается из локальных оптимальных решений. При построении остова минимального веса..

Граф задан списком рёбер. Каждое из рёбер представлено тремя атрибутами - две кольцевые вершины и вес.

Псевдокод:

1)Выполнить сортировку рёбер по возрастанию веса

2)Включить в остов ребро соответствующее первому элементу списка

3)Пометить кольцевые вершины этого ребра.

4)Повторять n-2 раза где n количество вершин

4.1)Последовательным просмотром упорядоченного списка найти ребро, одна кольцевая вершина которого окрашена а другая нет

4.2)Пометить неокрашенную вершину этого ребра

Формирование стека ребер

X

Y

W

1

2

3

1

4

9

1

6

4

1

7

5

2

3

1

2

5

5

2

7

2

3

4

4

3

6

7

4

5

7

5

6

8

6

7

2

X

Y

W

2

3

1

4

5

1

2

7

2

6

7

2

1

2

3

1

6

4

3

4

4

1

7

5

3

6

7

5

6

8

1

4

9

Динамическое программирование

Идея динамического программирования...

Управление в точке x называется условно оптимальным, если оно оптимально при условии что мы находимся уже в точке x.

Алгоритма Прима

Ребро, которое окрашивает ближайшее к остову вершину. Если x неокрашенная вершина, то альфа(x) это длина ребра или вес самого короткого ребра соединяющую эту вершину с остовом, а бета(x) это вторая кольцевая вершина этого ребра.

Псевдокод

1)Окрасить произвольную вершину графа

2)Для неокрашенных вершин рассчитать функции альфа и бета. Для вершин смежных к начальной значение функции альфа равно весу соответствующего ребра, а значение функции бета - номеру или ? вершины. Для вершин не смежных... альфа равно бесконечности, а значение функции бета неопределенно.

3)Повторять n-1 раз

3.1)Найти вершину x для которой значение альфа минимально

3.2)Включить вершину ребро с концевыми вершинами (x, бета(x)) в остов

3.3)Окрасить вершину x

3.4)Для всех вершин x* смежных x и неокрашенных пересчитать функции альфа и бета. Если альфа(x*) больше веса ребра (x, x*) то

3.4.1)Альфа(x*) = весу ребра (x, x*), а бета(x*) - ближайшая окрашенная вершина.

Алгоритм Крускала

АК использует ту же идею что и алгоритм Прима, но

1)изначально рассматривается остовный лес как множество изолированных вершин исходного графа, число компонентов этого леса...

2)На каждом шаге итерации в остов добавляются рёбра, которые связывают пары изолированных компонентов кратчайшим путём

3)В результате попарного объединения изолированных компонентов их количество уменьшится не менее чем в два раза.

4)Пункты 2-3 повторяются до тех пор пока количество компонентов не станет равным единице.

Количество итераций равно двоичному логарифму от количества вершин.

Список обозначений:

E - множество рёбер исходного графа

E(T) - множество рёбер строящегося остова

E*(T) - множество рёбер остова добавленных на очередной итерации

ВМР - список Весов Минимальных Рёбер - Для каждого изолированного компонента остова это вес ребра который соединяет этот компонент с другим изолированным компонентом кратчайшим путём. Длина списка ВМР равна количеству вершин.

НМР - список Номеров Минимальных Рёбер - Для изолированных компонентов

КОМП - список Компонентной принадлежности рёбер - значение элементов этого списка номера элементов которому принадлежит соответствующему ребру.

P - количество компонентов

Псевдокод:

1)Инициализация

1.Присвоить элементам списка КОМП номера вершин (каждая вершина находится в изолированном компоненте, номер вершины совпадает с номером компонента)

2.p = n, n - количество вершин

3.Иниицализировать список ВМР бесконечными значениями весов.

4.Список номеров рёбер .... неопределенно.

5.E(T) = 0

6.Пока p != 1 выполнять

6.1. Для всех ребер из E выполнять

6.1.1. Если концевые вершины ребра принадлежат разным компонентам, то если вес ребра меньше минимального веса для данной компоненты, то пересчитать значения ВМР и НМР для данной компоненты.

6.2. на основе анализа списка НМР сформировать множество Е*(Т) ребер вошедших в остов на очередной итерации

6.3. Пересчитать Е(Т) = Е(Т) объединение Е*(Т)

6.4. Пересчёт количества изолированных компонентов

Пример Рисунок 11

Процедура пересчёта количества компонентов.

Псевдокод:

1. P=0

2. Все вершины графа не окрашены

3. Цикл Для всех вершин графа

3.1. Если вершина не окрашена, то

3.1.1. Увеличить P

3.1.2. Поиском в глубину окрасить все вершины смежные по ребрам, вошедшим в остов и определить их компонентную принадлежность.

Рекурсивная процедура поиска в глубину.

Процедура "Поиск" (Параметры: номер компоненты, текущая вершина)

Тело процедуры:

1)окрасить текущую вершину

2)В списке КОМП для текущей вершины установить значение равное P

3)Для всех смежных неокрашенных вершин выполнять

3.1) Если существует ребро, принадлежащее E(T) между этими вершинами, то поиск номер компонента, смежная вершина

3.2) Итерация номер 2

Задача о максимальном потоке. Прикладная постановка задачи.

Дано: система трубопроводов, каждый участок, который характеризуется определённой пропускной способностью. В системе трубопроводов существует две особенные вершины: источник и потребитель.

Определить максимальный объём поставки от источника к потребителя с учётом ограничения на пропускную способность участка трубопроводов.

Формализация задачи - понятие транспортной сети.

1)Транспортная сеть - это направленный ациклический граф без петель.

2)На множестве дуг транспортной сети определена функция пропускной способности ребра (C) - характеризует объем поставок продукта в единицу времени

3)На множестве ребер определена функция f потока, т.е. реального объема прокачки в единицу времени.

4)Для любой вершины транспортной сети кроме истока (S) и стока (T) справедлив закон сохранения потока, а именно сумма потоков входящих в узел равна сумма потоков исходящих из узла.

Найти такое распределение потоков (функции f на множестве дуг транспортной сети при котором дальнейшее увеличение потока без нарушения условия (1) невозможно

Понятие потокодобавляющего пути

Транспортная сеть - это направленный граф, не содержащий петель.

Исток (S) - вершина, в которую ничего не входит

Существует ровно одна вершина с нулевой степенью исхода - Сток (T).

На множестве дуг графа определены функции пропускной способности и потока.

Если пропускная способность и поток насыщено равны - дуга называется потоком.(ЧЕГО?)

Для всех вершин за исключением S и T определён закон сохранения потока. Сумма потоков входящих в вершину равна сумме потоко выходящих из вершины. На транспортной сети при заданных функциях C(e) найти такое распределение функций f(e) по дугам графа при котором дальнейшее увеличение потока в ТС будет невозможным. Найти максимальное распределение функций потоков.

Потокодобавдяющий путь - это такой путь из S в T в котором могут входить дуги как в прямом так и в обратном направлении

f(e)>0 и f(e)<c(e)

Рисунок 12

Распределение потоков вдоль потокодобавляющего пути может быть увеличено.

Это увеличение будет иметь значение минимума между минимальной разностью пропускной способностью для прямых рёбер и максимума разности между пропускной способностью и потоком в обратных дугах.

Если между S и T существует потокодобавляющий путь, то текущее распределение потоков не является максимальным.

Псевдокод

1)Сгенерировать нулевое распределение потоков

2)Повторять

2.1)Построить потокодобавляющий путь

2.2)Если путь существует, то пересчитать потоки вдоль добавляющего пути.

Пока существуют добавляющие пути.

Процедура построения потокодобавляющего пути

Алгоритм передачи метки

Метка это структура данных связанных с вершиной транспортной сети и состоящей из двух компонентов: dx (имя вершины из которой x получила метку) и дельта(x) (предельные приращения потока на момент передачи метки из вершины x).

Плюс по прямой дуге

Минус по обратной дуге

Правило передачи метки:

Вершина x может получить метку если

а) она не была помечена ранее

б) если вершина x связывает с вершиной передающей метку ненасыщенное ребро или ненасыщенное прямое ребро или если вершину передающую метку связывают с вершиной обратной дугой с ненулевым потоком

Алгоритм помечивания

1)Пометить вершину S меткой прочерк - бесконечность.

2)Итерационный цикл - пока метку не получила вершина T и есть вершина способная принять метку выполнять

2.1)Передать метку смежной вершине в соответствии с правилом

2.2)сформировать значение метки в принимающей вершине. Можно использовать любую стратегию исчерпывающего перебора

Пример поиска потокодобавляющего пути

Рисунок 13

Алгоритм пересчёта потоков на потокодобавляющем пути

1)Текущая вершина C равна T

2)Используя величину дельта(T) пересчитать поток, который связывает

3)Сделать текущей вершину D(C)

Если текущая вершина не S то перейти в пункту 2.

В результате пересчёта потоков хотя бы одна потокодобавляющая дуга насыщается.

На каждой итерации соблюдается закон сохранения потока

Понятие минимального сечения.

Под минимальным сечением транспортной сети понимается такое подмножество насыщенных потоком дуг удаление которых из ТС приводит к разделению графа на два компонента в одном из которых находится вершина S а в другом вершина T.

29