Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
4.
Подготовка к следующей итерации или завершение процесса.
Положить р:= v*. Если р = t, то найден кратчайший (s, t)-путь, при этом D[t] – длина этого пути. Иначе возврат к пункту 2.
p
D[v]
Γ(p)
v
D[p] W[p, v]
s
Рис. 7.1
Сам кратчайший (s, t)-путь можно извлечь из Н с помощью сле-
дующего алгоритма.
Алгоритм 7.2. Алгоритм Дейкстры: нахождение последовательности вершин кратчайшего (s, t)-пути
1.
Начать с вершины t. Для этого положить v:= t и вывести v
в качестве вершины кратчайшего (s, t)-пути.
До тех пор пока v s (не достигнута начальная вершина) вы-
2. полнять действия:
– v:= H[v], где H[v] задает номер вершины, предшествующей v; – вывод v в качестве очередной вершины кратчайшего (s, t)-
пути.
При v = s процесс завершить. Выведенная последовательность
3.
вершин указывает кратчайший (s, t)-путь в обратном порядке. Оценим время работы алгоритма Дейкстры. Вычислительные за-
траты максимальны, когда вершина t получает постоянные метки по­следней и G является полным орграфом без петель. В этом случае чис­ло итераций алгоритма 7.1 равно n – 1, т. е
. каждый из его пунктов 2–4
выполняется n – 1 раз. Очевидно, что пункт 4 выполняется за время
(1), а для выполнения пунктов 2, 3 достаточно времени О (n). Таким
О
образом, в целом время определения кратчайшего (s, t)-пути составляет
(n2). Заметим, что построение последовательности вершин, образую-
О
щих кратчайший (s, t)-путь, можно осуществить за время О в целом время работы алгоритма Дейкстры составляет O(n
(n). Значит,
2
).
71
Пример 7.1. Пусть требуется найти кратчайший путь между
вершинами 1 и 8 в орграфе, изображенном на рис. 7.2. Матрица весов графа приведена на рис. 7.3 (пустые места матрицы соответствуют значению ∞). Веса дуг на рис. 7.2 даны в скобках.
2
(2)
(6)
1
(1)
(7)
3
4
(3) (2)
(9)
(5)
(2)
(1)
(3)
5
6
(2)
(2)
7
8
(1)
Рис. 7.2
__9_612_
⎞ ⎟
___53___
__71____
__22____
_3______
⎟ ⎟
22______
1_______
________
W =
⎛ ⎜
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜
Рис. 7.3
Алгоритм 7.1 работает следующим образом.
Инициализация.
Для начальной вершины с номером 1 полагаем
D[1]:= 0, Н[1]:= 0, X[1]:= 1. Эта вершина получает постоянные метки, поэтому р:= 1. Для всех остальных вершин D[i]:= ∞, Н[i]:= 0, X[i]:= 0, i = 2, …, 8. Эти вершины пока имеют временные метки.
Первая итерация. Обновление меток: Γ(1) = {2, 3, 4, 6}; все
метки для вершин из Γ(1) временные; полагаем
D[2]:= min {∞, 0 + 2} = 2, H[2]:= 1;
[3]:= min {, 0 + 1} = 1, H[3]:= 1;
D D[4]:= min {, 0 + 6} = 6, H[4]:= 1; D[6]:= min {, 0 + 9} = 9, H[6]:= 1.
72
Превращение временных меток в постоянные метки:
min {D[2], D[3], D[4], D[5], D[6], D[7], D[8]}= = min {2, 1, 6, , 9, ∞, ∞} = 1 = D[3].
Полагаем X[3]:= 1 и р:= 3, т. е. для вершины 3 метки становятся посто­янными.
Вторая итерация. Обновление меток: Γ(3) = {5, 6}; обе верши-
ны имеют временные метки; обновляем их:
D[5]:= min {, 1 + 1} = 2, H[5]:= 3;
D[6]:= min {9, 1 + 7} = 8, H[6]:= 3.
Превращение временных
min {D[2], D[4], D[5], D[6], D[7], D[8]}= = min {2, 6, 2, 8, ∞, ∞} = 2 = D[2].
Метки для вершины 2 становятся постоянными, поэтому X[2]:= 1 и р:= 2.
Последующие итерации. Продолжая этот процесс, получим картину,
представленную в табл. 7.1 (постоянные метки отмечены полужирным шрифтом). На шестой итерации алгоритма 7.1 конечная вершина с номером 8 получает постоянные метки. Алгоритм
Однако если выполнить еще одну – седьмую итерацию, то все
восемь вершин орграфа будут иметь постоянные метки. Это значит, что определены все кратчайшие (1, i)-пути, где i = 2, ..., 8. Например, алгоритм 7.2 дает такой кратчайший (1, 8)-путь:
Его длина равна D[8] = 6. На рис. 7.2 кратчайший (1, 8)-путь выделен темными дугами. Кратчайший (1, 6)-путь таков:
Этот путь
имеет длину D[6] = 7.
меток в постоянные метки:
завершает работу.
(1, 3, 5, 7, 8).
(1, 2, 4, 6).
73
Таблица 7.1
Γ
Γ
Итерация Вершины
№ Метки 1 2 3 4 5 6 7 8
D[i]
0
Н[i]
X[i]
D[i]
1
Н[i]
X[i]
D[i]
2
Н[i]
X[i]
D[i]
3
Н[i]
X[i]
D[i]
4
Н[i]
X[i]
D[i]
5
Н[i]
X[i]
D[i]
6
Н[i]
X[i]
D[i]
7
Н[i]
X[i]
∞ ∞ ∞ ∞ ∞ ∞ ∞
0
0 0 0 0 0 0 0
0
0 0 0 0 0 0 0
1
2
0
1
0
0
1
0 2 1
0 1 1
1 1 1
0 2 1 5 2
0 1 1 2 3
1 1 1 0 1
0 2 1 5 2
0 1 1 2 3
1 1 1 1 1
0 2 1 5 2 7 5
0 1 1 2 3 4 5
1 1 1 1 1 0 1
0 2 1 5 2 7 5 6
0 1 1 2 3 4 5 7
1 1 1 1 1 0 1 1
0 2 1 5 2 7 5 6
0 1 1 2 3 4 5 7
1 1 1 1 1 1 1 1
6 9 ∞ ∞
1
1 0 1 0 0
1
0 0 0 0 0
1
6 2 8 ∞ ∞
1 3 3 0 0
0 0 0 0 0
8 ∞ ∞
3 0 0
0 0 0 8 5
3 5 0
0 0 0
0
0
Примечание
Инициализация
р = 1
Γ(1) = {2, 3, 4, 6}
p = 3
Γ(3) = {5, 6}
p = 2
Γ(2) = {4, 5}
p = 5
Γ(5) = {7}
p = 4
Γ(4) = {5, 6}
p = 7
(7) = {8}
p = 8
Достигнута вершина
t = 8
(8) = ∅
p = 6
Метки всех вершин
постоянные
74
Пример 7.2. Пусть требуется найти кратчайший (1, 3)-путь в
орграфе с одной отрицательной дугой (рис. 7.4). Применение алгорит­ма Дейкстры к данному орграфу дает длину кратчайшего (1, 3)-пути, равную 1 (табл. 7.2). Однако из рис. 7.4 видно, что это не соответству­ет действительности.
2
(1)
(-5)
3
(5)
1
Рис. 7.4
Таблица 7.2
Итерация Вершины Примечание
Метки 1 2 3
1
2
D[i]
Н[i]
X[i]
D[i]
Н[i]
X[i]
0
0
1
0
0
1
0 0
0 0
5
1
1
1
0
1
Инициализация
р = 1
Γ(1) = {2, 3}
p = 3
Достигнута
вершина t = 3
Данный пример показывает неприменимость алгоритма Дейкст-
ры к орграфу с произвольной матрицей весов.
7.3. Дерево кратчайших путей
Решение ряда прикладных задач сводится к нахождению дерева
кратчайших путей с корнем в заданной вершине s. Такое дерево дает
кратчайшие (s, v)-пути от заданной вершины s до любой вершины
V орграфа G = (V, E). Если веса всех дуг орграфа G неотрица-
v
тельны, то дерево кратчайших путей можно построить с помощью ал­горитма Дейкстры.
75
Для этого пункт 4 алгоритма 7.1 необходимо модифицировать
так, чтобы алгоритм заканчивал работу только после получения всеми вершинами постоянных меток. Если к тому же вместе с превращением меток вершины v* в постоянные (пункт 3 алгоритма) заносить дугу (H[v*], v*) во множество Y, то после завершения работы алгоритма граф T = (V, Y) – дерево любой вершины v
кратчайших путей с корнем в вершине s. Для
V единственный (s, v)-путь в дереве T является
кратчайшим (s, v)-путем в орграфе G.
Пример 7.3. На рис. 7.5 изображено дерево T = (V, Y) кратчай-
ших путей для орграфа из примера 7.1.
2
(3)
(2)
4
(2)
6
1
(1)
(1)
3
(3)
75
8
(1)
Рис. 7.5
Вершина 1 – корень дерева. Дуги дерева будут записываться в
Y согласно порядку: (1, 3), (1, 2), (3, 5), (2, 4), (5, 7), (7, 8), (4, 6).
7.4. Случай произвольной матрицы весов. Алгоритм Флойда
Рассмотрим алгоритм нахождения кратчайших путей между
всеми парами вершин орграфа G = (V, E), где V = {1, .., n}. Этот алго­ритм был предложен Р. Флойдом в 1962 г. и применим как к неотрица­тельным, так и к произвольным матрицам весов.
Алгоритм Флойда базируется на последовательности n преобра-
зований (итераций) начальной матрицы весов W = {w итерации матрица представляет длины кратчайших путей между каждой парой вершин с тем ограничением, что всякий (i, j)-путь содержит в каче- стве промежуточных только вершины из множества {1, ..., k} V.
}. При этом на k-й
ij
76
Считается, что орграф G = (V, E), V = {1, .., n} задан матрицей
весов W, при этом W[v
, vi] = 0 для i = 1, ..., n, и W[vi, vj] = ∞, если
i
в орграфе отсутствует дуга (i, j). Для того чтобы после окончания алгоритма иметь возможность найти кратчайший путь между какой­либо парой вершин, необходимо хранить и обновлять матрицу Н. Элемент Н[i, j] указывает вершину, непосредственно предшествую­щую вершине j в кратчайшем (i, j)-пути. Между тем длины кратчай- ших путей формируются в матрице D.
Алгоритм 7.3. Алгоритм Флойда: определение длин кратчайших путей между всеми парами вершин
1. Инициализация. Записать в D исходную матрицу весов W. Сформировать начальное состояние матрицы H:
– если W[i, j] =
или i = j, то положить H[i, j]:= 0,
– иначе Н[i, j]:= i, т. е. при наличии в орграфе дуги (i, j) верши-
на i непосредственно предшествует вершине j.
Установить k:= 0, где k – номер итерации алгоритма.
Текущая итерация. Положить k:= k + 1. Для всех i V и j V,
2.
таких, что ik и jk, выполнить пересчет длины (i, j)-пути по правилу
D[i, j]:= min {D[i, j], (D[i, k] + D[k, j])}.
Если оказалось, что
D[i, k] + D[k, j
] < D[i, j],
то найден более короткий (i, j)-путь через вершину k. Этот путь следу­ет запомнить, полагая
H[i, j]:= H[k, j].
Проверка на завершение процесса:
3. – если существует такое i, что D[i, i] < 0, то в орграфе G суще-
ствует контур отрицательного веса, содержащий вершину с номером i. Останов, решения нет;
– если все D[i, i] ≥ 0 и k = n, то решение получено. Останов,
матрица D дает длины всех кратчайших путей;
если все D[i, i] ≥ 0, но k < n, то вернуться к пункту 2, т. е. ите-
рационный процесс продолжить.
77
После завершения работы алгоритма 7.3 любой (i, j)-путь легко из-
влечь из матрицы Н с помощью следующего алгоритма.
Алгоритм 7.4. Алгоритм Флойда: нахождение последовательности вершин кратчайшего (i, j)-пути
1.
Начать с вершины j. Для этого положить q:= j и вывести q в
качестве вершины (i, j)-пути.
До тех пор пока q i (не достигнута начальная вершина) вы-
2. полнять действия:
q:= H[i, q], где H[i, q] задает вершину, предшествующую q; – вывод q в качестве очередной вершины кратчайшего (i, j)-
пути.
При q = i процесс завершить. Выведенная последовательность
3.
вершин указывает кратчайший (i, j)-путь в обратном порядке.
Обоснование оптимальности решения, полученного с помощью
алгоритма Флойда, можно найти в [16].
Оценим сложность алгоритма Флойда. Очевидно, что для вы-
полнения каждого из пунктов 1–3 алгоритма 7.3 достаточно времени
2
). Поскольку данный алгоритм выполняет не более чем n итера-
O(n ций, то его сложность составляет O(n
3
). Построение последовательно-
сти вершин, составляющих всякий кратчайший (i, j)-путь, с помощью алгоритма 7.4 можно выполнить за время О(n). Значит, в целом время
3
работы алгоритма Флойда составляет O(n
).
Пример 7.4.
Рассмотрим орграф, изображенный на рис. 7.6.
Требуется найти в нем кратчайшие пути между всеми парами вершин.
(3)
(-2)
2
(5)
1
(-3)
(4)
4
(-3)
(5)
Рис. 7.6
78
(2)
3
Алгоритм 7.3 работает следующим образом.
Инициализация. Полагаем k:= 0. Начальный вид матрицы D и
H указан на рис. 7.7.
3320
⎛ ⎜
D =
⎜ ⎜ ⎝
Первая итерация (k = 1). Выполняем пересчет всех элементов
матрицы D, кроме первой строки и первого столбца. Одновременно вносим изменения в соответствующие элементы матрицы Н.
Для D[2, 2] имеем:
D[2, 2]:= min {D[2, 2], (D[2, 1] + D[1, 2])} = min {0, (∞ – 2)} = 0,
т. е. элементы D[2, 2] и H[2, 2] остаются без изменений.
Далее
D[2, 3]:= min {D[2, 3], (D[2, 1] + D[1, 3])} = min {2, (∞ + 3)} = 2,
т. е. элементы
Продолжая этот процесс, убеждаемся, что изменяются только
значения D[4, 2] и H[4, 2]:
D[4, 2]:= min {D[4, 2], (D[4, 1] + D[1, 2])} = min {5, (4 – 2)} = 2;
H[4, 2]:= H[1, 2].
Обновленный вид матриц D и H приведен на рис. 7.8. Посколь-
ку все диагональные элементы матрицы D неотрицательны и k < n
(k = 1, n = 4), то выполняем следующую итерацию.
D[2, 3] и H[2, 3] остаются без изменений.
⎛ ⎜
D =
⎜ ⎜ ⎝
⎞ ⎟
20
20
H =
30
0554
Рис. 7.7
3320
⎞ ⎟
H =
30
0524
Рис. 7.8
⎛ ⎜
⎜ ⎜ ⎝
⎛ ⎜
⎜ ⎜ ⎝
1110
⎞ ⎟
0200
3000
0444
1110
⎞ ⎟
0200
3000
0414
79
Вторая итерация (k = 2). Пересчету подлежат все элементы
матрицы D, кроме второй строки и второго столбца. Однако в дейст­вительности изменяются лишь следующие элементы:
D[1, 3]:= min {D[1, 3], D[1, 2] + D[2, 3]} = min {3, (–2 + 2)} = 0;
H[1, 3]:= H[2, 3];
D[4, 3]:= min {D[4, 3], (D[4, 2] + D[2, 3])} = min {5, (2 + 2)} = 4;
H[4, 3]:= H[2, 3].
Обновленный вид матриц D и H приведен на рис. 7.9. Все
диагональные элементы матрицы D неотрицательны
n = 4). Процесс продолжается.
и k < n (k = 2,
3020
⎛ ⎜
D =
⎜ ⎝
Третья итерация (k = 3). Пересчету подлежат все элементы мат-
рицы D, кроме третьей строки и третьего столбца. Изменяется лишь один из них D[2, 4], для него также обновляется элемент H[2, 4]:
D[2, 4]:= min {D[2, 4], (D[2, 3] + D[3, 4])} = min {, (2 – 3)} = –1;
H[2, 4]:= H[3, 4].
Обновленный вид матриц D и H приведен на рис. 7.10. Все диа-
гональные элементы матрицы Процесс продолжается.
⎛ ⎜
D =
⎜ ⎝
Четвертая итерация (k = 4). Пересчету подлежат все элементы
матрицы D, кроме последней строки и последнего столбца. Изменяют свои значения только следующие элементы:
⎞ ⎟
20
H =
30
0424
Рис. 7.9
D неотрицательны и k < n (k = 3, n = 4).
3020
⎞ ⎟
120
H =
30
0424
Рис. 7.10
⎛ ⎜
⎜ ⎜ ⎝
⎛ ⎜
⎜ ⎜ ⎝
1210
⎞ ⎟
0200
3000
0214
1210
⎞ ⎟
3200
3000
0214
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]