Добавил:
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. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

D[2, 1]:= min {D[2, 1], (D[2, 4] + D[4, 1])} = min {∞, (–1 + 4)} = 3;
H[2, 1]:= H[4, 1];
D[3, 1]:= min {D[3, 1], (D[3 ,4] + D[4, 1])} = min {∞, (–3 + 4)} = 1;
H[3, 1]:= H[4, 1];
D[3, 2]:= min {D[3, 2], (D[3, 4] + D[4, 2])} = min {∞, (–3 + 2)} = –1;
H[3, 2]:= H[4, 2].
Поскольку k = n, то решение получено и оно указано на рис. 7.11.
В результирующей матрице D нет отрицательных диагональных элементов. Это говорит о том, что в исходном орграфе (рис. 7.6)
туров отрицательной длины.
нет кон-
−−
3020
⎛
⎜
D =
⎜
⎜
⎝
Используя алгоритм 7.4, восстановим, например, кратчайший
(2, 1)-путь по матрице Н:
H[2, 1] = 4, H[2, 4] = 3, H[2, 3] = 2.
Следовательно, (2, 3, 4, 1) – кратчайший (2, 1)-путь длины D[2, 1] = 3.
⎞
−
1203
H =
⎟
−−
3011
⎟
0424
⎠
Рис. 7.11
⎛
⎜
⎜
⎜
⎝
1210
⎞
3204
⎟
3014
⎟
0214
⎠
7.5. Кратчайшие контуры и транзитивное замыкание
Если в алгоритме 7.3 всем элементам D[i, i] придать начальные
значения ∞, то конечное значение D[i, i] будет равно весу кратчайшего
контура, проходящего через вершину с номером i (i = 1, …, n).
Пример 7.5. Рассмотрим орграф, изображенный на рис. 7.12.
Результаты выполнения алгоритма 7.3 приведены на рис. 7.13. Значения всех диагональных элементов начальной матрицы D равны ∞.
В результирующей матрице D[1, 1] = D[2, 2] = D[3, 3] = 2. Это означает, что через каждую вершину орграфа проходит кратчайший контур
длины 2.
81

(1)
23
(1)
(1)
(1)
G
G
1
Рис. 7.12
∞∞
1
⎛
k = 0 D =
⎜
⎜
⎝
⎛
k = 1 D =
⎜
⎜
⎝
⎛
k = 2 D =
⎜
⎜
⎝
k = 3 Без изменений
С задачей определения кратчайших путей тесно связана зада-
ча вычисления транзитивного замыкания орграфа. Транзитивным
замыканием орграфа G = (V, E), V = {1, .., n}, называется орграф
G* = (V*, E*), для которого V* = V, а дуга (i, j) ∈
когда вершина j достижима из вершины i в G. Транзитивное замыкание
всегда содержит все петли – дуги вида (i, i), так как всякая вершина i ∈ V
достижима из самой себя с помощью пути длины 0 (i = 1, …, n).
Транзитивное замыкание можно найти с помощью алгоритма
Флойда, полагая веса
всех дуг равными 1.
⎞
⎟
∞
11
H =
⎟
∞∞
1
⎠
1
⎞
⎟
121
H =
⎟
∞∞∞∞1
⎠
212
⎞
⎟
121
H =
⎟
212
⎠
Рис. 7.13
⎛
⎜
⎜
⎝
⎛
⎜
⎜
⎝
⎛
⎜
⎜
⎝
Е* тогда и только тогда,
010
⎞
⎟
202
⎟
030
⎠
010
⎞
⎟
212
⎟
030
⎠
212
⎞
⎟
212
⎟
232
⎠
82

