Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1.1. Основные понятия и обозначения
- •1.2. Битовая шкала множества
- •2.3. Бинарные коды Грея
- •2.4. Порядок выполнения задания
- •1.4. Отношения над множествами
- •1.5. Расстояние между множествами
- •1.6. Порядок выполнения задания
- •1.7. Варианты
- •2.1. Формулировка задачи
- •2.2. Счет в двоичной системе счисления
- •2.5. Варианты
- •3.1. Определение комбинаторных объектов
- •3.2. Генерация сочетаний
- •3.3. Генерация перестановок
- •3.4. Порядок выполнения задания
- •3.5. Варианты
- •ГЛАВА 2. АЛГОРИТМЫ НА ГРАФАХ
- •4.1. Основные понятия и обозначения
- •4.2. Отношения и операции
- •4.3. Родственные графам объекты
- •4.4. Способы машинного представления
- •4.5. Порядок выполнения задания
- •4.6. Варианты
- •5.1. Обход вершин графа в глубину или ширину
- •5.2. Базовые задачи на графах
- •5.3. Порядок выполнения задания
- •5.4. Варианты
- •6.1. Формулировка задачи
- •6.2. Алгоритм Краскала
- •6.3. Алгоритм Прима
- •6.4. Некоторые замечания
- •6.5. Порядок выполнения задания
- •6.6. Варианты
- •7.1. Формулировка задачи
- •7.5. Кратчайшие контуры и транзитивное замыкание
- •7.6. Порядок выполнения задания
- •7.7. Варианты
- •ГЛАВА 3. АЛФАВИТНОЕ КОДИРОВАНИЕ
- •8.1. Основные понятия и обозначения
- •8.2. Формулировка задачи
- •8.3. Критерии однозначного декодирования
- •8.4. Порядок выполнения задания
- •8.5. Варианты
- •9.1. Средняя длина элементарного кода
- •9.2. Формулировка задачи
- •9.3. Свойства оптимальных кодов
- •9.4. Алгоритм Хаффмена
- •9.5. Сжатие текстов
- •9.6. Порядок выполнения задания
- •9.7. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

1
(10)
2
(2)
3
(8)
(9)
5
(6)
6
(1)
(4)
(5)
(3)
4
Рис. 6.1
Примечательно, что в алгоритме Краскала некоторые промежуточные графы T
связного исходного графа G результирующий граф T
(1 ≤ i < n – 1) могут быть несвязными, однако для
i
всегда связен,
n − 1
содержит m = n – 1 ребер, т. е. является деревом.
2
(2)
6
(1)
5
Т
T1
5
1
2
(1)
(2)
6
2
Т
3
3
2
(2)
6
(1)
1
(3)
3
Т
T3 T2
2
(2)
3
45
3
(8)
6
(1)
5
Т
T4
4
(3)
(5)
(1)
5
4
Т
T5
6
5
(3)
(5)
4
Рис. 6.2
61

6.3. Алгоритм Прима
Алгоритм Прима отличается от алгоритма Краскала тем, что на
каждом шаге строится не просто ациклический граф, а связный ациклический граф, т. е. дерево. В литературе данный алгоритм иногда называют алгоритмом «ближайшего соседа» или «локально жадным».
Алгоритм 6.2. Алгоритм Прима
1. Выбрать ребро е1 ={a, b} минимального веса и создать дерево
= (V1, E1), где V1 = {a, b}, E1 = {e1}.
T
1
Если дерево T
2.
ние дерева T
вершинам из V
цикл с ребрами из E
Дерево T
с его не входящим в V
3.
Процесс завершить, как только будет построено дерево T
= (Vi, Ei) уже построено, то выполнить построе-
i
. Для этого среди ребер, которые инцидентны
i + 1
, не принадлежат множеству Ei и не образуют
i
, выбрать ребро e
i
получается добавлением ребра e
i + 1
концом.
i
минимального веса.
i + 1
к Ti вместе
i + 1
n − 1
.
Доказано, что дерево T
является минимальным остовом
n − 1
графа G = (V, E). Известны реализации алгоритма Прима, вычисляю-
щие минимальный остов графа порядка n за время О
(n2) [11, 16].
Пример 6.2. Рассмотрим граф G, изображенный на рис. 6.1.
Результаты поэтапного построения для него остовного дерева минимального веса с помощью алгоритма Прима приведены на рис. 6.3.
Из рис. 6.2, 6.3 видно, что порядок выбора ребер с помощью алгоритмов Краскала и Прима может быть различным. Однако в данном случае граф G имеет единственный минимальный
остов, поэтому оконча-
тельный результат работы обоих алгоритмов один и тот же.
6.4. Некоторые замечания
Если граф G не является связным, то задача о минимальном остове сводится к нахождению минимального остовного леса. Такой лес
можно построить, применяя последовательно алгоритм Краскала (или
Прима) к каждой компоненте связности графа G.
62

