Вопросы для самоконтроля

1. Что из себя представляет маршрут в графе?

2. Как определяется длина маршрута?

3. Что такое маршрут в графе. Как определяется длина маршрута?

4. Дайте определение цепи, цикла, простого цикла и простой цепи в графе.

5. Какой граф называется связным?

6. Что такое компонента связности?

7. Что такое блок графа?

8. Дайте определение разреза, правильного разреза графа. Приведите примеры.

9. Дайте определение вершинной связности. Приведите примеры.

10. Дайте определение реберной связности. Приведите примеры.

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. Задайте произвольный граф G = (X, U), |X| = 5, |U| = 7. Определите количество маршрутов длиной 2, 3, 4.

2. Составьте словесный алгоритм определения маршрутов в графе.

3. Составьте структурную схему алгоритма определения маршрутов в графе.

4. Задайте произвольный граф G = (X, U), где ½X½ = 6; ½U½ = 10. Постройте маршрут, цепь, цикл, простую цепь, простой цикл. Покажите на примере отличия между этими видами маршрутов.

5. Составьте структурную схему алгоритма или словесный алгоритм определения связности произвольного неориентированного графа.

6. Задайте произвольный граф G = (X, U), где ½X½ = 6; ½U½ = 18. Приведите пример правильного разреза и разреза графа.

7. Приведите пример графа, имеющего точку сочленения.

8. Приведите пример неразделимого графа.

9. Приведите пример графа блоков.

10. Постройте граф G и покажите на его примере взаимосвязь между числом реберной и вершинной связности и минимальной локальной степенью вершин графа.

 

При моделировании систем модели и алгоритмы нахождения маршрутов, цепей, циклов, разрезов, связности графов позволяют строить эффективные алгоритмы преобразования графов.

 



Нахождение кратчайших маршрутов (цепей)

Алгоритм Форда

Приведем алгоритм Форда нахождения маршрутов с минимальной суммарной стоимостью ребер. Будет анализироваться помеченный граф с весами на ребрах. Граф с весами на ребрах называется взвешенным.

1°. Строим матрицу R взвешенного графа G.

Если вершины не смежны между собой, то в матрице ставим M. Фиксируем одну вершину xk и приписываем ей вес V(k) = 0, всем остальным вершинам приписываем вес V(j) = M.

2°. Берем произвольную вершину xj ¹ xk и находим смежную с xj вершину xi, имеющую вес ri,j. В начальный момент в качестве вершины xi берем фиксированную xk. Для xj и xi проверяется выполнение неравенства

                                            V(j) > V(i) + ri,j.                                 (15.8)

Если оно выполняется, то прежний вес V(j) вершины xj заменяется суммой V(i) + ri,j. В противном случае, вес V(j) остается неизменным.

3°. Повторяем пп. 1, 2 пока не рассмотрены все вершины.

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

Для уменьшения объема вычислений операцию пересчета индексов сначала выполняют для всех xj, смежных с фиксированной xk, а затем продолжают это для вершин, смежных с выбранными ранее.

Операция пересчета производится для всех вершин графа до тех пор, пока ни одна из вершин не сможет принимать нового значения V(j). Тогда длинами кратчайших цепей от xj до xk будут величины V(j), полученные в результате замен переменных весов V(j) на новые.

Например, для графа G рис. 15.31 выполним алгоритм Форда.

Рис. 15.31. Пример графа G

В матрице R по главной диагонали проставлены нули, так как в графе G нет петель. При отсутствии связи между вершинами проставлен знак М.

Матрица смежности этого графа запишется так:

  1 2 3 4 5 6 7  
1 0 4 5 9 M 2 M

.

2 4 0 M M M 5 6
3 5 M 0 3 3 M 7
R = 4 9 M 3 0 8 M M
5 M M 3 8 0 M 1
6 2 5 M M M 0 3
7 M 6 7 M 1 3 0

Принимаем вес вершины х 1 равным V(1) = 0, V(2) = V(3) = … = V(7) = M = ¥.

1) Фиксированная вершина xk = x 1.

2) Просматриваем все пары xi, xj и проверяем выполнение неравенства (15.8).

Пусть i = 1, j = 2, тогда имеем V(1) = 0, V(2) = M, r1,2 = 4.

Условие неравенства V(2) = M > V(1) + r 1,2 = 0 + 4 = 4. Поэтому вершине x 2 присваиваем новый вес V(2)1 = 4.

Для вершин, у которых ri,j = M, неравенство (15.8) выполняться не будет и вес V(j) останется прежним.

Далее, для x 3: V(3) = M > V(1) + r 1,3 = 0 + 5 = 5 и V(3)1 = 5.

Для x 4: V(4) = M > V(1) + r 1,4 = 0 + 9 = 9 и V(4)1 = 9.

Для x 6: V(6) = M > V(1) + r 1,6 = 0 + 2 = 2 и V(6)1 = 2.

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

Для x 2: V(2) = 4 < V(6) + r 2,6 = 2 + 5 = 7, значит, индекс вершины остается без изменения.

Для x 4: V(4) = 9 > V(3) + r 4,3 = 5 + 3 = 8, следовательно, меняем значение V(4) с 9 на 8 (см рис. 1.31).