Матрица смежности В(G*) = {b
} транзитивного замыкания
ij
(или достижимости) определяется из матрицы D кратчайших путей
так:
=∞<
⎧
=
b
⎨
ji
⎩
jijiD
=
nji
, или ],[ если,1
).,...,1,( случае противном в0
В задании 4 предполагалось, что в матрице смежности петли
орграфа отмечаются числом 1. Поэтому здесь b
= 1 для всех
ii
i = 1, …, n.
2
3
B(G*) =
⎛
⎜
⎜
⎝
G*
G*
1
111
⎞
⎟
111
⎟
111
⎠
Рис. 7.14
Например, транзитивным замыканием орграфа с рис. 7.12 явля-
ется полный орграф порядка 3 (рис.7.14).
7.6. Порядок выполнения задания
7.6.1. Изучить алгоритм Дейкстры и реализовать его в виде про-
граммной процедуры. Процедура должна заканчивать работу после
получения всеми вершинами орграфа постоянных меток.
Считать, что на вход алгоритма Дейкстры поступают:
– матрица весов W = {w
} орграфа;
ij
– номера вершин s и t, для которых надо найти кратчайший
путь.
На выходе процедура должна выдавать длину кратчайшего (s, t)-
пути и сам этот путь в виде последовательности вершин орграфа. Необходимо предусмотреть промежуточную печать состояний массивов
D, H, X для каждой итерации алгоритма. При тестировании процедуры использовать примеры
7.1–7.3.
83

7.6.2. Изучить алгоритм Флойда, включая восстановление любо-
го кратчайшего (s, t)-пути по матрице Н. Реализовать алгоритм в виде
программной процедуры.
Полагать, что на вход алгоритма Флойда поступают:
– матрица весов W = {w
} орграфа;
ij
– номера вершин s и t, для которых следует найти кратчайший
путь.
На выходе процедура должна выдавать матрицу D кратчайших
путей между всеми парами вершин, а также длину кратчайшего (s, t)-
пути и сам этот путь в виде последовательности вершин орграфа. Дополнительно к этому необходимо предусмотреть промежуточную печать состояний
матриц D и Н для каждой итерации алгоритма. При
отладке процедуры использовать примеры 7.1, 7.2, 7.4, 7.5.
7.6.3. Решить прикладную задачу согласно номеру варианта за-
дания (табл. 7.3).
7.7. Варианты
Таблица 7.3
Номер
варианта
1 Сетевое планирование работ
2 Надежная вычислительная сеть
3 Система двусторонних дорог
4 Плотная система двусторонних дорог
5 Две системы двусторонних дорог
6 Система односторонних дорог
Сетевое планирование работ. Допустим, что нужно реализо-
вать большой проект и этот проект состоит из n этапов. Например, в
качестве проекта выступает строительство здания. Этап i может состоять в строительстве стен, этап j – вставка окон, этап k – прокладка
электропроводки и т. п.
На очерёдность выполнения этапов наложено ограничение пред-
шествования вида: для
всякого этапа j задано множество этапов Γ+(j),
которые должны быть завершены до того, как начнётся выполнение j.
Прикладная задача
84

+
При этом каждая пара этапов (i, j), где i ∈ Γ
чиной t
, равной минимальной задержке по времени между началом
ij
(j), характеризуется вели-
этапа i и началом этапа j.
Очевидно, что отношение предшествования между этапами
проекта можно изобразить графически, в виде так называемого сетевого графика. Вершины сетевого графика – этапы проекта. Сетевой
график содержит дугу (i, j) с весом t
, если этап i предшествует эта-
ij
пу j. По своему построению сетевой график – взвешенный безконтурный орграф. Действительно, предположение о существовании некоторого контура, содержащего вершину i, приводит к (нелепому для данной задачи) выводу о возможном повторении этапа i.
В задаче требуется найти минимальное время, необходимое для
реализации проекта. Другими словами
, нужно найти в орграфе самый
длинный путь между вершиной s, изображающей начало, и вершиной
t, изображающей завершение всех необходимых для реализации проекта работ. Самый длинный путь в сетевом графике называется критическим путем, так как этапы, относящиеся к этому пути, определя-
ют полное время реализации проекта, и всякая задержка
с началом
выполнения любого из этих этапов приводит к задержке выполнения
проекта в целом.
С помощью изменения знаков для всех t
(i, j = 1, …, n) дан-
ij
ную задачу можно свести к задаче о кратчайшем (s, t)-пути, которая
в этом случае будет иметь решение, поскольку сетевой график не имеет контуров. Вершина s – одна из вершин, для которых полустепень
+
захода равна 0, т. е. d
рых полустепень исхода равна 0, т. е. d
(s) = 0. Вершина t – одна из вершин, для кото-
–
(t) = 0. Разумно предположить,
что такие вершины s и t всегда единственные, поскольку этого всегда
можно добиться введением фиктивных вершин и дуг.
Исходные данные: сетевой график, заданный матрицей весов
(временных задержек).
Результаты: длина критического (s, t)-пути и сам (s, t)-путь.
Рекомендация. Использовать алгоритм Флойда. Алгоритм Дейк-
стры применять
в данном случае нельзя (почему?). Предусмотреть
поиск вершин s и t.
Разработанную программу применить для вычисления критического пути сетевого графика, изображенного на рис. 7.15. Числа в скобках,
стоящие у дуг, указывают продолжительность задержек в днях.
85

Начало
1
(10)
(5)
(7)
2
(19)
(11)
4
(9)
(16)
3
5
(11)
(3)
7
(8)
(30)
(14)
6
(13)
10
(26)
(30)
(17)
8
(15)
(18)
(21)
9
(8)
(12)
(7)
13 14
Конец
12
(14)
(19)
11
Рис. 7.15
Надежная вычислительная сеть.
Имеется вычислительная
сеть, состоящая из n центров хранения и переработки информации.
Некоторые пары центров соединены каналами двусторонней связи.
Обмен информацией между любыми двумя центрами осуществляется
либо непосредственно по соединяющему их каналу, если он есть, либо
через другие каналы и центры. Всякий канал, непосредственно связывающий центр i с центром j,
характеризуется величиной рij – вероятностью безотказной работы (или надежностью). Требуется для любой
пары s и t центров сети найти наиболее надежный (s, t)-путь обмена
информацией.
Такой сети естественно сопоставить неориентированный взвешенный граф: вершины – центры, ребра – каналы сети, веса ребер –
надежность каналов. Если каждое ребро «расщепить» на две дуги противоположной ориентации
и придать им вес «расщепляемого» ребра,
то получим взвешенный орграф. Надежность всякого (s, t)-пути в этом
орграфе определяется формулой
Ρ(s, t) = ∏ p
,
ij
где произведение берется по всем тем дугам, которые образуют (s, t)-путь.
Здесь предполагается, что отказы каналов не зависят друг от друга.
Задача нахождения наиболее надежного (s, t)-пути сводится
к задаче о кратчайшем (s, t)-пути с матрицей весов Q = {q
рая получается из исходной матрицы весов W = {p
ij
}, кото-
ij
} следующим
образом:
86

≤<−
⎧
=
q
⎨
ji
⎩
ji
pp
jiji
==∞
njip
,10 если,log
).,...,1,( 0 если,
Действительно, логарифмирование обеих частей вышеуказанной формулы надежности (s, t)-пути приводит к соотношению
log Ρ(s, t) =
∑ log p
= – ∑ qij,
ij
где суммирование берется по всем дугам, которые образуют (s, t)-путь.
Учитывая, что 0 < p
≤ 1, имеем q
ij
≥ 0 (i, j = 1, …, n).
ij
Исходные данные: граф, заданный матрицей весов (вероятностей безотказной работы); s и t – номера вершин графа.
Результаты: наиболее надежный (s, t)-путь.
Рекомендация. Использовать алгоритм Флойда.
Разработанную программу применить для нахождения наиболее
надежного (s, t)-пути в графе, изображенном на рис. 6.5 (см. задание 6).
Учесть, что
вероятности pij указаны на рис. 6.5 в процентах.
Система двусторонних дорог. Задана система двусторонних
дорог, соединяющих между собой n городов. Всякая дорога, непосредственно связывающая город i с городом j, характеризуется длиной w
. Очевидно, что такой системе дорог соответствует неориенти-
ij
рованный взвешенный граф: вершины – города, ребра – дороги, веса
ребер – длины дорог. Если граф связен, то для любой пары городов s
и t всегда существует хотя бы один (s, t)-путь, т. е. город t достижим
из города s.
Требуется найти:
– столицу, т. е
. такой город, для которого сумма расстояний до
остальных городов минимальна (под расстоянием между двумя городами понимается длина кратчайшего пути, соединяющего эти города);
– кратчайшие пути движения от столицы до всех других горо-
дов;
– K-периферию для заданного целого числа K (K-периферией
называется множество городов, расстояния от которых
до
столицы больше K км).
87

Если каждое ребро графа «расщепить» на две дуги противоположной направленности и придать им вес «расщепляемого» ребра, то
получим взвешенный орграф. Применив к орграфу алгоритм Дейкстры
и построив для каждой вершины дерево кратчайших путей, можно
дать ответы на все сформулированные ранее задачи. Однако гораздо
проще здесь воспользоваться алгоритмом Флойда.
Исходные
данные: связный граф, заданный матрицей весов дуг
(длин дорог), число K – расстояние для выделения периферии.
Результаты: номер вершины, которая является столицей; список дуг, образующих дерево кратчайших путей с корнем в столице;
номера вершин, входящих в K-периферию.
Рекомендация. Решить задачу с помощью алгоритма Флойда.
Расчеты выполнить для графа с рис. 6.5 (см. задание 6). Веса ребер этого графа – длины дорог.
Плотная система двусторонних дорог. Этой системе дорог со-
ответствует взвешенный мультиграф, который отличается от графа
тем, что в нем одна и та же пара различных вершин может быть связана более чем одним ребром. Такие ребра называются кратными. Каждое из кратных ребер, связывающих вершины i и j, имеет свой собственный вес. В
таком мультиграфе: вершины – города, ребра – дороги,
веса ребер – длины дорог.
Требуется для заданной пары городов найти кратчайший путь между ними (с точностью до дорог, через которые проходит этот путь).
Для решения задачи необходимо вначале мультиграф преобразовать в обыкновенный граф, а затем последний – в орграф «расщеплением» каждого ребра на две дуги противоположной направленности.
Пусть в мультиграфе G = (V, E), V = {1, .., n}, имеются два
кратных ребра е
= {i, j} и e2 = {i, j} с весами w
1
1
и w
ij
2
соответст-
ij
венно. Устранить кратность этих ребер, т. е. научиться их различать,
можно путем установки на кратных ребрах двух фиктивных вершин.
Например, так, как это указано на рис. 7.16. Фиктивные вершины играют роль промежуточных населенных пунктов, через которые проходят дороги, связывающие одну и ту же пару городов. Очевидно, что
преобразование не влияет на длины кратчайших путей и позво-
такое
ляет однозначно идентифицировать кратные ребра. Однако оно увеличивает число вершин, т. е. размерность задачи.
88

j
j
j
j
j
j
1
i
w
i
2
w
i
j
1
w
i
i
w
/ 2
2
i
1
1
w
/ 2
i
j
2
j
/ 2
i
w
/ 2
1
i
Рис. 7.16
Исходные данные: связный мультиграф, заданный перечнем ребер
с указанием веса каждого ребра; s и t – номера вершин мультиграфа.
Результаты: длина кратчайшего (s, t)-пути и сам это путь,
включая фиктивные вершины (промежуточные населенные пункты).
Именно фиктивные вершины уточняют, по каким дорогам проходит
кратчайший путь.
Рекомендация. По перечню ребер необходимо сформировать
матрицу весов, вводя фиктивные вершины для кратных ребер. Для
поиска кратчайших путей использовать алгоритм Дейкстры.
Разработанную программу применить для графа, изображенного
на рис. 7.17.
2
(10) (8)
1
(5)
(7)
(12)
(10)
(9)
(8)
3
(7)
(4)
5
(3)
4
(2)
(4)
6
Рис. 7.17
Две системы двусторонних дорог. Заданы две системы дву-
сторонних дорог (железных и шоссейных) с одним и тем же множеством городов V = {1, ..., n}. Система железных дорог описывается неориентированным графом G
а система шоссейных дорог − неориентированным графом G
с матрицей весов Q = {q
= (V, E1) с матрицей весов P = {pij},
1
= (V, E2)
2
}. Здесь вершины – города, ребра – дороги,
ij
веса ребер – длины дорог.
Требуется найти кратчайший путь из города s в город t, который может проходить как по железным, так и по шоссейным дорогам.
Кроме того, необходимо указать города, определяющие места пересадок с одного транспорта на другой вдоль этого пути.
89

Данную задачу можно решать различными способами. Например, она может быть решена с использованием алгоритмов Дейкстры
с матрицей весов W = {w
}, которая определяется по правилу:
ij
= min {pij, qij}, (i, j = 1, ..., n).
w
ij
Примечательно, что для неориентированных графов G
и G2 матри-
1
цы весов симметричны, т. е. в них фактически реализовано «расщепление» каждого ребра на две дуги противоположной направленности.
Для определения мест пересадок требуется формировать вспомогательную матрицу Z = {z
– если p
– иначе z
< qij, то z
ij
= 1 (дуга (i, j) соответствует шоссейной дороге).
ij
} следующим образом:
ij
= 0 (дуга (i, j) отвечает железной дороге);
ij
Исходные данные: два связных графа, заданных своими матрицами весов P и Q; s и t – номера вершин, между которыми следует
найти кратчайший путь.
Результаты: длина кратчайшего (s, t)-пути и сам этот путь,
включая номера вершин, которые задают места пересадок.
Рекомендация. Использовать алгоритм
Дейкстры.
Разработанную программу применить для систем дорог, изображенных в виде одного графа с двумя типами ребер (рис. 7.18). Темные ребра – железные дороги, светлые ребра – шоссейные дороги.
(1)
1
(7)
(1)
(5)
2
(10)
(7)
(4)
(6)
3
(1)
6
(3)
5
(1)
(10)
(5)
4
(3)
(5)
(10)
(3)
7
(2)
(1)
8
(10)
9
Рис. 7.18
Система односторонних дорог. Задана система односторонних
дорог, соединяющих между собой n городов. Всякая дорога, идущая
из города i в город j, характеризуется длиной w
. Очевидно, что та-
ij
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
