3.6. Алгоритмы поиска путей на графе.
Подобные задачи возникают при выборе маршрутов в вычислительных сетях и транспортных системах. В вычислительных сетях решение подобных задач определяет правила сетевых протоколов, которые могут быть реализованы аппаратно-программными средствами для обслуживания движения пакетов информации по сети. Для этого по данным о загрузке каналов сети, о состоянии ее узлов в сервере или коммутационной машине вычисляется наиболее оптимальный маршрут прохождения пакета информации. К пакету информации добавляется заголовок, в котором содержится перечень узлов сети перехода от вершины хi к вершине хj или следующая вершина перехода, формируемая коммутационной машиной. В транспортных системах решение подобных задач определяет наиболее экономный по стоимости или времени маршрут движения транспортной единицы.
Образом таких систем является реберно-взвешенный граф, т.е. граф, у которого каждое ребро или дуга имеют вес. Кратчайший путь в таком графе всегда простой, т.е. каждая вершина в переходе используется только один раз. Длина кратчайшего пути определяется суммой весов ребер перехода i,j=(хi;...хk;...хj):
Li,j=m,n lm,n, где im, nj, mn.
В основе всех алгоритмов лежит операция сравнения двух простых маршрутов. На рис. 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
а
li,p lp,j
li,j
б) x0 .. xi xp xj .. xn x0 0 .. l0i ∞ l0j .. l0n .. .. 0 .. .. .. .. .. xi li0 .. 0 lip lij .. lin ∞ .. lpi 0 lpj .. lpn xj lj0 .. lji ljp 0 .. ljn .. .. .. .. .. .. 0 .. xn ln0 .. lni lnp lnj .. 0nn
)

хp

xi xj


lp


xp
Рис. 45. Выбор маршрута между вершинами хi и хj.
Для поиска кратчайших путей разработаны несколько алгоритмов. Алгоритмы Форда-Беллмана и Дейкстра позволяют найти кратчайшие пути от заданной вершины графа до любой другой. В результате этих вычислений формируется граф типа “дерево” с корнем в заданной вершине.
Протяженность от начальной вершины до любой концевой вершины дерева есть кратчайший путь. Алгоритмы Форда-Беллмана и Дейкстра можно использовать для поиска остова минимального веса.
Алгоритмы Флойда и Данцига позволяют искать кратчайшие пути между любой парой вершин графа. Для текущих оценок кратчайших путей между парами вершин удобно использовать матрицы (nn), где 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,jp=хj;
б) если (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 |
|
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
0 |
9 |
∞ |
3 |
∞ |
∞ |
∞ |
∞ |
|
|
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 |
|
|
∞ |
∞ |
∞ |
∞ |
9 |
12 |
10 |
0 |
|
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
x0 |
0 |
9 |
∞ |
3 |
∞ |
∞ |
∞ |
∞ |
|
|
9 |
0 |
2 |
12 |
7 |
∞ |
∞ |
∞ |
|
|
∞ |
2 |
0 |
2 |
4 |
8 |
6 |
∞ |
|
|
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 |
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 |
|
|
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 |
x1 |
x1 |
x3 |
x1 |
x5 |
x6 |
x7 |
|
x1 |
x0 |
x1 |
x2 |
x0 |
x4 |
x5 |
x6 |
x7 |
|
|
x1 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
x0 |
x0 |
x2 |
x3 |
x1 |
x5 |
x6 |
x7 |
|
|
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 |
|
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
0 |
9 |
11 |
3 |
16 |
∞ |
∞ |
∞ |
|
|
9 |
0 |
2 |
12 |
7 |
∞ |
∞ |
∞ |
|
|
11 |
2 |
0 |
2 |
4 |
8 |
6 |
∞ |
|
|
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 |
|
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
0 |
9 |
11 |
3 |
15 |
19 |
17 |
∞ |
|
|
9 |
0 |
2 |
4 |
6 |
10 |
8 |
∞ |
|
x2 |
11 |
2 |
0 |
2 |
4 |
8 |
6 |
∞ |
|
|
3 |
4 |
2 |
0 |
6 |
10 |
5 |
∞ |
|
|
15 |
6 |
4 |
6 |
0 |
10 |
10 |
9 |
|
|
19 |
10 |
8 |
10 |
10 |
0 |
7 |
12 |
|
|
17 |
8 |
6 |
5 |
10 |
7 |
0 |
10 |
|
x7 |
∞ |
∞ |
∞ |
∞ |
9 |
12 |
10 |
0 |
|
3 |
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
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 |
|
|
x0 |
x2 |
x2 |
x3 |
x2 |
x2 |
x6 |
x7 |
|
|
x2 |
x2 |
x2 |
x2 |
x4 |
x5 |
x2 |
x7 |
|
|
x2 |
x2 |
x2 |
x2 |
x4 |
x5 |
x6 |
x7 |
|
|
x2 |
x2 |
x2 |
x3 |
x2 |
x5 |
x6 |
x7 |
|
x7 |
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
0 |
7 |
5 |
3 |
9 |
13 |
8 |
18 |
|
|
7 |
0 |
2 |
4 |
6 |
10 |
8 |
15 |
|
|
5 |
2 |
0 |
2 |
4 |
8 |
6 |
13 |
|
|
3 |
4 |
2 |
0 |
6 |
10 |
5 |
15 |
|
|
9 |
6 |
4 |
6 |
0 |
10 |
10 |
9 |
|
x5 |
13 |
10 |
8 |
10 |
10 |
0 |
7 |
12 |
|
|
8 |
8 |
6 |
5 |
10 |
7 |
0 |
10 |
|
x7 |
18 |
15 |
13 |
15 |
9 |
12 |
10 |
0 |
|
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
x0 |
0 |
7 |
5 |
3 |
9 |
13 |
8 |
∞ |
|
|
7 |
0 |
2 |
4 |
6 |
10 |
8 |
∞ |
|
|
5 |
2 |
0 |
2 |
4 |
8 |
6 |
∞ |
|
x3 |
3 |
4 |
2 |
0 |
6 |
10 |
5 |
∞ |
|
|
9 |
6 |
4 |
6 |
0 |
10 |
10 |
9 |
|
|
13 |
10 |
8 |
10 |
10 |
0 |
7 |
12 |
|
|
8 |
8 |
6 |
5 |
10 |
7 |
0 |
10 |
|
x7 |
∞ |
∞ |
∞ |
∞ |
9 |
12 |
10 |
0 |
|
4 |
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
|
x0 |
x3 |
x3 |
x3 |
x3 |
x3 |
x3 |
x7 |
|
|
x3 |
x1 |
x2 |
x2 |
x2 |
x2 |
x2 |
x7 |
|
|
x3 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
|
x3 |
x0 |
x2 |
x2 |
x3 |
x2 |
x2 |
x6 |
x7 |
|
|
x3 |
x2 |
x2 |
x2 |
x4 |
x5 |
x2 |
x7 |
|
|
x3 |
x2 |
x2 |
x2 |
x4 |
x5 |
x6 |
x7 |
|
|
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 |
x3 |
x3 |
x3 |
x3 |
x3 |
x3 |
x4 |
|
|
x3 |
x1 |
x2 |
x2 |
x2 |
x2 |
x2 |
x4 |
|
|
x3 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x4 |
|
|
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 |
|
|
x4 |
x4 |
x4 |
x4 |
x4 |
x5 |
x6 |
x7 |
|
|
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 |
|
|
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 |
По матрицам l7 и 7 можно найти длину и переход между любой парой вершин исходного графа. Например, между вершинами х0 и х7 длина кратчайшего пути равна 18, а переход опирается на вершины (х0;х3;х2;х4;х7), между вершинами х1 и х6 длина кратчайшего пути равна 8, а переход опирается на вершины (х1;х2;х6) и т.д.
При решении практических задач возникает необходимость поиска нескольких путей линейно упорядоченных относительно кратчайшего пути. Это возможно в силу загруженности канала на определенном участке или неисправности узла.
Для решения подобных задач разработаны алгоритмы двойного поиска, обобщенные алгоритмы Флойда и Данцига. В основе обобщенных алгоритмов лежат те же идеи, которые были использованы в построении исходного алгоритма Флойда. Отличие состоит в том, что в обобщенных алгоритмах обычные операции сложения и сравнения над числами, оценивающими длину пути от вершины х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] подробно описаны обобщеные алгоритмы Флойда и Данцига и даны примеры их использования.


l0
x0
x1
x7

l1


x1
x2
x3
x0
x3
x0
x2
x3
x4

l2
x0
x1
x2

x3
l3

x0


x1




x3


x4


x5
x6





x0

x3


x4

x5

x6

l5
x0
x1
x2
x3
x4


x6





l4
x1
x2


x4
x5
x6



x0
x1
x2
x4
x5
x6
x0
x1
x2
x3


x7


l6
x5