Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графы.doc
Скачиваний:
23
Добавлен:
25.12.2018
Размер:
212.48 Кб
Скачать

3.2. Алгоритмы нахождения оптимального пути

Путь из начальной вершины хн к кончиной вершине хк - последовательность дуг, начинающаяся в вершине хн  Х, заканчивающаяся в вершине хк  Х, и такая, что конец очередной дуги является началом следующей: (хн, хi1)( хi1, хi2)( хi2… хik)( хik, xk) = (xн, хк).

Элементарный путь – путь, в котором вершины не повторяются.

Простой путь - путь, в котором дуги не повторяются.

Маршрут - последовательность ребер, составляющих, как и путь, цепочку.

Длина пути взвешенного графа определяется как сумма весов - его дуг. Если граф не взвешен, то можно считать веса дуг равными 1 .

Кратчайшим путем между выделенной парой вершин хн и хк называется путь, имеющий наименьшую длину среди всех возможных путей между этими вершинами.

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

Волновой алгоритм построения кратчайшего пути для невзвешенного графа

  1. Вершина Xн помечается 0, остальные вершины считаются непомеченными.

  2. i=i+1. Помечаются индексом i все непомеченные ранее вершины, в которых есть дуги от помеченных вершин. Если помечена вершина Хк, то выполняется п.2. Иначе, если в текущем значении индекса i оказались помеченными какие-либо вершины, то выполняется п.1. Иначе делается вывод, что пути из вершины Хн в Хк нет.

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

  4. При движении от вершины Хн по выделенным дугам оказывается построены все кратчайшие пути к вершине Хк.

Волновой алгоритм построения кратчайшего пути для взвешенного графа

1. Вершина Хн получает вес V = 0, ее номер вводится в массив М номеров вершин, изменивших вес. Остальные вершины Xi получают вес Vi = ∞, их номера не попадают в массив М.

2. Если массив M пуст, то выполняется п. 3, иначе выбирается с исключением из него очередная вершина Xi, и пересчитываются веса вершин, принадлежащих исходу G(Xi) вершины Xi: Xi  G (Xi)(Vj = min (Vj Vi + lij)). Если вес Vj уменьшается, то номер j включается в М. Снова выполняется п. 2.

3. Если вес Vi = ∞, то делается вывод, что пути из вершины Хн к вершине Xk нет, иначе выполняется процедура выделения дуг, такая же, как в волновом алгоритме для невзвешенного графа, за исключением того, что разность весов вершин Xi и Xj должна быть равна lij.

4. После выделения дуг строятся кратчайшие пути, длины которых равны Vk. Пример

1. Vi = V1 = 0, V2 = V3 = V4 = V3 = V6 = ∞, M = {1}

2. M ≠ 0, i = 1, M = 0, G(X1) = {X2, X3}; V2 = min (∞, 0 + 1)=1; M ={2}

Vi = min (∞, 0 + 4) = 4; M ={2,3};

2. M ≠ 0, i = 2, M = {3}, G(X2) = {X3, X4}; V3 = min (4, 1 + 2)=3; M = {3}; V4 = min (∞, 1 + 5) = 6; M={3,4};

2. M ≠ 0, i = 3, M = {4}, G(X3) = {X4, X5}; V4 = min (6, 3 + 2)=5; M = {4}; V5 = min (∞, 3 + 4) = 7; M={4,5};

2. M ≠ 0, i = 4, M = {5}, G(X4) = {X5, X6}; V5 = min (7, 5 + 1)=6; M = {5}; V6 = min (∞, 5 + 4) = 9; M={5,6};

2. M ≠ 0, i = 5, M = {6}, G(X6) = {X6}; V6 = min (9, 6 + 2)=8; M = {6};

2. M ≠ 0, i = 6, M = {0}, G(6) = {0};

3. G-1(X6) = {X4, X5}; Vx6 - Vx5 = 2; l6 = 2,* Vx6 - Vx4 = 3, l4,6 = 4.

G-1(X5) = {X3, X4}; Vx5 - Vx4 = 1; l4,5 = 1,* Vx5 - Vx3 = 3, l5,3 = 4.

G-1(X4) = {X2, X3}; Vx4 - Vx3 = 2; l3,4 = 2,* Vx4 - Vx2 = 4, l2,4 = 5.

G-1(X3) = {X1, X2}; Vx3 - Vx2 = 2; l2,3 = 2,* Vx3 - Vx1 = 3, l1,3 = 4.

G-1(X2) = {X1}; Vx2 - Vx1 = 1; l1 = 1,*

Построен кратчайший путь (Xн, Xк) длиной 8:

(Xн = Х1, Х2)( Х2, Х3)( Х3, Х4)( Х4, Х5)( Х5, Х6 = Хк).

Процесс решения можно оформить в виде таблицы:

Х1

Х2

Х3

Х4

Х5

Х6

М

0

1

0

1

4

2,3

0

1

3

6

3,4

0

1

3

5

7

4,5

0

1

3

5

6

9

5,6

0

1

3

5

6

8

6

0

1

3

5

6

8

0

В олновой алгоритм построения длиннейшего пути во взвешенном графе

Используется волновой алгоритм построения кратчайшего пути для взвешенного графа со следующим отличием:

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

2. Во втором пункте алгоритма Vj = max (Vj, Vi + lij)

Х1

Х2

Х3

Х4

Х5

Х6

М

0

0

0

0

0

0

1

0

1

4

0

0

0

2,3

0

1

4

6

0

0

3,4

0

1

4

6

8

0

4,5

0

1

4

6

8

10

5,6

0

1

4

6

8

10

6

0

1

4

6

8

10

0

Vx6 - Vx5 = l5,6 = 2(*(X5, X6))

Vx6 - Vx4 = l4,6 = 4(*(X4, X6))

Vx4 - Vx3 = l3,4 = 2(*(X3, X4))

Vx4 - Vx2 = l2,4 = 5(*(X2, X4))

Vx2 - Vx1 = l1,2 = 1(*(X1, X2))

Vx3 - Vx1 = l1,3 = 4(*(X1, X3))

Обратный ход:

Построены три длиннейшие пути:

1. (Х1, Х2)( Х2, Х4)( Х4, Х6)

2. (Х1, Х3)( Х3, Х4)( Х4, Х6)

3. (Х1, Х3)( Х3, Х5)( Х5, Х6)

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