Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
full_v2.doc
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
13 Мб
Скачать
☆

15.3.2. Алгоритм Дейкстры

Рассмотрим алгоритм Дейкстры нахождения кратчайшей цепи между двумя заданными вершинами хs и хt.

Метод основан на приписывании вершинам временных пометок, причем пометка вершины xi дает верхнюю границу длины пути от вершины хs к этой вершине. Значения этих пометок постепенно уменьшаются на основе итерационной процедуры и на каждом шаге итерации точно одна из временных пометок становится постоянной. Это говорит о том, что пометка дает длину кратчайшей цепи от вершины хs к рассматриваемой вершине.

Алгоритм:

Пусть l(xi) ─ пометка xi.

(блок присвоения начальных значений)

1. Пусть l(s) = 0. Положим l(xi) =  для всех xi  s и считаем их пометки временными; пусть p = s.

(блок обновления пометок)

2. Для всех xi  Г(p), пометки которых временные, изменить пометки в соответствии с выражением

l(xi)  min[l(xi); l(p) + r(p, xi)] (15.9)

(блок превращения пометки в постоянную)

3. Среди всех вершин с временными пометками найти такую, что l(xi *) =

= min[l(xi)].

4. Считать пометку xi* постоянной и положить p = xi*.

5.

а) Если надо построить цепь от вершины хs к вершине хt:

Если p = t, то l(p) ─ длина кратчайшей цепи, останов.

Если p  t, переход к п. 2.

б) Если надо построить цепь от вершины хs ко всем остальным вершинам:

Если все вершины отмечены как постоянные, то эти пометки дают длины кратчайших цепей, останов.

Если некоторые вершины являются временными, переход к п. 2.

Рассмотрим последовательность выполнения алгоритма Дейкстра на примере построения кратчайших цепей в графе (см. рис. 15.31).

Матрица смежности графа G имеет следующий вид:

1

2

3

4

5

6

7

1

0

4

5

9

0

2

0

.

2

4

0

0

0

0

5

6

3

5

0

0

3

3

0

7

R = 4

9

0

3

0

8

0

0

5

0

0

3

8

0

0

1

6

2

5

0

0

0

0

3

7

0

6

7

0

1

3

0

Постоянные пометки будем обозначать *, остальные считаются временными.

Вначале нам необходимо выбрать начальную вершину xs, которую мы будем использовать в дальнейшем, в качестве фиксированной. Примем в качестве такой вершины x1. Метки всех остальных вершин, отличных от вершины x1, считаем равными , а значение p = x1.

1. L(x1) = 0*. L(xi) = , xix1, p = x1.

Теперь приступим к выполнению алгоритма нахождения кратчайших по стоимости путей.

Первая итерация

2. Для всех вершин, смежных с начальной вершиной x1 и имеющих временные метки (x1) = {x2, x3, x4, x6}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток.

Для l(x2)  min[  ; 0*+ 4 ] = 4.

Для l(x3)  min[  ; 0*+ 5 ] = 5.

Для l(x4)  min[  ; 0*+ 9 ] = 9.

Для l(x6)  min[  ; 0*+ 2 ] = 2.

3. Выбираем из списка вершин с временными метками вершину с временной меткой, имеющей минимальное значение:

Min [ 4, 5 , 9, , 2,  ]

x2 x3 x4 x5 x6 x7

Очевидно, что такой вершиной является вершина x6.

4. Вершина x6 получает постоянную пометку l(x6) = 2*, значение p = x6.

5. Поскольку не все вершины имеют постоянные пометки, переходим к п. 2.

Вторая итерация

2. Для всех вершин, смежных с текущей вершиной x6 и имеющих временные метки (x6) = {x2, x7}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток:

Для l(x2)  min[ 4 ; 2*+ 5 ] = 4.

Для l(x7)  min[  ; 2*+ 3 ] = 5.

Новое значение метки для вершины x2 оказалось больше текущего, поэтому оставляем текущее значение временной метки, а для вершины x7 заменяем значение l(x7) =  на полученное значение l(x7) = 5.

3. Выбираем из списка вершин с временными метками вершину с временной меткой, имеющей минимальное значение:

Min[ 4, 5, 9, , 5]

x2 x3 x4 x5 x7

Очевидно, что такой вершиной является вершина x2.

