Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практические задания и программы / Методичка с материалом и заданиями (все вместе).doc
Скачиваний:
82
Добавлен:
11.02.2016
Размер:
2.19 Mб
Скачать

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

Путь из начальной вершины xН к конечной вершине xК - последовательность дуг, начинающаяся в вершине xНХ, заканчивающаяся в вершине xКХ, и такая, что конец очередной дуги является началом следующей (i номер пути): (xН , xi1)( xi1, xi2)…(xil-1, xil)( xil, xК).

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

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

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

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

тогда длина пути - это количество дуг, составляющих путь.

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

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

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

Алгоритм называется волновым, так как от рассматриваемой вершины исходит виртуальная волна, которая захватывает смежные с ней вершины.

1. Вершина xН получает вес VН=0, её номер вводится в массив М номеров вершин, изменивших вес. Остальные вершины xi получают вес Vi= и их номера не попадают в массив M.

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

3. Если вес VK=, то делается вывод, что пути из вершины xн к вершине xK нет, иначе переход к п. 4.

4. Выполняется процедура выделения дуг, которая заключается в следующем. Выделяем текущую вершину xi, начиная с конечной, и записываем множество всех вершин, смежных с текущей: E-1(xi)={xj,xm…}; здесь номера вершин упорядочены по возрастанию. Затем последовательно для каждой вершины из множества E-1(xi) определяем вес дуги как разность весов вершин, текущей xi и рассматриваемой xj. Если Vi-Vj=lij, где lij- вес дуги, а Vi, Vj веса вершин, вычисленные на первом проходе (окончательные значения!), то эта дуга является фрагментом одного из кратчайших путей. Далее xj полагаем текущей вершиной и переходим на начало этой процедуры. Процедура заканчивается при достижении начальной вершины.

Отметим, что в волновом алгоритме для невзвешенного графа разность весов вершин xj и xi должна быть равна 1.

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

Обратите внимание на то, что алгоритм выполняется в 3 прохода. На 1-м проходе (это п. 2 словесного описания алгоритма – СОА) вычисляются и пересчитываются веса всех вершин, включая конечную (xK=x6). На 2-м проходе (это п. 4 СОА) выявляютя «претенденты» на кратчайший путь, т.е. дуги, которые могут составить этот путь (эти пути, поскольку их может оказаться несколько с одинаковым весом). На 3-м проходе (это п. 5 СОА) из дуг-претендентов составляются конкретные кратчайшие пути. Задача составления пути из дуг-претендентов является переборной. Здесь важно учесть все возможные варианты перебора.

Пример 3.2. Найти кратчайший путь во взвешенном графе (рис.3.2).

Кратко запишем процесс решения задачи (* отмечается дуга, являющаяся претендентом на включение в кратчайший путь)

1. VН =V1=0, V2 =V3 =…=V6 =Vk = , М ={1}.

2. M, i=1, M=, E(x1)={x2, x3}; V2=min(, 0+1)=1; M={2}.

V3=min(, 0+4)=4; M={2, 3}.

2. M, i=2, M={3}, E(x2)={x3, x4}; V3=min(4, 1+2)=3; M={3}.

V4=min(, 1+5)=6; M={3, 4}.

2. M, i=3, M={4}, E(x3)={x4, x5}; V4=min(6, 3+2)=5; M={4}.

V5=min(, 3+4)=7; M={4, 5}.

2. M, i=4, M={5}, E(x4)={x5, x6};

V5=min(7, 5+1)=6; M={5}.

V6=min(, 5+4)=9; M={5, 6}.

2. M, i=5, M={6}, E(x5)={x6};

V6=min(9, 6+2)=8; M={6}.

2. M, i=6, M=, E(x5)=;

3. VК, переход к п.4.

4. E1(x6)={x4, x5}; V6 V5 = 2, l5,6 = 2*; V6 V4 = 3, l4,6 = 4.

E1(x5)={x3, x4}; V5 V4 = 1, l4,5= 1*; V5 V3 = 3, l5,3 = 4.

E1(x4)={x2, x3}; V4 V3= 2, l3,4 = 2*; V4 V2 = 4, l2,4 = 5.

E1(x3)={x1, x2}; V3 V2= 2, l2,3 = 2*; V3 V1 = 3, l1,3 = 4.

E1(x2)={x1}; V2 V1 = 1, l1,2 = 1*;

Процесс решения на 1-ом проходе алгоритма можно оформить в виде таблицы (табл. 3.3).

На обратном проходе выделяем претендентов. Из них на 3-м проходе строим путь длиной 8. Кратчайший путь (xН,xК) включает в себя дуги (xН=x1, x2), (x1, x2), (x2, x3), (x3, x4), (x4, x5), (x5, x6= xК).

Таблица 3.3

X1

X2

X3

X4

X5

X6

M

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