Примеры решения задач

Пример 1. Пусть задан граф G = (X, U). Найти с помощью алгоритма Форда кратчайшие пути в заданном графе G от фиксированной вершины до всех остальных.

Решение: Рассмотрим матрицу смежности графа G:

  1 2 3 4 5 6 7 8 9  
1 0 10 M M M M 3 6 12

.

2 10 0 18 M M M 2 M 13
3 M 18 0 25 M 20 M M 7
R=4 M M 25 0 5 16 4 M M
5 M M M 5 0 10 M 23 M
6 M M 20 16 10 0 17 15 9
7 3 2 M 4 M 17 0 M 24
8 6 M M M 23 15 M 0 5
9 12 13 7 M M 9 24 5 0

1.1. В качестве фиксированной вершины выбираем вершину x 1. Тогда ее вес V(1) = 0, а веса всех остальных вершин: V(2) = V(3) = … = V(9) = ¥ = M.

1.2. Просматриваем первую строку матрицы смежности и выбираем поочередно все вершины, не помеченные литерой M. В результате мы сформировали следующий список вершин: x 2, x 7, x 8, x 9.

1.3. Для каждой из вершин, входящих в полученный список, проверяем истинность неравенства (1.8):

V(2) = ¥ > 0 + 10 = 10; V(7) = ¥ > 0 + 3 = 3; V(8) = ¥ > 0 + 6 = 6;

V(9) = ¥ > 0 + 12 = 12.

Значения весов для вершин x 3, x 4, x 5, x 6 не изменяются.

Теперь произведем пересчет индексов для вершин смежных с x 1, с учетом пути через другие смежные вершины.

1.4. Производим пересчет весов для сформированного списка вершин:

для вершины x 2:

- V(2) > V(7) + r27 ® 10 > 3 + 2 ─ неравенство истинно, следовательно, вес вершины изменяется: V(2)1 = 5,

- V(2) > V(9) + r29 ® 10 > 1 + 13 ─ неравенство ложно, следовательно, вес вершины не изменяется;

для вершины x 7:

- V(7) > V(2) + r27 ® 3 > 10 + 2 ─ неравенство ложно, следовательно, вес вершины не изменяется;

- V(7) > V(9) + r79 ® 3 > 12 + 24 ─ неравенство ложно, следовательно, вес вершины не изменяется.

для вершины x 8:

- V(8) > V(9) + r89 ® 6 > 12 + 5 ─ неравенство ложно, следовательно, вес вершины не изменяется;

для вершины x 9:

- V(9) > V(2) + r29 ® 12 > 10 + 13 ─ неравенство ложно, следовательно, вес вершины не изменяется,

- V(9) > V(7) + r79 ® 12 > 3 + 24 ─ неравенство ложно, следовательно, вес вершины не изменяется,

- V(9) > V(8) + r89 ® 12 > 6 + 5 ─ неравенство истинно, следовательно, вес вершины изменяется: V(9)1 = 11.

1.5. Проверка условия: все ли вершины помечены.

Произведем пересчет индексов для вершин, несмежных с фиксированной вершиной x 1.

2.1. Вычислим значение веса вершины x 3, его можно найти через x 2, x 4, x 6 или x 9. Однако значения весов вершин x 4 и x 6 нам пока не известны, поэтому производим расчет через вершины x 2 и x 9:

- V(3) > V(2) + r23 ® ¥ > 5 + 18 - неравенство истинно, следовательно, вес вершины изменяется: V(3)1 = 23,

- V(3) > V(9) + r39 ® 23 > 11 + 7 ─ неравенство истинно, следовательно, вес вершины изменяется: V(3)2 = 18.

2.2. Вычислим значение веса вершины x 4, его можно найти через x 3, x 5, x 6 или x 7. Однако значения весов вершин x 5 и x 6 нам пока не известны, поэтому производим расчет через вершины x 3 и x 7:

- V(4) > V(3) + r34 ® ¥ > 18 + 25 ─ неравенство истинно, следовательно, вес вершины изменяется: V(4)1 = 43,

- V(4) > V(7) + r47 ® 43 > 3 + 4 ─ неравенство истинно, следовательно, вес вершины изменяется: V(4)2 = 7.

