Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]