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

для взвешенного графа

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

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

2. Если массив М пуст, то выполняется п. 3, иначе выбирается с исключением из него очередная вершина xi и пересчитываются веса вершин, принадлежащих исходу E(xi) вершины xi: " xi Î X ½ 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. E- 1(x6)={ x4, x5 }; V 6 - V5 = 2, l5,6 = 2 *; V 6 - V4 = 3, l4,6 = 4.

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

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

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

E- 1(x2)={ x1 }; V 2 - 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
  ¥ ¥ ¥ ¥ ¥  
  1   ¥ ¥ ¥ 2, 3
    3   ¥ ¥ 3, 4
      5   ¥ 4, 5
        6   5, 6
          8  
            Æ

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



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