2.3. Вычислим значение веса вершины x 5, его можно найти через x 4, x 6 или x 8. Однако значение веса вершины x 6 нам пока не известно, поэтому производим расчет через вершины x 4 и x 8:

- V(5) > V(4) + r45 ® ¥ > 7 + 5 ─ неравенство истинно, следовательно, вес вершины изменяется: V(5)1 = 12,

- V(5) > V(8) + r58 ® 12 > 6 + 23 ─ неравенство ложно, следовательно, вес вершины не изменяется.

2.4. Вычислим значение веса вершины x 6, его можно найти через x 3, x 4, x 5, x 7, x 8 или x 9:

- V(6) > V(3) + r36 ® ¥ > 18 + 20 ─ неравенство истинно, следовательно, вес вершины изменяется: V(6)1 = 38,

- V(6) > V(4) + r46 ® 38 > 7 + 16 ─ неравенство истинно, следовательно, вес вершины изменяется: V(6)2 = 23,

- V(6) > V(5) + r56 ® 23 > 12 + 10 ─ неравенство истинно, следовательно, вес вершины изменяется: V(6)3 = 22,

- V(6) > V(7) + r67 ® 22 > 3 + 17 ─ неравенство истинно, следовательно, вес вершины изменяется: V(6)4 = 20,

- V(6) > V(8) + r68 ® 20 > 6 + 15 ─ неравенство ложно, следовательно, вес вершины не изменяется.

- V(6) > V(9) + r69 ® 20 > 11 + 9 ─ неравенство ложно, следовательно, вес вершины не изменяется,

3. Конец работы алгоритма.

Алгоритм Форда дает кратчайшее расстояние от вершин до фиксированной вершины, а сами цепи не определяет.

Для определения цепи от выбранной вершины до фиксированной воспользуемся равенством V(j) ─ V(i) = ri,j.

Например, найдем путь от x 6 до x 1. Ищется предпоследний шаг при пересчете индекса V(6). Это x 6x 7. Затем для x 7 определяется вершина пересчета. Это x 6 - x 1. Следовательно, кратчайший путь x 6x 7x 1, а – кратчайшее расстояние между вершинами x 1 и x 6 определено ранее V(6) = 20.

Пример 2. Пусть задан граф G = (X, U). Найти с помощью алгоритма Дейкстра кратчайшие пути в заданном графе G от фиксированной вершины до всех остальных.

Решение: Рассмотрим матрицу смежности графа G:

 

  1 2 3 4 5 6 7 8 9  
1 0 10 0 0 0 0 3 6 12

.

2 10 0 18 0 0 0 2 0 13
3 0 18 0 25 0 20 0 0 7
R=4 0 0 25 0 5 16 4 0 0
5 0 0 0 5 0 10 0 23 0
6 0 0 20 16 10 0 17 15 9
7 3 2 0 4 0 17 0 0 24
8 6 0 0 0 23 15 0 0 5
9 12 13 7 0 0 9 24 5 0

 

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

1°. l (x 1) = 0*. l (xi) = ¥, " xi ¹ x 1, p = x 1.

В качестве начальной вершины принимаем вершину x 1. Всем остальным вершинам графа присваиваем метки l (xi) = ¥.

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

2°. Г(p) = Г(x 1) = { x 2, x 7, x 8, x 9}. Возьмем вершину x 2 и из выражения (15.9) получим:

l (x 2) min[ l (x 2), l (x 1) + r(x 1, x 2)] = min[¥, 0* + 10] = 10.

Аналогично вычисляем значения меток для других вершин, смежных с вершиной x 1: l (x 7) = 3, l (x 8) = 6, l (x 9) = 12.

3°. В списке вершин графа выберем вершину, имеющую минимальное значение метки: Min[ x 2, x 7, x 8, x 9, x 3, x 4, x 5, x 6] = min[10, 3, 6, 12, ¥, ¥, ¥, ¥] = 3 ─ соответствует вершине x 7.

4°. Вершина x 7 получает постоянную пометку l(x 7) = 3*, p = x 7.

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

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

2°. Г(p) = Г(x 7) = { x 2, x 4, x 6, x 9} ─ все пометки временные. Из выражения (1.9) вычисляем:

