Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
75
Добавлен:
02.05.2014
Размер:
10.27 Mб
Скачать

3.6. Алгоритмы поиска путей на графе.

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

Образом таких систем является реберно-взвешенный граф, т.е. граф, у которого каждое ребро или дуга имеют вес. Кратчайший путь в таком графе всегда простой, т.е. каждая вершина в переходе используется только один раз. Длина кратчайшего пути определяется суммой весов ребер перехода i,j=(хi;...хk;...хj):

Li,j=m,n lm,n, где im, nj, mn.

В основе всех алгоритмов лежит операция сравнения двух простых маршрутов. На рис. 45а) показаны два простых маршрута, соединяющих вершины хi и хj. Поэтому выбор кратчайшего пути между вершинами хi и хj есть результат сравнения длин двух маршрутов, т.е. Li,j=min{li,j;(li,p+ lp,j)}.

p

x0

..

xi

xp

xj

..

xn

x0

x0

..

xi

xp

xj

..

xn

..

x0

..

xi

xp

xj

..

xn

xi

x0

..

xi

xp

xj

..

xn

xp

x0

..

xi

xp

xj

..

xn

xj

x0

..

xi

xp

xj

..

xn

..

x0

..

xi

xp

xj

..

xn

xn

x0

..

xi

xp

xj

..

xn

Если существует несколько вершин, смежных с вершинами хi и хj следует выполнять процедуру последовательно, сравнивая длины двух маршрутов для каждой вершины.

а) хp

li,p lp,j

xi xj

li,j

б)

lp

x0

..

xi

xp

xj

..

xn

x0

0

..

l0i

l0j

..

l0n

..

..

0

..

..

..

..

..

xi

li0

..

0

lip

lij

..

lin

xp

..

lpi

0

lpj

..

lpn

xj

lj0

..

lji

ljp

0

..

ljn

..

..

..

..

..

..

0

..

xn

ln0

..

lni

lnp

lnj

..

0nn

Рис. 45. Выбор маршрута между вершинами хi и хj.

Для поиска кратчайших путей разработаны несколько алгоритмов. Алгоритмы Форда-Беллмана и Дейкстра позволяют найти кратчайшие пути от заданной вершины графа до любой другой. В результате этих вычислений формируется граф типа “дерево” с корнем в заданной вершине.

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

Алгоритмы Флойда и Данцига позволяют искать кратчайшие пути между любой парой вершин графа. Для текущих оценок кратчайших путей между парами вершин удобно использовать матрицы (nn), где n-число вершин графа. Для того чтобы выбирать кратчайшие путь и переход, необходимо использовать две матрицы: матрицу кратчайших путей ║l(n;n)║ и матрицу кратчайших переходов ║(n;n)║. На рис. 45б) приведены две матрицы для выбора кратчайших путей и переходов. Вершина хp позволяет выбрать кратчайший путь между любой парой вершин, смежных с вершиной хp. Поэтому вершина хp называется базовой, а строка и столбец матрицы ║lp║ базовыми.

Если все вершины графа индексировать целыми числами 0;1;2;...n и, в качестве базовой, использовать последовательно все вершины, начиная с вершины х0, то за (n-1) итераций можно найти кратчайшие пути между любой парой вершин. Для p=0 матрица ║l0║ есть матрица весов графа, элементы которой определяются так:

{

0, если i=j;

li,j0= li,j,если вершины хi и хj смежны, вес ребра равен li,j;

, если вершины хi и хj не смежны.

Как уже отмечалось базовая вершина позволяет найти (li,p+ lp,j) для любой пары вершин смежных с вершиной хp и представить этот результат p-ой итерации для выбора кратчайшего пути по формулам:

а) если (li,p+ lp,j)li,j, то сохранить для итерации (p+1) прежнее значение li,j;

б) если (li,p+ lp,j)<li,j, то заменить для итерации (p+1) прежнее значение li,j на (li,p+ lp,j).

Матрица переходов p производна относительно матрицы путей. Для p=0 элементы матрицы 0 есть концевые вершины перехода из хi в хj. Поэтому в каждом столбце хj матрицы 0 указана вершина хj. Результатом p-ой итерации при выборе кратчайшего маршрута происходит замена вершины перехода вершиной кратчайшего перехода по формулам:

а) если (li,p+ lp,j)li,j, то i,j(p+1)=i,jpj;

б) если (li,p+ lp,j)<li,j, то i,j(p+1)p.

Следовательно, для анализа n-вершинного графа необходимо последовательно построить n матриц кратчайших путей и кратчайших переходов. Алгоритм Данцига отличен от алгоритма Флойда только технологией построения матриц кратчайших путей и переходов.

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

шаг 1: присвоить каждой вершине графа целое число от 0 до n;

шаг 2: составить матрицу весов ║l0║ и матрицу переходов ║0║;

