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

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

Пример 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. В качестве фиксированной вершины выбираем вершину x1. Тогда ее вес V(1) = 0, а веса всех остальных вершин: V(2) = V(3) = … = V(9) =  = M.

1.2. Просматриваем первую строку матрицы смежности и выбираем поочередно все вершины, не помеченные литерой M. В результате мы сформировали следующий список вершин: x2, x7, x8, x9.

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

V(2) =   0 + 10 = 10; V(7) =   0 + 3 = 3; V(8) =   0 + 6 = 6;

V(9) =   0 + 12 = 12.

Значения весов для вершин x3, x4, x5, x6 не изменяются.

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

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

для вершины x2:

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

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

для вершины x7:

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

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

для вершины x8:

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

для вершины x9:

- 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. Проверка условия: все ли вершины помечены.

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

2.1. Вычислим значение веса вершины x3, его можно найти через x2, x4, x6 или x9. Однако значения весов вершин x4 и x6 нам пока не известны, поэтому производим расчет через вершины x2 и x9:

- 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. Вычислим значение веса вершины x4, его можно найти через x3, x5, x6 или x7. Однако значения весов вершин x5 и x6 нам пока не известны, поэтому производим расчет через вершины x3 и x7:

- 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. Вычислим значение веса вершины x5, его можно найти через x4, x6 или x8. Однако значение веса вершины x6 нам пока не известно, поэтому производим расчет через вершины x4 и x8:

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

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

2.4. Вычислим значение веса вершины x6, его можно найти через x3, x4, x5, x7, x8 или x9:

- 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.

Например, найдем путь от x6 до x1. Ищется предпоследний шаг при пересчете индекса V(6). Это x6 ─ x7. Затем для x7 определяется вершина пересчета. Это x6 - x1. Следовательно, кратчайший путь x6 – x7 ─ x1, а – кратчайшее расстояние между вершинами x1 и x6 определено ранее 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(x1) = 0*. l(xi) = , xix1, p = x1.

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

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

2. Г(p) = Г(x1) = {x2, x7, x8, x9}. Возьмем вершину x2 и из выражения (15.9) получим:

l(x2)  min[l(x2), l(x1) + r(x1, x2)] = min[, 0* + 10] = 10.

Аналогично вычисляем значения меток для других вершин, смежных с вершиной x1: l(x7) = 3, l(x8) = 6, l(x9) = 12.

3. В списке вершин графа выберем вершину, имеющую минимальное значение метки: Min[x2, x7, x8, x9, x3, x4, x5, x6] = min[10, 3, 6, 12, , , , ] = 3 ─ соответствует вершине x7.

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

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

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

2. Г(p) = Г(x7) = {x2, x4, x6, x9} ─ все пометки временные. Из выражения (1.9) вычисляем:

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

Аналогично l(x4) = 7, l(x6) = 17, l(x9) = 12.

3. Min[x2, x4, x6, x8, x9, x3, x5] = min[5, 7, 17, 6, 12, , ] = 5 ─ соответствует вершине x2.

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

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

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

2. Г(p) = Г(x2) = {x1, x3, x7, x9}, только x3 и x9 имеют временные пометки. Из выражения (15.9) получим l(x3) = min[, 5* + 18] = 23, l(x9) = min[12, 5* + 13] = 12.

3. Min[x3, x4, x8, x6, x9, x5] = min[23, 7, 6, 17, 12, ] = 6 ─ соответствует вершине x8.

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

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

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

2. Г(p) = Г(x8) = {x9, x6, x5}, x5 и x9 имеют временные пометки. Из выражения (15.9) получим:

l(x5) = min[, 6* + 23] = 29, l(x9) = min[12, 6* + r(x8, x9)] = 11.

3. Min[x5, x9, x3, x4, x5] = min[29, 11, 23, 7, 29] = 7 ─ соответствует вершине x4.

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

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

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

2. Г(p) = Г(x4) = {x3, x6, x5}. l(x3) = 23, l(x6) = 17, l(x5) = 12.

3. Min[x5, x6, x9, x3] = min[12, 17, 11, 23] = 11.

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

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

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

2. Г(p) = Г(x9) = {x3, x6} (берем только непомеченные вершины).

(x6) = min[l(x6), l(x9) + r(x6, x9)] = [17, 11* + 9] = 17, l(x3) = 18.

3. Min[x5, x6, x3] = min[12, 17, 18] = 12.

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

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

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

2. Г(p) = Г(x5) = {x6}.

l(x6) = min[l(x6), l(x5) + r(x5, x6)] = [17, 12* + 10] = 17.

3. Min[x6, x3] = min[17, 18] = 17.

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

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

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

2. Г(p) = Г(x3) = .

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

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

x1x2(5*), x1x3(18*), x1x4(7*), x1x5(12*), x1x6(17*), x1x7(3*), x1x8(6*), x1x9(11*);

x1x7x2x3(18*), x1x7x2(5*), x1x8(6*), x1x8x9(11*), x1x7x6(17*), x1x7x4x5(12*), x1x7x4(7*).

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

Например: x1x3(18*), сумму 18 дает вершина x9 с ребром {x9 ─ x3}:

имеем x3x9(11*), сумму 11 дает вершина x8 с ребром {x8 ─ x9}.

имеем x3x9x8(6*), сумму 6 дает вершина x1 с ребром {x1 ─ x8}.

Тогда имеем кратчайший путь x3x9x8x1 длиной 18.

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

Рис. 15.33. Граф G

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