Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

дискретка / Лекция 9

.doc
Скачиваний:
84
Добавлен:
27.05.2015
Размер:
280.58 Кб
Скачать

Лекция 9.

п.9. Нахождение кратчайших путей. Алгоритм Дейкстры.

До сих пор мы рассматривали графы, в которых нас интересовали вершины и ребра (дуги), по которым можно перемещаться. Теперь можно рассматривать не только перемещение из одной вершины в другую, но и то, как это сделать наилучшим способом. Первый вопрос состоит, конечно, в том, что означает «наилучшим способом». Это может быть самый дешевый путь, самый безопасный путь, кратчайший путь или тот, который требует минимум энергии, или путь, выбранный в соответствии с каким-то иным критерием.

Для решения такого класса задач рассматриваются взвешенные графы (орграфы), ребрам (дугам) которых приписан некоторый вес. Общий подход к решению задачи о кратчайшем пути был развит американским математиком Ричардом Беллманом (1920 – 1984), который предложил для этого вида задач название динамическое программ-мирование. Задача о кратчайшем пути – это частный случай задачи, которую можно сформулировать следующим образом. Формулировка задачи: найти в заданном графе пути, соединяющие две заданные вершины и доставляющие минимум или максимум некоторой аддитивной функции, определенной на путях. Чаще всего эта функция трактуется как длина пути, и задача называется задачей о кратчайших путях.

Алгоритм Дейкстры (Едсгер Дейкстра, нидерландский математик, 1930 – 2002) является одной из реализаций этой задачи. Его часто еще называют алгоритмом расстановок меток.

Пусть – ориентированный граф с взвешенными дугами. Обозначим s-вершину – начало пути и t-вершину – конец пути. В процессе работы алгоритма Дейкстры вершинам орграфа xiV приписываются числа (метки) d(xi), которые служат оценкой длины (веса) кратчайшего пути от вершины s к вершине xi. Если вершина xi получила на некотором шаге метку d(xi), это означает, что в графе G существует путь из s в xi, имеющий вес d(xi). Метки могут находиться в двух состояниях – быть временными или постоянными. Превращение метки в постоянную означает, что кратчайшее расстояние от вершины s до соответствующей вершины найдено. Алгоритм Дейкстры содержит одно ограничение – веса дуг должны быть положительными. Сам алгоритм состоит из двух этапов. На первом находится длина кратчайшего пути, на втором строится сам путь от вершины s к вершине t.

Алгоритм Дейкстры.

Этап 1. Нахождение длины кратчайшего пути.

Шаг 1. Присвоение вершинам начальных меток.

Полагаем d(s)=0*, и считаем эту метку постоянной (постоянные метки помечаем сверху звездочкой). Для остальных вершин xiV, xis полагаем d(xi)= и считаем эти метки временными. Пусть, – обозначение текущей вершины.

Шаг 2. Изменение меток.

Для каждой вершины xi с временной меткой, непосредственно следующей за вершиной , меняем ее метку в соответствии со следующим правилом:

.

Шаг 3. Превращение временной метки в постоянную.

Из всех вершин с временными метками выбираем вершину с наименьшим значением метки

- временная.

Превращаем эту метку в постоянную и полагаем .

Шаг 4. Проверка на завершение первого этапа.

Если , то – длина кратчайшего пути от s до t. В противном случае происходит возвращение ко второму шагу.

Этап 2. Построение кратчайшего пути.

Шаг 5. Последовательный поиск дуг кратчайшего пути.

Среди вершин, непосредственно предшествующих вершине с постоянными метками, находим вершину xi, удовлетворяющую соотношению

.

Включаем дугу в искомый путь и полагаем .

Шаг 6. Проверка на завершение второго этапа.

Если , то кратчайший путь найден – его образует последовательность дуг, полученных на пятом шаге и выстроенных в обратном порядке. В противном случае возвращаемся к пятому шагу.

Пример 9.1. По заданной матрице весов :

а) построить ориентированный граф;

б) найти полустепень захода и полустепень исхода каждой вершины;

в) построить матрицу смежности вершин, матрицу смежности дуг, матрицу инциденций;

г) найти величину минимального пути и сам путь от вершины s=x1 до вершины t=x7 с помощью алгоритма Дейкстры.

.

Решение.

а) По данной матрице весов изображаем орграф G, который не будет являться взвешенным

б) Находим полустепень исхода и полустепень захода для каждой вершины.

; ; ;

; ; .

;

Так как вершина x1 имеет , то эта вершина является истоком. Так как вершина x7 имеет , то эта вершина является стоком.

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

Поскольку количество дуг, исходящих из первой вершины в первую равно 0 (в орграфе нет петель, соответствующих первой вершине), исходящих из первой во вторую равно 1, из первой в третью равно 0, из первой в четвертую равно 1, из первой в пятую равно 1, из первой в шестую равно 1, из первой в седьмую равно 0, то первая строка матрицы имеет вид (0 1 0 1 1 1 0). Заполняя аналогично остальные строки, получаем матрицу вида:

.

Так как орграф имеет шестнадцать дуг, то матрица смежности дуг является квадратной матрицей шестнадцатого порядка. Дуга u1 предшествует дугам u5, u6 и u7. Поэтому первая строка матрицы имеет вид (0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0). Заполняем аналогично остальные строки, получаем матрицу вида:

.

Орграф имеет семь вершин и шестнадцать дуг, поэтому матрица инциденций является матрицей размерности 716. Поскольку вершина инцидентна дугам , , и , которые выходят из вершины , и не инцидентна остальным дугам, то первая строка матрицы имеет вид (1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0). Остальные строки матрицы заполняем аналогично, учитывая то, в каких случаях вершина будет началом, а в каких случаях концом дуги . Следовательно, матрица имеет вид:

.

г) Чтобы найти величину минимального пути и сам путь от вершины s=x1 до вершины t=x7 с помощью алгоритма Дейкстры, построим орграф, у которого к каждой дуге припишем ее вес.

Этап 1.

1) Полагаем .

.

2) За вершиной следуют вершины, которые образуют множество .

Пересчитываем временные метки:

, ,

, .

Получаем . Значит, вершине x2 присваивается постоянная метка . .

3) . Пересчитываем временные метки:

,

,

,

.

Получаем . Значит, вершине x5 присваивается постоянная метка . .

4) . Пересчитываем временные метки:

,

,

,

.

Получаем . Значит, вершине x4 присваивается постоянная метка ..

5) . Пересчитываем временные метки:

,

,

.

Получаем . Значит, вершинам x3 и x6 присваиваются постоянные метки . .

6) . Вершине x7 присваивается постоянная метка..

Этап 2.

Проводим последовательный поиск дуг кратчайшего пути.

Вершине предшествуют вершины . Кратчайшее расстояние получаем при прохождении по дуге .

Вершине предшествуют вершины . Кратчайшее расстояние получаем при прохождении по дуге .

Таким образом, кратчайший путь от вершины x1 до вершины x7 построен. Его длина (вес) равна 21, т.е. , сам путь образует следующую последовательность дуг .

Ответ: ;

Соседние файлы в папке дискретка