Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МОТС / Часть1 / 13. Расскажите об алгоритме нахождения кратчайшего пути между двумя вершинами графа..doc
Скачиваний:
73
Добавлен:
22.03.2015
Размер:
568.32 Кб
Скачать

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

Он работает следующим образом. Первоначально за длину dik кратчайшей цепи между двумя произвольными узлами i и k (между которыми могут быть и промежуточные узлы) принимают длину дуги (i,k), соединяющей эти узлы. Затем последовательно проверяют всевозможные промежуточные узлы, расположенные между i и k . Если длина цепи, проходящей через некоторый промежуточный узел, меньше текущего значения dik , то переменной dik присваивают новое значение ; если

dik > dij + djk , то значение dik заменяют значением (dij + djk). Такую процедуру повторяют для всевозможных пар узлов, пока не будут получены все значения d*ik.

В алгоритме Флойда начальным значением переменной dik является величина Cik, а затем данная оценка последовательно улучшается до тех пор, пока не будет найдена кратчайшая цепь между узлами i и k .

Алгоритм Флойда позволяет решать задачу о многополюсной кратчайшей цепи (пути) для сети из n узлов за n итераций. Обозначим символом djik оценку длины кратчайшей цепи из узла i в узел k , полученную на j-той итерации, и рассмотрим следующую задачу.

ЗАДАЧА: Необходимо соединить восемь объектов многополосной цепью, причем один из объектов (№8) может быть только направляющим информацию, а остальные могут и направлять, и получать информацию без каких-либо ограничений.

На рисунке каждый объект представлен узлом, а каждая линия дугой.

Ориентированные дуги соответствуют распределительным звеньям, которые могут быть использованы для передачи информации только в указанном направлении. Числа, приписанные дугам, соответствуют расстоянию между объектами.

Требуется найти для каждого объекта кратчайшие пути, связывающие его с другими объектами.

РЕШЕНИЕ: Воспользуемся алгоритмом Флойда. Поскольку n=8, то число итераций в алгоритме будет 8. На каждой итерации строит матрицу длин кратчайших путей, которые содержат текущие оценки длин кратчайших цепей Dj = ||djik||, где D0=||Cik||, и маршрутов Rj, служащую для нахождения промежуточных узлов ( если таковые имеются ) кратчайших цепей. На j-той итерации Rj=||rjik||, где rjik -первый промежуточный узел кратчайшей цепи из i в k, выбираемый среди множества { 1 , 2 , … , j }, i = j = k, R0=||r0ik||, где r0ik = k.

Узел rjik может быть получен из следующего соотношения:

Строим матрицу длин кратчайших цепей D и матрицу маршрутов R , отсутствие связи помечаем знаком .

1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

1 0 9 3 1 1 2 3 4 5 6 7 8

2 9 0 2 7 2 1 2 3 4 5 6 7 8

3 2 0 2 4 8 6 3 1 2 3 4 5 6 7 8

4 3 2 0 5 4 1 2 3 4 5 6 7 8

5 7 4 0 10 5 1 2 3 4 5 6 7 8

6 8 10 0 7 6 1 2 3 4 5 6 7 8

7 6 5 7 0 7 1 2 3 4 5 6 7 8

8 9 12 10 0 8 1 2 3 4 5 6 7 8

ИТЕРАЦИЯ 1:

Выбираем базовый узел j = 1. В матрице D0 вычеркиваем j – ю строку (базовую) строку и j – ый (базовый) столбец. Чтобы определить, приведет ли использование узла 1 к более коротким цепям, необходимо исследовать элементы матрицы D0 с помощью трехместной операции:

djik = min[dj-1ik;dj-1ij+dj-1jk],.

Если dj-1ij = , т.е. j – ый элемент базового столбца равен , то djik=dj-1ik.

Если dj-1jk=, т.е. j – ый элемент базовой строки равен , то djik=dj-1ik.

Если dj-1ik и одно из двух значений dj-1ij или dj-1jk превосходит dj-1ik, то замену также производить не следует.

Столбцы 3, 5, 6, 7, 8 содержат элементы, равные и принадлежащие базовой строке, а строки 3, 5 – 8 содержат элементы, равные и принадлежащие базовому столбцу, т.е. исследовать надо элементы (2, 2), (2, 4), (4, 2), (4, 4). Поскольку диагональные элементы можно не рассматривать, необходимо исследовать лишь оценки d024 и d042:

d124= min[d024;d021+d014]= min[;9+3]=12;

d142 = min[d042;d041+d012]= min[;3+9]=12.

Оценки d124 и d142 лучше оценок d024 и d042, поэтому они должны быть внесены в матрицу D1, а в матрице маршрутов R1 надо положить r124=1;r142 = 1.