шаг 3: принять p=0, где p-шаг итерации;

шаг 4: определить вершину p базовой и выделить базовые строки и столбец;

шаг 5: вычеркнуть строки и столбцы, базовые элементы которых имеют значение , т.к. (li,p+) и (+ lp,j) всегда больше конечного значения li,j;

шаг 6: сравнить каждый невычеркнутый элемент ║lp║ с суммой (li,pp+ lp,jp):

шаг 6.1: если (li,pp+ lp,jp)<li,jp, то li,jp+1=(li,pp+ lp,jp); i,j(p+1)=p

шаг 6.2: если (li,pp+ lp,jp)>li,jp, то li,jp+1=li,jp; i,j(p+1)= i,jp.

шаг 7: если p<n, то принять p=p+1 и вернуться к шагу 4, иначе конец.

На рис. 46 дан пример расчета кратчайших путей по алгоритму Флойда. На каждой итерации заштрихованы базовые столбец и строка, кружками выделены элементы матриц ║lp+1║ и ║p+1║, которые получили изменение относительно матриц ║lp║ и ║p║.

На 7-ой итерации (p=7) процесс вычисления окончен и никаких изменений в матрицах кратчайших путей и маршрутов нет.

0

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x1

x2

x3

x4

x5

x6

x7

x1

x0

x1

x2

x3

x4

x5

x6

x7

x2

x0

x1

x2

x3

x4

x5

x6

x7

x3

x0

x1

x2

x3

x4

x5

x6

x7

x4

x0

x1

x2

x3

x4

x5

x6

x7

x5

x0

x1

x2

x3

x4

x5

x6

x7

x6

x0

x1

x2

x3

x4

x5

x6

x7

x7

x0

x1

x2

x3

x4

x5

x6

x7

l0

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

9

3

x1

9

0

2

7

x2

2

0

2

4

8

6

x3

3

2

0

5

x4

7

4

0

10

9

x5

8

10

0

7

12

x6

6

5

7

0

10

x7

9

12

10

0

l1

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

9

3

x1

9

0

2

12

7

x2

2

0

2

4

8

6

x3

3

12

2

0

5

x4

7

4

0

10

9

x5

8

10

0

7

12

x6

6

5

7

0

10

x7

9

12

10

0

1

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x1

x2

x3

x4

x5

x6

x7

x1

x0

x1

x2

x0

x4

x5

x6

x7

x2

x0

x1

x2

x3

x4

x5

x6

x7

x3

x0

x0

x2

x3

x4

x5

x6

x7

x4

x0

x1

x2

x3

x4

x5

x6

x7

x5

x0

x1

x2

x3

x4

x5

x6

x7

x6

x0

x1

x2

x3

x4

x5

x6

x7

x7

x0

x1

x2

x3

x4

x5

x6

x7

2

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x1

x1

x3

x1

x5

x6

x7

x1

x0

x1

x2

x0

x4

x5

x6

x7

x2

x1

x1

x2

x3

x4

x5

x6

x7

x3

x0

x0

x2

x3

x1

x5

x6

x7

x4

x1

x1

x2

x1

x4

x5

x6

x7

x5

x0

x1

x2

x3

x4

x5

x6

x7

x6

x0

x1

x2

x3

x4

x5

x6

x7

x7

x0

x1

x2

x3

x4

x5

x6

x7

l2

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

9

11

3

16

x1

9

0

2

12

7

x2

11

2

0

2

4

8

6

x3

3

12

2

0

19

5

x4

16

7

4

19

0

10

9

x5

8

10

0

7

12

x6

6

5

7

0

10

x7

9

12

10

0

l3

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

9

11

3

15

19

17

x1

9

0

2

4

6

10

8

x2

11

2

0

2

4

8

6

x3

3

4

2

0

6

10

5

x4

15

6

4

6

0

10

10

9

x5

19

10

8

10

10

0

7

12

x6

17

8

6

5

10

7

0

10

x7

9

12

10

0

3

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x1

x1

x3

x2

x2

x2

x7

x1

x0

x1

x2

x2

x2

x2

x2

x7

x2

x1

x1

x2

x3

x4

x5

x6

x7

x3

x0

x2

x2

x3

x2

x2

x6

x7

x4

x2

x2

x2

x2

x4

x5

x2

x7

x5

x2

x2

x2

x2

x4

x5

x6

x7

x6

x2

x2

x2

x3

x2

x5

x6

x7

x7

x0

x1

x2

x3

x4

x5

x6

x7


l5

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

7

5

3

9

13

8

18

x1

7

0

2

4

6

10

8

15

x2

5

2

0

2

4

8

6

13

x3

3

4

2

0

6

10

5

15

x4

9

6

4

6

0

10

10

9

x5

13

10

8

10

10

0

7

12

x6

8

8

6

5

10

7

0

10

x7

18

15

13

15

9

12

10

0

l4

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