3
T
6
6
(1)
(1)
5
5
1
Т
1
(1)
5
(3)
2
Т
T2
(2)
2
6
4
Т
T4
4
3
(5)
(3)
4
(1)
5
1
(1)
5
(8)
Т
6
Т
T3
2
T5
(5)
(3)
(2)
(3)
(5)
4
3
4
3
6
5
Рис. 6.3
В некоторых ситуациях требуется построить остов не минимального, а максимального веса. К этой задаче также применимы алгоритмы Краскала и Прима. Следует только всюду минимальный вес
заменить на максимальный или изменить знаки весов ребер на противоположные. Более того, в алгоритмах Краскала и Прима предполагается, что вес дерева
представляет собой монотонно возрастающую
функцию от весов входящих в него ребер, т. е. при замене ребра с ве-
на ребро с весом wi < wj вес дерева уменьшается [14]. Таким
сом w
j
образом, если w
, …, w
1
– веса каких-либо n – 1 ребер, образующих
n − 1
остовное дерево графа G, то в качестве веса этого дерева можно брать,
например, величины:
+ w2 + … + w
w
1
2
w
2
+ w
1
2
⋅ w2 ⋅ … ⋅ w
w
1
+ … + w
n − 1
n − 1
2
n − 1
.
,
,
Если веса всех ребер графа G равны 1, то алгоритмы Краскала
и Прима приводят к одному из возможных остовных деревьев этого
графа.
63

6.5. Порядок выполнения задания
6.5.1. Изучить указанный в варианте задания алгоритм построения минимального остова. Разработать детальное описание алгоритма.
Считать, что на вход алгоритма поступает взвешенный граф, содержащий несколько компонент связности. На выходе алгоритм должен
выдавать перечень ребер остовного леса с указанием его отдельных
компонент. Реализовать алгоритм в виде программной процедуры.
Оформление процедуры должно
ние. Для тестирования использовать примеры 6.1, 6.2.
6.5.2. Разработать и отладить программу решения прикладной
задачи с использованием алгоритма Краскала или Прима согласно номеру варианта задания (табл. 6.1).
допускать её автономное тестирова-
6.6. Варианты
Номер варианта задания определяет алгоритм построения ми-
нимального остова и название прикладной задачи (табл. 6.1).
Таблица 6.1
Номер
варианта
1 Краскала Схема мелиорации рисовых полей
2 Прима Схема мелиорации рисовых полей
3 Краскала Проектирование надежной сети передачи
4 Прима Проектирование надежной сети передачи
5 Краскала Дерево максимального взаимопонимания
6 Прима Дерево максимального взаимопонимания
Алгоритм Задача
информации
информации
64

Схема мелиорации рисовых полей. При выращивании риса
небольшие участки земли, огороженные земляными валиками, заливают водой, а позднее, перед снятием урожая, эту воду спускают. Такие участки земли называют чеками. Вид карты рисового поля, состоящего из многих чеков, приведен на рис. 6.4. Ребра графа соответствуют земляным валикам, а вершины – точкам их пересечений. Для
заполнения чеков в некоторых земляных валиках открывают проходы
и после заполнения их водой закрывают. Каждый земляной валик характеризуется трудоемкостью установления в нем прохода. На рис. 6.4
эти трудоемкости указаны в скобках.
Требуется найти схему установления проходов в земляных валиках, которая позволяла бы открывать или закрывать все чеки рисового поля
с минимальной трудоемкостью.
(10)
4
V
v
4
(1)
(1)
(1)
v
1
1
V
(3)
(8)
6
V
(10)
(10)
v
2
V
(3)
2
(5)
v
8
8
V
(7)
(1)
(6)
11
V
v
11
(5)
v
3
(10)
3
V
(2)
(2)
(2) (1)
5
V
v
5
7
V
v
7
(1)
9
V
v
9
10
V
v
10
Рис. 6.4
Каждый чек ограничен циклом. Очевидно, что для спуска воды
достаточно в каждом цикле разрушить (или удалить) одно ребро. Если
разрушить по одному ребру в каждом цикле, то оставшиеся целыми
земляные валики образуют остовное дерево исходного графа.
Остовное дерево максимальной трудоемкости однозначно определяет места наименее затратного расположения проходов – это
ребра,
не вошедшие в этот остов.
65

