
- •1. Алгоритмы построения кратчайших путей
- •1.1. Алгоритм Дейкстры
- •Пример плана программы, реализующей алгоритм Дейкстры для системы matlab.
- •Этап 1:
- •Этап 2:
- •1.2. Алгоритм Беллмана – Форда построения дерева кратчайших путей для сети с произвольными весами
- •Пример плана программы, реализующей алгоритм Беллмана-Форда для системы matlab.
- •Этап 1:
- •Этап 2:
- •Расчетно-графическая работа № 1
- •Построение кратчайших и максимальных путей
- •В ориентированной сети
- •Задание:
1. Алгоритмы построения кратчайших путей
Рассмотрим сеть, состоящую из n узлов. Каждой дуге сети сопоставлена некоторая величина (вес), которая может интерпретироваться как расстояние между узлами, цена, время или энергия. Выделим в этой сети два узла: s – вход и t – выход. Рассмотрим задачу нахождения кратчайшего пути из узла s в узел t. Будем предполагать, что в любой узел можно попасть из входа и из любого узла можно попасть на выход. Узлы, не удовлетворяющие этому свойству, можно удалить.
Заметим, что для существования кратчайшего пути необходимо, чтобы в сети не было контуров отрицательной длины. В противном случае каждое прохождение по таким контурам уменьшало бы длину пути, а значит, и поставленная задача не имела бы решения. Предположим, что рассматриваемые графы (и сети) не имеют подобных контуров.
1.1. Алгоритм Дейкстры
Алгоритм Дейкстры применяется для сетей, не имеющих дуг с отрицательными весами, и состоит из двух этапов: на первом этапе находят длину кратчайшего пути, а на втором – строят сам путь.
Алгоритм Дейкстры называют также алгоритмом расстановки меток, так как основная идея алгоритма состоит в том, что каждой вершине приписывается метка, которая может быть временной и постоянной. Временная метка вершины равна длине некоторого пути до нее из исходной вершины, а постоянная метка равна длине кратчайшего пути. Алгоритм действует до тех пор, пока узел, являющийся концом пути, не получит постоянной метки.
Формализуем задачу.
Рассмотрим сеть
.
Обозначим через
соответственно начало и конец искомого
пути
.
Предположим, что
для любой дуги
.
Припишем метку
каждому узлу
.
Этап 1. (нахождение длины кратчайшего пути).
Будем обозначать текущий узел через u.
Шаг 0.
(расстановка начальных меток). Присваиваем
начальному узлу метку «0» и превращаем
эту метку в постоянную:
( «*», приписанная метке означает, что
она превращена в постоянную). Всем
остальным узлам приписываем метки,
равные +∞:
.
В качестве текущего
узла выберем узел
:
.
Шаг 1.
(изменение меток). Для всех узлов,
непосредственно следующих из узла u,
т.е. для всех
(см.
опр. 1.3), изменяем метки по следующему
правилу:
.
(1)
Шаг 2. (превращение метки в постоянную). Из всех узлов с временными метками выбираем в качестве постоянного узел с минимальным ее значением:
(2)
и выбираем этот узел в качестве текущего: u:=х.
Шаг 3.
Проверяем условие
.
Если оно верно, то первый этап завершен:
,
в противном случае возвращаемся к шагу
1.
Этап 2. (нахождение кратчайшего пути методом последовательного возвращения).
Шаг 0.
Выпишем все постоянные метки графа. В
качестве текущего возьмем конечный
узел пути:
.
Шаг 1.
Для всех узлов, непосредственно
предшествующих узлу u,
т. е. для всех
(см.
опр. 1.3), проверяем выполнение равенства:
(3)
Если оно верно, то
дугу
добавим в искомый путь и выберем узел
х
в качестве текущего: u:=х.
Шаг 2.
Проверяем условие
.
Если оно верно, то второй этап завершен,
в противном случае возвращаемся к шагу
1.
Замечание 1. Если равенство (3) выполнено для нескольких узлов, то в качестве текущего рассмотрим любой из них.
Пример 1. Рассмотрим
сеть
,
состоящую из пяти
узлов и найдем кратчайший путь из узла
в узел
.
Рис. 1. Сеть
На рис. 2 представлена
сеть
,
где узлы изображены кружками, внутри
которых будем вписывать получаемые ими
в результате работы алгоритма метки.
Шаг 0
.
– текущий узел.
Рис. 2. Узел
получил постоянную метку.
1-я итерация
Шаг 1
– узлы, непосредственно следующие за
u,
для них определяем новые метки:
;
;
Шаг 2 Превращение метки в постоянную:
;
Шаг 3
,
этап 1 не закончен,
;
Рис. 3. Узел
получил постоянную метку.
2-я итерация
Шаг 1
,
следовательно меняем метку узла
:
;
Шаг 2 Превращение метки в постоянную:
Шаг 3
,
этап 1 не закончен,
;
Рис. 4. Узел
получил постоянную метку.
3-я итерация
Шаг 1
,
новые
метки:
;
Шаг 2 Превращение метки в постоянную:
;
Шаг 3
,
этап 1 не закончен,
;
Рис. 5. Узел
получил постоянную метку.
4-я итерация
Шаг 1
новые
метки:
;
Шаг 2
Превращение метки в постоянную:
;
Шаг 3
,
длина кратчайшего пути из
в
равна 7.
Рис. 6. Длина кратчайшего пути до узла равна 7.
Таким образом,
.
ЭТАП 2
1-я итерация
Шаг 1
;
– узлы, непосредственно предшествующие
u;
найдем узел, для которого верно:
:
:
,
следовательно, включаем дугу
в кратчайший путь;
:
;
Шаг 2
,
;
2-я итерация
Шаг 1
,
:
:
,
следовательно, включаем дугу
в кратчайший путь;
Шаг 2
,
;
3-я итерация
Шаг 1
,
:
:
,
следовательно, включаем дугу
в кратчайший путь;
Шаг 2
.
Таким образом,
кратчайший путь:
,
.
Рис. 7. Кратчайший путь из
в
сети