Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Расчетно-графическая работа - сети.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
466.43 Кб
Скачать

Пример плана программы, реализующей алгоритм Дейкстры для системы matlab.

Предположим, что имеется ориентированная сеть, имеющая шесть узлов, и множество дуг имеют неотрицательные веса. Пусть сеть задана с помощью матрицы смежности . Необходимо найти кратчайший путь от узла до узла . Приведем один из возможных вариантов плана программы для реализации алгоритма Дейкстры.

Этап 1:

  1. Задать матрицу W;

  2. Задать вектор меток: d=[0 inf inf inf inf inf];

  3. Задать вспомогательный вектор временных меток:

d1=[inf inf inf inf inf inf];

  1. Задать начальное значение для текущего узла: u=1;

  2. Задать вспомогательный вектор b: b=1;

  3. Проверить условие: u~=6? Если верно, то выполнить

    1. Найти множество узлов, следующих за u: S=W(u,:);

    2. Для всех 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);

    1. Найти минимальную из временных меток: [a,u]=min(d1);

    2. Выполнить: b=[b,u];

    3. Выполнить: d1(u)=inf;

  1. Длина кратчайшего пути М найдена: M=d(u).

Этап 2:

  1. Задать начальное состояние для вектора пути: Way=6;

  2. Проверить условие: u~=1? Если верно, то выполнить

    1. Найти множество узлов, предшествующих u: P=W(:,u);

    2. Для всех i=1:6 выполнить

Проверить P(i)~=inf? Если верно, выполнить:

Проверить d(u)=d(i)+P(i)? Если верно, выполнить

u=i;

    1. Выполнить: Way=[u,Way];

  1. Кратчайший путь найден; он проходит через узлы с номерами: 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. Дерево кратчайших путей.