Проектирование надежной сети передачи информации. На
графе, изображенном на рис. 6.5, каждая вершина представляет некоторое лицо, а ребро {v
щаться с лицом v
связи. Передаче сообщения от v
, vj} отражает тот факт, что лицо vi может об-
i
, и наоборот, т. е. между vi и vj существует канал
j
к vj приписывается вероятность pij
i
того, что послание может быть перехвачено посторонним лицом. Эти
вероятности в процентах даны на рис. 6.5.
V
v5
v1
V
(5)
v
2
2
V
(6)
(8)
1
5
(15)
(9)
(11)
V
6
v
(18)
v
6
V
4
(10)
4
(17)
(7)
(11)
V
v
(15)
11
11
(12)
(7)(3)
(18)
(9)
V
(5)
v
3
V
3
(6)
v
8
V
8
(14)
(4)
7
(13)
(2)
12
V
v
12
v
V
(19)
V
10
v
9
9
10
Рис. 6.5
Требуется определить такой способ передачи конфиденциального сообщения между 12 лицами, при котором вероятность утечки
информации будет минимальной. Очевидно, что пути передачи сообщения должны образовывать остовное дерево графа. Необходимо найти такое остовное дерево, которое минимизирует величину
С = 1 – ∏
(1 – рij),
где произведение берется по тем ребрам, которые образуют это дерево.
Поскольку функция С монотонно возрастающая относительно p
, то
ij
требуемое остовное дерево будет совпадать с минимальным остовом,
при этом веса ребер определяются следующим образом:
, vj) = pij.
w(v
i
66

Дерево максимального взаимопонимания. В коллективе, со-
стоящем из 7 человек, была произведена оценка взаимопонимания между членами коллектива по десятибалльной системе (высший балл – 10,
низший – 1). Результаты этой оценки представлены в (7 × 7)-матрице
W = {w
полного неориентированного графа порядка 7. Вершины этого графа –
сотрудники коллектива, а веса ребер – уровень взаимопонимания между сотрудниками. В этой ситуации максимальный остов полного графа
с матрицей весов W – дерево максимального взаимопонимания, которое в определенной мере характеризует наиболее эффективные контакты
буется найти это дерево.
} (рис. 6.6).
ij
77610340
⎛
⎜
⎜
W
=
⎜
⎜
⎜
⎝
Рис. 6.6
Матрицу W можно рассматривать в качестве матрицы весов
между членами коллектива при решении общих вопросов. Тре-
⎞
⎟
9344504
⎟
8231053
381001410
⎟
54010346
⎟
9048237
⎟
0953897
⎠
67

ЗАДАНИЕ 7
Построение кратчайших путей
В задании формулируется оптимизационная задача, которая интересна своими многочисленными приложениями: задача
о кратчайшем пути. Здесь рассматриваются два классических алгоритма её решения (алгоритм Дейкстры и алгоритм Флойда), которые должен знать каждый математик и программист. Цель задания: изучение
данных алгоритмов и практика их использования при решении прикладных задач.
7.1. Формулировка задачи
Пусть дан орграф G = (V, E), V = {v
m ≥ 1, дугам которого приписаны веса, устанавливаемые матрицей
W = {w
зывать длиной дуги e = (v
рая дуга (v
}. Элемент этой матрицы, т. е. число W[vi, vj] = wij, будем на-
ij
, vj). Если в орграфе G отсутствует некото-
i
, vj), положим wij = ∞. Определим длину пути как сумму
i
длин отдельных дуг, составляющих этот путь.
Задача о кратчайшем пути состоит в нахождении пути минимальной длины (кратчайшего пути) от заданной начальной вершины
V до заданной конечной вершины t ∈ V при условии, что такой
s ∈
путь существует, т. е. вершина t достижима из вершины s.
Элементы матрицы весов W могут быть положительными, отрицательными вещественными числами или нулями. Однако если орграф G содержит контур отрицательной длины, вершины которого
достижимы из s, то решение
задачи о кратчайшем пути не существует.
Действительно, если такой контур все же есть и v
вершина, то, двигаясь от s к v
, обходя данный контур достаточно
i
большое число раз и попадая, наконец, в t, можно получить путь сколь
угодно малой длины. Таким образом, для любых двух вершин s и t орграфа G с произвольной вещественной матрицей весов W решение задачи
о кратчайшем (s, t)-пути существует, если
, …, vn}, n ≥ 1, E = {e1, …, em},
1
– некоторая его
i
– вершина t достижима из
s;
– в G нет контуров отрицательной длины.
68

Предположение об ориентированности графа G несущественно, так как неориентированное ребро всегда можно «расщепить» на
две дуги противоположной ориентации и придать им длину «расщепляемого» ребра. Отсюда вытекает, что ребра не должны иметь отрицательные длины, поскольку после их «расщепления» отвечающие им
дуги противоположной направленности образуют контуры отрицательной длины.
Существует много практических интерпретаций задачи о кратчайшем пути. Например, вершины графа могут соответствовать городам, а каждая дуга – некоторой дороге, длина которой представлена
весом дуги. Выполняется поиск кратчайшего пути между городами.
Если вес дуги интерпретировать как стоимость передачи информации
между вершинами, то в этом случае ищется самый дешевый путь пе
редачи данных. Возникает другая ситуация, когда вес дуги e = (v
равен p
вероятности безотказной работы канала связи. Если предпо-
ij
, vj)
i
ложить, что отказы каналов не зависят друг от друга, то вероятность
исправности пути передачи данных равна произведению вероятностей
составляющих его дуг. Заменяя веса p
на величины qij = – log pij,
ij
поиск наиболее надежного пути можно свести к нахождению кратчайшего пути в графе. Далее рассматриваются два общеизвестных алгоритма решения задачи о кратчайшем пути [11–17].
7.2. Случай неотрицательных весов.
Алгоритм Дейкстры
Предположим, что веса дуг исходного орграфа G = (V, E) неотрицательны, т. е. W[v
случае решение задачи о кратчайшем пути является менее трудоемким, чем в общем случае. Первый эффективный алгоритм построения
кратчайшего пути в орграфе с неотрицательными весами дуг предложил голландский математик Е. Дейкстра в 1959 г.
Алгоритм Дейкстры основан на приписывании каждой вершине
V двух временных меток:
v ∈
, vj] = wij ≥ 0 для любой дуги e = (vi, vj) ∈ Е. В этом
i
-
– метка D[v] дает верхнюю оценку длины (s, v)-пути;
– метка Н[v] указывает вершину, непосредственно предшест-
вующую вершине v в этом пути.
69

Значения D[v] постепенно уменьшаются с помощью некоторой
итерационной процедуры. На каждой итерации только для одной вершины v* временные метки становятся постоянными. Это свидетельствует о том, что для вершины v* значение D[v*] – точная длина крат-
чайшего (s, v*)-пути, а Н[v*] – вершина, предшествующая вершине v*
(s, v*)-пути. Вершины с постоянными метками исключаются из
в этом
дальнейшего рассмотрения. Все такие вершины отмечаются 1 в массиве
Х, т. е. полагается Х[v*]:= 1, если v* – вершина с постоянными метками.
После того как вершина t получила постоянные метки, процесс завер-
шается. Значение D[t] дает значение кратчайшего (s, t)-пути.
Опишем этот
задан матрицей весов W = {w
алгоритм подробнее. Будем считать, что орграф G
}.
ij
Алгоритм 7.1. Алгоритм Дейкстры: определение длины
кратчайшего (s, t)-пути
1. Инициализация. Для начальной вершины s установить:
– D[s]:= 0 (кратчайший (s, s)-путь имеет длину 0);
– H[s]:= 0 (вершине s ничего не предшествует);
– X[s]:= 1 (вершина s имеет постоянные метки).
– Для каждой вершины v ∈
V, v ≠ s положить:
– D[v]:= ∞ (кратчайший (s, v)-путь имеет длину меньше ∞);
– H[v]:= 0 (вершине v ничего пока не предшествует);
– X[v]:= 0 (вершина v имеет временные метки).
Выполнить присваивание р:= s, где р – вершина, которая получила постоянные метки последней.
Обновление меток. Пусть Γ(р) – множество вершин, являю-
2.
щихся концами всех исходящих из р дуг. Для всех вершин
v ∈ Γ(р) с временными метками пересчитать значения меток по
правилу:
– если D[v] > D[p] + W[p, v], то найден более короткий (s, v)-путь
через вершину р и D[
v]:= D[p] + W[p, v], Н[v]:= p (рис. 7.1);
– иначе метки D[v] и Н[v] не менять.
Превращение временных меток в постоянные. Пусть V' – мно-
3.
жество вершин v ∈
V с временными метками (для них X[v] = 0).
Найти первую вершину v*, такую, что D[v*] = min {D[v],
v ∈
V'}. Положить Х[v*]:= 1, т. е. считать метки для v* посто-
янными.
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