l (x 2) = min[ l (x 2), l (x 7) + r(x 7, x 2)] = min[10, 3* + 2] = 5.

Аналогично l (x 4) = 7, l (x 6) = 17, l (x 9) = 12.

3°. Min[ x 2, x 4, x 6, x 8, x 9, x 3, x 5] = min[5, 7, 17, 6, 12, ¥, ¥] = 5 ─ соответствует вершине x 2.

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

5°. Перейдем к п. 2°, т.к. не все вершины имеют постоянные пометки.

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

2°. Г(p) = Г(x 2) = { x 1, x 3, x 7, x 9}, только x 3 и x 9 имеют временные пометки. Из выражения (15.9) получим l (x 3) = min[¥, 5* + 18] = 23, l (x 9) = min[12, 5* + 13] = 12.

3°. Min[ x 3, x 4, x 8, x 6, x 9, x 5] = min[23, 7, 6, 17, 12, ¥] = 6 ─ соответствует вершине x 8.

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

5°. Перейдем к п. 2°, так как. не все вершины имеют постоянные пометки.

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

2°. Г(p) = Г(x 8) = { x 9, x 6, x 5}, x 5 и x 9 имеют временные пометки. Из выражения (15.9) получим:

l (x 5) = min[¥, 6* + 23] = 29, l (x 9) = min[12, 6* + r(x 8, x 9)] = 11.

3°. Min[ x 5, x 9, x 3, x 4, x 5] = min[29, 11, 23, 7, 29] = 7 ─ соответствует вершине x 4.

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

5°. Переход к п. 2°.

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

2°. Г(p) = Г(x 4) = { x 3, x 6, x 5}. l (x 3) = 23, l (x 6) = 17, l (x 5) = 12.

3°. Min[ x 5, x 6, x 9, x 3] = min[12, 17, 11, 23] = 11.

4°. Вершина x 9 получает постоянную пометку l (x 9) = 11*, p = x 9.

5°. Переход к п. 2°.

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

2°. Г(p) = Г(x 9) = { x 3, x 6} (берем только непомеченные вершины).

(x6) = min[ l (x 6), l (x 9) + r(x 6, x 9)] = [17, 11* + 9] = 17, l (x 3) = 18.

3°. Min[ x 5, x 6, x 3] = min[12, 17, 18] = 12.

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

5°. Переход к п. 2°.

Седьмая итерация

2°. Г(p) = Г(x 5) = { x 6}.

l (x 6) = min[ l (x 6), l (x 5) + r(x 5, x 6)] = [17, 12* + 10] = 17.

3°. Min[ x 6, x 3] = min[17, 18] = 17.

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

5°. Переход к п. 2°.

Восьмая итерация.

2°. Г(p) = Г(x 3) = Æ.

l (x 3) = min[18] = 18, p = x 3. Все вершины помечены.

Итак, получили кратчайшие пути от вершины x 1 до всех остальных:

x 1 ® x 2(5*), x 1 ® x 3(18*), x 1 ® x 4(7*), x 1 ® x 5(12*), x 1 ® x 6(17*), x 1 ® x 7(3*), x 1 ® x 8(6*), x 1 ® x 9(11*);

x 1 ® x 7 ® x 2 ® x 3(18*), x 1 ® x 7 ® x 2(5*), x 1 ® x 8(6*), x 1 ® x 8 ® x 9(11*), x 1 ® x 7 ® x 6(17*), x 1 ® x 7 ® x 4 ® x 5(12*), x 1 ® x 7 ® x 4(7*).

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

Например: x 1 ® x 3(18*), сумму 18 дает вершина x 9 с ребром { x 9x 3}:

имеем x 3 ® x 9(11*), сумму 11 дает вершина x 8 с ребром { x 8x 9}.

имеем x 3 ® x 9 ® x 8(6*), сумму 6 дает вершина x 1 с ребром { x 1x 8}.

Тогда имеем кратчайший путь x 3 ® x 9 ® x 8 ® x 1 длиной 18.

Результат построения кратчайших путей в графе G показан на рис. 15.33.

Рис. 15.33. Граф G


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: