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
а)
х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.
Для поиска кратчайших путей разработаны несколько алгоритмов. Алгоритмы Форда-Беллмана и Дейкстра позволяют найти кратчайшие пути от заданной вершины графа до любой другой. В результате этих вычислений формируется граф типа “дерево” с корнем в заданной вершине.
Протяженность от начальной вершины до любой концевой вершины дерева есть кратчайший путь. Алгоритмы Форда-Беллмана и Дейкстра можно использовать для поиска остова минимального веса.
Алгоритмы Флойда и Данцига позволяют искать кратчайшие пути между любой парой вершин графа. Для текущих оценок кратчайших путей между парами вершин удобно использовать матрицы (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 |
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 |
По матрицам 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] подробно описаны обобщеные алгоритмы Флойда и Данцига и даны примеры их использования.