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

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. Кратчайший путь из в сети