Для x 6: V(6) = 2 < V(2) + r 2,6 = 4 + 5 = 9, здесь индекс остается без изменения.

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

Вычислим индекс вершины x 5, его можно найти через x 3, x 4 или x 7. Индекс x 7 равен М, поэтому для нее неравенство (15.8) не выполняется.

Вычислим индекс вершины x 5 через x 4. Получим V(5)41 = M > V(4)1 + r 4,5 = 8 + 8 = 16.

Приняв V(5)1 = 16 за старое значение индекса, пересчитаем его через x 3:

V(5)31= 16 > V(3)1 + r3,5 = 5 + 3 = 8.

Так как условие (15.8) выполняется, то значение индекса V(5)1 = 16 заменяем на V(5)2 = 8.

Индекс x 7 можно определить через x 2, x 3, x 5, x 6.

V(7)21 = M > V(2)1 + r2,7 = 4 + 6 = 10,

V(7)51 = M > V(5)1 + r5,7 = 8 + 1 = 9,

V(7)31 = M > V(3)1 + r3,7 = 5 + 7 = 12,

V(7)61 = M > V(6)1 + r6,7 = 2 + 3 = 5.

Итак, V(1) = 0, V(2) = 4, V(3) = 5, V(4) = 8, V(5) = 8, V(6) = 2, V(7) = 5.

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

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

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

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

На рис. 15.32 приведен пример, когда необходимо определить путь из вершины

Рис. 15.32. Пример нахождения минимального маршрута

А в В с минимальной стоимостью. При выборе ближайшей вершины 1 из вершины А получим длину маршрута АВ = 13. Например, длины маршрутов А – 1 – 6 – 7 – В или А – 1 – 2 – 7 – 8 – В равны 13. В то же время все другие маршруты (через вершину 3) дают длину маршрута АВ = 8 (например, А – 3 – 4 – 5 – В).

Отметим, что здесь необходима стратегия просмотра длины маршрута в глубину на несколько шагов. Хотя в общем случае этот метод может свестись к полному перебору вариантов.

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

Рассмотрим алгоритм Дейкстры нахождения кратчайшей цепи между двумя заданными вершинами х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, которую мы будем использовать в дальнейшем, в качестве фиксированной. Примем в качестве такой вершины x 1. Метки всех остальных вершин, отличных от вершины x 1, считаем равными ¥, а значение p = x 1.

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

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

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

2°. Для всех вершин, смежных с начальной вершиной x 1 и имеющих временные метки G(x 1) = { x 2, x 3, x 4, x 6}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток.

Для l (x 2) min[ ¥; 0*+ 4 ] = 4.

Для l (x 3) min[ ¥; 0*+ 5 ] = 5.

Для l (x 4) min[ ¥; 0*+ 9 ] = 9.

Для l (x 6) min[ ¥; 0*+ 2 ] = 2.

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

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

         x 2 x 3 x 4 x 5 x 6 x 7

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

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

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

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

2°. Для всех вершин, смежных с текущей вершиной x 6 и имеющих временные метки G(x 6) = { x 2, x 7}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток:

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

Для l (x 7) min[ ¥; 2*+ 3 ] = 5.

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

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

Min[ 4, 5, 9, ¥, 5]

    x 2 x 3 x 4 x 5 x 7

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

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

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

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

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

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

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

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

 Min [ 5, 9, ¥, 5 ]

     x 3 x 4 x 5 x 7

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

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

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

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

2°. Для всех вершин, смежных с текущей вершиной x 3 и имеющих временные метки G(x 3) = { x 4, x 5, x 7} пересчитываем в соответствии с выражением (1.9) действующие значения их меток:

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

для l (x 5) min[ ¥; 5*+ 3 ] = 8,

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

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

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

Min [ 8, 8, 5 ]

     x 4 x 5 x 7

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

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

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

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

2°. Для всех вершин, смежных с текущей вершиной x 7 и имеющих временные метки G(x 7) = { x 5}, пересчитываем в соответствии с выражением (15.9) действующие значения их меток.

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

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

Min [ 8, 6 ]

     x 4 x 5

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

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

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

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

2°. Из вершин, смежных с текущей вершиной x 3 и имеющих временные метки осталась только вершина x 4: G(x 1) = { x 4}. Пересчитываем значение ее метки в соответствии с выражением (15.9):

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

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

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

Min [ 8, ]

     x 4

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

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

Таким образом, мы построили кратчайшие пути от вершины x 1 до вершин x 2, x 3, x 6 напрямую:

x 1 ® x 2(4*), x 1 ® x 3(5*), x 1 ® x 6(2*),

а до вершин x 4, x 5, x 7 через промежуточные:

x 1 ® x 3 ® x 4(8*);

x 1 ® x 6 ® x 7 ® x 5(6*);

x 1 ® x 6 ® x 7(5*).

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

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

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

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

l (x 1) = l (x 4)─ r (x 3, x 4) = 8 – 3 = 5 = l (x 3) - r (x 1, x 3) = 5 – 5 = 0.

Таким образом, построена кратчайшая цепь между вершинами x 1 и x 4: x 1 ® x 3 ® x 4.


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



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