4. Вершина x2 получает постоянную пометку l(x2) = 4*, значение p = x2.

5. Поскольку не все вершины имеют постоянные пометки, переходим к п. 2.

Третья итерация

2. Для всех вершин, смежных с текущей вершиной x2 и имеющих временные метки (x2) = {x7}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток.

Для l(x7)  min[ 5 ; 4*+ 6 ] = 5.

Новое значение метки для вершины x7 оказалось больше текущего, поэтому оставляем текущее значение временной метки l(x7) = 5.

3. Выбираем из списка вершин с временными метками вершину с временной меткой, имеющей минимальное значение:

Min [ 5 , 9, , 5 ]

x3 x4 x5 x7

В данном случае две вершины имеют одинаковые метки l(x3) = l(x7) = 5 и мы можем выбрать любую из них. Пусть это будет вершина x3.

4. Вершина x3 получает постоянную пометку l(x3) = 5*, значение p = x3.

5. Поскольку не все вершины имеют постоянные пометки, переходим к п. 2.

Четвертая итерация

2. Для всех вершин, смежных с текущей вершиной x3 и имеющих временные метки (x3) = {x4, x5, x7} пересчитываем в соответствии с выражением (1.9) действующие значения их меток:

для l(x4)  min[ 9 ; 5*+ 3 ] = 8,

для l(x5)  min[  ; 5*+ 3 ] = 8,

для l(x7)  min[ 5 ; 5*+ 7 ] = 5.

Новое значение метки для вершины x7 оказалось больше текущего, поэтому оставляем текущее значение временной метки, а для вершин x4 и x5 заменяем текущие значения меток на новые.

3. Выбираем из списка вершин с временными метками, вершину с временной меткой, имеющей минимальное значение:

Min [ 8, 8, 5 ]

x4 x5 x7

Очевидно, что такой вершиной является вершина x7.

4. Вершина x7 получает постоянную пометку l(x7) = 5*, значение p = x7.

5. Не все вершины имеют постоянные пометки, переходим к п. 2.

Пятая итерация

2. Для всех вершин, смежных с текущей вершиной x7 и имеющих временные метки (x7) = {x5}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток.

Для l(x5)  min[ 8 ; 5*+ 1 ] = 6.

3. Выбираем из списка вершин с временными метками вершину с временной меткой, имеющей минимальное значение:

Min [ 8, 6 ]

x4 x5

Такой вершиной является вершина x5.

4. Вершина x5 получает постоянную пометку l(x5) = 6*, значение p = x5.

5. Поскольку не все вершины имеют постоянные пометки, переходим к п. 2.

Шестая итерация

2. Из вершин, смежных с текущей вершиной x3 и имеющих временные метки осталась только вершина x4: (x1) = {x4}. Пересчитываем значение ее метки в соответствии с выражением (15.9):

для l(x4)  min[ 8 ; 6*+ 8 ] = 8.

Новое значение метки для вершины x4 оказалось больше текущего, поэтому оставляем текущее значение временной метки.

3. В списке вершин с временными метками только один элемент:

Min [ 8, ]

x4

4. Вершина x4 получает постоянную пометку l(x4) = 8*, значение p = x4.

5. Поскольку все вершины графа имеют постоянные метки, конец алгоритма.

Таким образом, мы построили кратчайшие пути от вершины x1 до вершин x2, x3, x6 напрямую:

x1x2(4*), x1x3(5*), x1x6(2*),

а до вершин x4, x5, x7 через промежуточные:

x1x3x4(8*);

x1x6x7x5(6*);

x1x6x7(5*).

Длину цепи xsxi, т.е. суммарную стоимость весов пройденных ребер, можно получить при помощи рекурсивной процедуры:

l(xs) + r(xs, xj) = l(xi),

т.е. проверяется, какая из вершин, смежных вершине xs, дает вместе с весом ребра r(xs, xj) сумму, равную l(xi).

Например: l(x4) = 8. Поскольку вершина x4 напрямую не связана с вершиной x1, то определим кратчайший путь из x1 в x4:

l(x1) = l(x4) ─ r(x3, x4) = 8 – 3 = 5 = l(x3) - r(x1, x3) = 5 – 5 = 0.

Таким образом, построена кратчайшая цепь между вершинами x1 и x4: x1x3x4.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]