- •1. Алгоритмы построения кратчайших путей
- •1.1. Алгоритм Дейкстры
- •Пример плана программы, реализующей алгоритм Дейкстры для системы matlab.
- •Этап 1:
- •Этап 2:
- •1.2. Алгоритм Беллмана – Форда построения дерева кратчайших путей для сети с произвольными весами
- •Пример плана программы, реализующей алгоритм Беллмана-Форда для системы matlab.
- •Этап 1:
- •Этап 2:
- •Расчетно-графическая работа № 1
- •Построение кратчайших и максимальных путей
- •В ориентированной сети
- •Задание:
Пример плана программы, реализующей алгоритм Дейкстры для системы matlab.
Предположим, что
имеется ориентированная сеть, имеющая
шесть узлов, и множество дуг имеют
неотрицательные веса. Пусть сеть задана
с помощью матрицы смежности
.
Необходимо найти кратчайший путь от
узла
до узла
.
Приведем один из возможных вариантов
плана программы для реализации алгоритма
Дейкстры.
Этап 1:
Задать матрицу W;
Задать вектор меток: d=[0 inf inf inf inf inf];
Задать вспомогательный вектор временных меток:
d1=[inf inf inf inf inf inf];
Задать начальное значение для текущего узла: u=1;
Задать вспомогательный вектор b: b=1;
Проверить условие: u~=6? Если верно, то выполнить
Найти множество узлов, следующих за u: S=W(u,:);
Для всех i=1:6 выполнить
Проверить S(i)~=inf? Если верно, заменить метку: d(i)=min(d(i),d(u)+S(i));
Проверить, что все элементы вектора b-i не равны 0: all(b-i)?
Если верно, выполнить:
d1(i)=d(i);
Найти минимальную из временных меток: [a,u]=min(d1);
Выполнить: b=[b,u];
Выполнить: d1(u)=inf;
Длина кратчайшего пути М найдена: M=d(u).
Этап 2:
Задать начальное состояние для вектора пути: Way=6;
Проверить условие: u~=1? Если верно, то выполнить
Найти множество узлов, предшествующих u: P=W(:,u);
Для всех i=1:6 выполнить
Проверить P(i)~=inf? Если верно, выполнить:
Проверить d(u)=d(i)+P(i)? Если верно, выполнить
u=i;
Выполнить: Way=[u,Way];
Кратчайший путь найден; он проходит через узлы с номерами: Way
1.2. Алгоритм Беллмана – Форда построения дерева кратчайших путей для сети с произвольными весами
Рассмотрим еще один алгоритм построения дерева кратчайших путей для сети, имеющей веса произвольного знака. Данный алгоритм применим и в том случае, если в сети имеется цикл отрицательной длины. Тогда алгоритм выдает соответствующее сообщение и прекращает работу.
Этап 1. (нахождение длин кратчайших путей до узлов сети).
Шаг 0. Расстановка начальных меток. Присваиваем начальному узлу метку «0»
,
всем остальным узлам приписываем метки, равные +∞:
.
Шаг 1. Для всех i от 0 до n-1 выполняем:
Для каждой
дуги
выполняем
.
Шаг 2. Для каждой дуги проверяем выполнение неравенства
.
Если нашлась дуга, для которой это неравенство выполняется, то задача не имеет решения, поскольку в этом случае в графе существует цикл отрицательной длины. В противном случае перейти к этапу 2.
Этап 2 аналогичен Этапу 2* модификации алгоритма Дейкстры.
Трудоемкость
данного алгоритма составляет О(nm),
так как от состоит из О(n)
итераций, в каждой из которых проводится
О(m)
операций. Корректность алгоритма следует
из того факта, что на k-й
итерации значение метки каждого узла
равно длине кратчайшего пути от исходного
узла до него с не более чем k
дугами. Поскольку путь не может содержать
более чем
дуг, то и оценку пути нельзя будет
уменьшить после
итераций. В противном случае в сети
существует цикл отрицательной длины.
Пример 3.3. Построим дерево кратчайших путей для сети из примера 3.2. В кружки, обозначающие узлы, будем записывать значения меток. На нулевом шаге вход s получает метку ноль, остальные узлы – ∞:
Рис. 3.13. Начальная расстановка меток сети.
В цикле для
,
рассматривая дуги
и
,
уменьшаем метки соответствующих узлов:
Рис. 3.14. Узлы и получили новые метки.
Далее рассматриваем дуги и :
Рис. 3.15. Узлы и t получили новые метки.
Следующие
рассматриваемые дуги
и
:
Рис. 3.16. Узел получил новую метку.
При
изменится метка только узла t
при рассмотрении дуги
:
Рис. 3.17.
Далее при
метки узлов меняться не будут,
следовательно, можно перейти ко второму
этапу алгоритма и построить дерево
кратчайших путей:
Рис. 3.18. Дерево кратчайших путей.
