|
Дискретная Математика. Учебное пособие Допущено научнометодическим советом по математике вузов СевероЗапада в качестве учебного пособия для студентов вузов, обучающихся по специальностям 220200
3.10. Нахождение кратчайших путей. Алгоритм Дейкстры Рассмотрим еще несколько алгоритмов нахождения кратчайшего пути между двумя заданными вершинами в ориентированной сети. Пусть , ,U S G - ориентированный граф со взвешенными дугами. Обозначим s - вершину - начало пути и t - вершину – конец пути. Общий подход к решению задачи о кратчайшем пути был развит американским математиком Ричардом Беллманом , который предложил название динамическое программирование. Задача о кратчайшем пути частный случай следующей задачи: найти в заданном графе пути, соединяющие две заданные вершины и доставляющие минимум или максимум некоторой аддитивной функции, определенной на путях. Чаще всего эта функция трактуется как длина пути и задача называется задачей о кратчайших путях. Алгоритм Дейкстры одна из реализаций этой задачи. Его часто называют алгоритмом расстановки меток. В процессе работы этого алгоритма узлам сети S x i приписываются числа (метки) i x d , которые служат оценкой длины (веса) кратчайшего пути от вершины s к вершине i x . Если вершина i x получила на некотором шаге метку i x d , это означает, что в графе G существует путь из s в i x , имеющий вес i x d . Метки могут находиться в двух состояниях – быть временными или постоянными. Превращение метки в постоянную означает, что кратчайшее расстояние от вершины s до соответствующей вершины найдено. Алгоритм Дейкстры содержит одно ограничение – веса дуг должны быть положительными. Сам алгоритм состоит из двух этапов. На первом этапе находится длина кратчайшего пути, на втором – строится сам путь от вершины s к вершине t . Этап 1. Нахождения длины кратчайшего пути. Шаг 1. Присвоение вершинам начальных меток. Полагаем 0 s d и считаем эту метку постоянной (постоянные метки помечаются сверху звездочкой). Для остальных вершин s x S x i i , полагаем i x d и считаем эти метки временными. Пусть x s x
,
- обозначение текущей вершины. Шаг 2. Изменение меток. Для каждой вершины i x с временной меткой, непосредственно следующей за вершиной x , меняем ее метку в соответствии со следующим правилом: ,
ω
, min i i стар i нов x x x d x d x d (3.10.1) Шаг 3. Превращение метки из временной в постоянную. Из всех вершин с временными метками выбираем вершину j x с наименьшим значением метки временная , min j j j j x d S x x d x d (3.10.2) Превращаем эту метку в постоянную и полагаем
j x x Шаг 4. Проверка на завершение первого этапа. Если t x
, то x d - длина кратчайшего пути от s до t . В противном случае происходит возвращение ко второму шагу. Едсгер Дейкстра (1930 - 2002) – нидерландский математик. Ричард Эрнест Беллман (1920 – 1984) – американский математик.
67 Этап 2. Построение самого кратчайшего пути. Шаг 5. Последовательный поиск дуг кратчайшего пути. Среди вершин, непосредственно предшествующих вершине x с постоянными метками, находим вершину i x , удовлетворяющую соотношению
, ω
x x x d x d i i (3.10.3) Включаем дугу x x i
, в искомый путь и полагаем
i x x Шаг 6. Проверка на завершение второго этапа. Если s x
, то кратчайший путь найден – его образует последовательность дуг, полученных на пятом шаге и выстроенных в обратном порядке. В противном случае возвращаемся к пятому шагу. Пример 1. Задана весовая матрица сети G . Найти минимальный путь из вершины 1 x в вершину 6 x по алгоритму Дейкстры. 3 x 13 , 6 , 7 8 9 15 , 0 6 4 x 5 9 , 6 x 1 x 9 2 x 6 11 6 6 4 11 , 5 x Рис. 3.29. На рисунке 3.29 изображен сам граф по данной матрице весов. Поскольку в данном графе есть цикл между вершинами 2 x , 3 x и 5 x , то вершины графа нельзя упорядочить по алгоритму Фалкерсрна. На рисунке графа ременные и постоянные метки указаны над соответствующей вершиной. Итак, распишем подробно работу алгоритма Дейкстры по шагам. Этап 1. Шаг 1. Полагаем 1 1
, 0 x x x d , 6 5 4 3 2 x d x d x d x d x d 1-я итерация. Шаг 2. Множество вершин, непосредственно следующих за 1
x x с временными метками , ,
5 4 2 x x x S Пересчитываем временные метки этих вершин 11 11 0 , min , 6 6 0 , min , 9 9 0 , min 5 4 2 x d x d x d Шаг 3. Одна из временных меток превращается в постоянную
, 6 11, 6, , , 9 min 4 4 x x x d Шаг 4. 6 4
x t x x , происходит возвращение на второй шаг. 2-я итерация. Шаг 2. 9 5 6 , 9 min , , ,
2 5 3 2 x d x x x S , 13 7 6 , min 3 x d , 11 6 6 , 11 min 5 x d Шаг 3.
, 9 11, 13, , 9 min , , , min 2 2 6 5 3 2 x x x d x d x d x d x d Шаг 4. 6 2 x x , возвращение на второй шаг. 3-я итерация. Шаг 2. 13 8 9 , 13 min ,
3 3 x d x S Шаг 3.
, 11 11, 13, min , , min 5 5 6 5 3 x x x d x d x d x d Шаг 4. 6 5 x x , возвращение на второй шаг. 4-я итерация. Шаг 2. 15 4 11 , min ,
6 6 x d x S Шаг 3.
, 13 5 1 13, min , min 3 3 6 3 x x x d x d x d Шаг 4. 6 3 x x , возвращение на второй шаг. 5-я итерация. Шаг 2. 15 9 13 , 15 min ,
6 6 x d x S 4 6 6 7 5 9 6 8 11 6 9 6 5 4 3 2 1 6 5 4 3 2 1 x x x x x x x x x x x x
68 Шаг 3. , 15 15 min min 6 6 xxxd Шаг 4. , 6 6 xtx конец первого этапа. Этап 2. Шаг 5. Составим множество вершин, непосредственно предшествующих 6 xx с постоянными метками , 5 3 xxS Проверим для этих двух вершин выполнение равенства (3.10.3). , ω 9 13 15 , , ω 4 11 15 6 3 3 6 5 5 xxxdxdxxxdxd Включаем дугу 6 5 , xx в кратчайший путь. 5 xx Шаг 6. 1 xsx , возвращение на пятый шаг. 2-я итерация. Шаг 5. , 4 1 xxS , ω 6 6 11 , , ω 11 0 11 5 4 4 5 1 1 xxxdxdxxxdxd Включаем дугу 5 1 , xx в кратчайший путь. 1 xx Шаг 6. 1 xsx , завершение второго этапа. Итак, кратчайший путь от вершины 1 x до вершины 6 x построен. Его длина (вес) равна 15, сам путь образует следующая последовательность дуг , , μ 6 5 5 1 xxxx 3.11. Нахождение кратчайших путей. Алгоритм Беллмана - Мура Если веса – произвольные числа и граф G не содержит ориентированных циклов отрицательного веса, то минимальный путь может быть найден алгоритмом Беллмана – Мура, похожим на алгоритм Дейкстры. Этот алгоритм часто называют алгоритмом корректировки меток. Как и в алгоритме Дейкстры всем вершинам приписываются метки, однако здесь нет деления меток на временные и постоянные. Корректировка меток осуществляется по старому правилу (3.10.1), однако выполнение условия (3.10.2) теперь не гарантирует, что длина кратчайшего пути от s до jx найдена, так как наличие в графе G дуг с отрицательными весами может уменьшить эту метку на последующих шагах. Поэтому в алгоритме Беллмана – Мура вместо процедуры превращения временной метки в постоянную формируется очередь вершин, которые нужно просмотреть для анализа возможности уменьшения по правилу (3.10.1) меток вершин, не находящихся в данный момент в очереди, но достижимых из нее за один шаг. В процессе работы алгоритма одна и та же вершина может несколько раз вставать в очередь, а затем покидать ее. Алгоритм Беллмана – Мура состоит из двух этапов. На первом этапе находятся длины кратчайших путей от вершины s до всех остальных вершин графа. Этот этап заканчивается при отсутствии вершин в очереди. Второй этап – построение кратчайшего пути от s до t совпадает с соответствующим этапом в алгоритме Дейкстры и выполняется по формуле (3.10.3). Опишем подробно все шаги алгоритма. Этап 1. Нахождение длин кратчайших путей от вершины s до всех остальных вершин графа. Шаг 1. Присвоение начальных значений. , , , , 0 sxSxxdsdjj xQ - множество вершин в очереди. Шаг 2. Корректировка меток и очереди. Элиаким Гастингс Мур (1862 – 1932) – американский математик. 69 Удаляем из очереди Q вершину, находящуюся в самом начале очереди. Для каждой вершины ix , непосредственно достижимой из x , корректируем ее метку по формуле (3.9.1). Если при этом iстарiновxdxd , то корректируем очередь вершин, иначе продолжаем перебор вершин и корректировку временных меток. Корректировка очереди. Если ix не была ранее в очереди и не находится в ней в данный момент, то вершину ix ставим в конец очереди. Если же ix уже была когда-нибудь ранее в очереди или находится там в данный момент, то переставляем ее в начало очереди. Шаг 3. Проверка на завершение первого этапа. Если QØ, то возвращаемся к началу второго шага, если же QØ, то первый этап закончен, то есть минимальные расстояния от s до всех вершин графа найдены. Рассмотрим подробный пример 1. Пусть граф G задан весовой матрицей 2 x (∞,4) 5 x (∞,10,5,-3) 6 3 4 -8 7 9 1 x (0) -7 5 6 x (∞,8,0) 6 3 x (∞,11,4) 8 4 x (∞,6,-4) Рис. 3.30. На рисунке 3.30 изображен исходный граф по матрице весов. Рассчитаем кратчайший путь от узла 1 x до узла 6 x . Этап 1. Шаг 1. , 0 , 1 1 xdxx , 6 , 2 , 1 xQjxdj Шаг 2. 1 1 \ , xQQxxØ. Пусть S - множество вершин непосредственно достижимых из вершины x . 2 4 2 , , xdxxS 4 4 0 , min 4<∞? Да. 2 xQ , 2 x надо было поставить в конец очереди, но Q было пусто, поэтому конец очереди совпал с началом. 6 6 0 , min 4 xd? 6 Да. , 4 2 xxQ Шаг 3. QØ? Нет. Переход на начало второго шага. Вторая итерация. Шаг 2. , , , \ , 5 4 3 4 2 xxxSxxQQxx 11 7 4 , min 3 xd11< ∞? Да. , 3 4 xxQ 4 8 4 , 6 min 4 xd-4<6? Да. 2бв). , 3 4 xxQ Вершину 4 x надо поставить в начало очереди, но она уже стоит там. 10 6 4 , min 5 xd10<∞? Да. , , 5 3 4 xxxQ Шаг 3. QØ? Нет, переход на третью итерацию второго шага. Третья итерация. Шаг 2. , , , \ , 5 3 5 3 4 xxSxxxQQxx 4 8 4 , 11 min 3 xd4<11? Да. , 5 3 xxQ Вершину 3 x надо поставить в начало очереди, но она уже там. 5 9 4 , 10 min 5 xd5<10? Да. , 3 5 xxQ Вершину 5 x передвигаем из конца очереди в начало. 3 9 8 5 7 6 8 7 6 4 6 5 4 3 2 1 6 5 4 3 2 1 xxxxxxxxxxxx 70 Шаг 3. Q Ø? Нет, переход на четвертую итерацию второго шага. Четвертая итерация. Шаг 2.
,
\ ,
6 3 5 x S x x Q Q x x 8 3 5 , min 6 x d 8< ∞? Да. , 6 3 x x Q Шаг 3. Q Ø? Нет. Пятая итерация. Шаг 2. ,
,
\ ,
6 5 6 3 x x S x x Q Q x x 3 7 4 , 5 min 5 x d -3<5? Да. , 6 5 x x Q 8 5 4 , 8 min 6 x d 9<8? Нет. Шаг 3. Q Ø? Нет. Шестая итерация. Шаг 2.
,
\ ,
6 6 5 x S x x Q Q x x 0 3 3 , 8 min 6 x d 0<8? Да. 6 x Q Q содержало только вершину 6 x и она встала в начало очереди. Шаг 3. Q Ø? Нет. Седьмая итерация. Шаг 2. x Q Q x x
\ ,
6 Ø. S
Ø.
70 Шаг 3. QØ. Конец первого этапа. Найдены минимальные расстояния до всех вершин от первой вершины. Эти расстояния таковы: , 4 , 4 , 4 4 3 2 xdxdxd 0 , 3 6 5 xdxd |
|
|