7

5

3

9

13

8

x1

7

0

2

4

6

10

8

x2

5

2

0

2

4

8

6

x3

3

4

2

0

6

10

5

x4

9

6

4

6

0

10

10

9

x5

13

10

8

10

10

0

7

12

x6

8

8

6

5

10

7

0

10

x7

9

12

10

0

4

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x3

x3

x3

x3

x3

x3

x7

x1

x3

x1

x2

x2

x2

x2

x2

x7

x2

x3

x1

x2

x3

x4

x5

x6

x7

x3

x0

x2

x2

x3

x2

x2

x6

x7

x4

x3

x2

x2

x2

x4

x5

x2

x7

x5

x3

x2

x2

x2

x4

x5

x6

x7

x6

x3

x2

x2

x3

x2

x5

x6

x7

x7

x0

x1

x2

x3

x4

x5

x6

x7

6

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x3

x3

x3

x3

x3

x3

x4

x1

x3

x1

x2

x2

x2

x2

x2

x4

x2

x3

x1

x2

x3

x4

x5

x6

x4

x3

x0

x2

x2

x3

x2

x2

x6

x4

x4

x3

x2

x2

x2

x4

x5

x2

x7

x5

x3

x2

x2

x2

x4

x5

x6

x7

x6

x3

x2

x2

x3

x2

x5

x6

x7

x7

x4

x4

x4

x4

x4

x5

x6

x7

5

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x3

x3

x3

x3

x3

x3

x4

x1

x3

x1

x2

x2

x2

x2

x2

x4

x2

x3

x1

x2

x3

x4

x5

x6

x4

x3

x0

x2

x2

x3

x2

x2

x6

x4

x4

x3

x2

x2

x2

x4

x5

x2

x7

x5

x3

x2

x2

x2

x4

x5

x6

x7

x6

x3

x2

x2

x3

x2

x5

x6

x7

x7

x4

x4

x4

x4

x4

x5

x6

x7

l6

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

7

5

3

9

13

8

18

x1

7

0

2

4

6

10

8

15

x2

5

2

0

2

4

8

6

13

x3

3

4

2

0

6

10

5

15

x4

9

6

4

6

0

10

10

9

x5

13

10

8

10

10

0

7

12

x6

8

8

6

5

10

7

0

10

x7

18

15

13

15

9

12

10

0


l7

x0

x1

x2

x3

x4

x5

x6

x7

x0

0

7

5

3

9

13

8

18

x1

7

0

2

4

6

10

8

15

x2

5

2

0

2

4

8

6

13

x3

3

4

2

0

6

10

5

15

x4

9

6

4

6

0

10

10

9

x5

13

10

8

10

10

0

7

12

x6

8

8

6

5

10

7

0

10

x7

18

15

13

15

9

12

10

0

7

x0

x1

x2

x3

x4

x5

x6

x7

x0

x0

x3

x3

x3

x3

x3

x3

x4

x1

x3

x1

x2

x2

x2

x2

x2

x4

x2

x3

x1

x2

x3

x4

x5

x6

x4

x3

x0

x2

x2

x3

x2

x2

x6

x4

x4

x3

x2

x2

x2

x4

x5

x2

x7

x5

x3

x2

x2

x2

x4

x5

x6

x7

x6

x3

x2

x2

x3

x2

x5

x6

x7

x7

x4

x4

x4

x4

x4

x5

x6

x7

Рис. 46. Выбор кратчайшего пути по алгоритму Флойда.

По матрицам l7 и 7 можно найти длину и переход между любой парой вершин исходного графа. Например, между вершинами х0 и х7 длина кратчайшего пути равна 18, а переход опирается на вершины (х03247), между вершинами х1 и х6 длина кратчайшего пути равна 8, а переход опирается на вершины (х126) и т.д.

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

Для решения подобных задач разработаны алгоритмы двойного поиска, обобщенные алгоритмы Флойда и Данцига. В основе обобщенных алгоритмов лежат те же идеи, которые были использованы в построении исходного алгоритма Флойда. Отличие состоит в том, что в обобщенных алгоритмах обычные операции сложения и сравнения над числами, оценивающими длину пути от вершины хi к вершине хj, заменяются обобщенными операциями сложения и сравнения. Суть обобщенных операций сложения и сравнения заключена в операндах этих операций, в роли которых выступают кортежи (li,j(1);li,j(2);...li,j(k)), компоненты которых li,jm есть длина m-го пути между вершинами хi и хj, а индекс k указывает число путей, обеспечивающих решение поставленной задачи. Следует обратить внимание на упорядоченность длин, т.е. li,j(1)<li,j(2)<...<li,j(k). Другая особенность обобщенных алгоритмов заключена в учете возможности возникновения контуров на кратчайших путях. В [7] подробно описаны обобщеные алгоритмы Флойда и Данцига и даны примеры их использования.