Вятский государственный университет
Опубликован: 07.04.2008 | Доступ: свободный | Студентов: 3233 / 827 | Оценка: 4.31 / 3.94 | Длительность: 06:04:00
Специальности: Программист, Математик

Лекция 9: Алгоритм Дейкстра поиска кратчайших путей в графе

< Лекция 8 || Лекция 9: 123
Аннотация: Рассматриваются метод Дейкстра нахождения кратчайших путей. Приводятся сведения о методике построения базы для взвешенного графа. Цель лекции: Дать представление о методе нахождения кратчайших путей во взвешенном графе.
Ключевые слова: база

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

Дан граф G = (X, A, C) со взвешенными дугами, пример которого показан на рис. 9.1 Обозначим L(хi) пометку вершины хi . Веса дуг (или ребер) даны матрицей весов ( таблица 9.1).

Граф со взвешенными дугами

Рис. 9.1. Граф со взвешенными дугами
Таблица 9.1. Матрица весов расстояний
   с1 с3
   с2
   с5
    с4

Рассмотрим алгоритм нахождения кратчайшего пути от вершины s к вершине t графа и более общий случай: от вершины s ко всем вершинам графа.

Присвоение начальных значений

Ш А Г 1. Положить L(s) = 0 и считать эту пометку постоянной. Для всех вершин х_{i} \ne  s положить L(х_{i})= \infty и считать эти пометки временными. За текущую рассматриваемую вершину с постоянной пометкой возьмем вершину p, т. е. положить p = s.

Обновление пометок

Ш А Г 2. Для вершин, входящих в прямое отображение вершины р, т. е. для всех хi , принадлежащих Г(p), пометки которых временные, изменить пометки в соответствии со следующим выражением:

L(хi) <- min [ L(хi), L(p) + C(p, хi) ].

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

Ш А Г 3. Среди всех вершин с временными пометками найти такую, для которой

L(x*i)=min[L(xi)].

Ш А Г 4. Считать пометку вершины x*i постоянной и положить p=x*i.

Ш А Г 5(a ). { При нахождении пути от s к t }

  • Если текущая вершина p является искомой, т. е. p = t, то L(p) является длиной кратчайшего пути от s к t. Останов.
  • Если p \ne  t, перейти к шагу 2.

Ш А Г 5(б). { При нахождении путей от s ко всем вершинам }

  • Если все вершины отмечены постоянными метками, то эти метки дают длины кратчайших путей.
  • Если некоторые метки являются временными, то следует перейти к шагу 2.

Как только длины кратчайших путей от вершины s будут найдены, сами пути можно получить с помощью рекурсивной процедуры ( * ). Так как вершина x*i непосредственно предшествует вершине хi в кратчайшем пути от s к хi , то для любой вершины хi соответствующую вершину x*i можно найти как одну из оставшихся вершин, для которой

L(x*i)+c( x*i, xi)=L( xi).(*)

Если кратчайший путь от s до любой вершины хi является единственным, то дуги (x*i, xi) этого кратчайшего пути образуют ориентированное дерево с корнем s. Если существует несколько кратчайших путей от s к какой-либо другой вершине, то при некоторой фиксированной вершине x*i соотношение ( * ) будет выполняться для более чем одной вершины хi . В этом случае выбор может быть либо произвольным (если нужен какой-то один кратчайший путь между s и хi ), либо таким, что рассматриваются все дуги (x*2,x2), входящие в какой-либо из кратчайших путей, и при этом совокупность всех таких дуг образует не ориентированное дерево, а общий граф, называемый базой относительно s.

П р и м е р. Рассмотрим граф смешанного типа, изображенный на рис. 9.2,а, где каждое неориентированное ребро рассматривается как пара противоположно направленных дуг равного веса. Матрица весов приведена на рис. 9.2,б. Требуется найти все кратчайшие пути от вершины х1 ко всем остальным вершинам.

Пример поиска кратчайшего пути: а –  граф; б – матрица весов дуг

Рис. 9.2. Пример поиска кратчайшего пути: а – граф; б – матрица весов дуг

Постоянные пометки будем помечать знаком +.

Ш А Г 1. Присвоим L(х_{1}) = 0, L(х_{i}) = \infty для всех хi , кроме х1 . Положим р = х1 .

Первая итерация

Ш А Г 2. Найдем прямое отображение для текущей рассматриваемой вершины: Г(р) = Г(х1) = { х2, х7, х8, х9 }. Все вершины, входящие в прямое отображение имеют временные пометки, поэтому пересчитаем их значение:

L(x_{2})=min[L(x_{2}),L(x_{1}) + c(x_{1},x_{2})]=min[\infty ,0+10]=10

L(x_{7})=min[\infty ,0+3]=3

L(x_{8})=min[\infty ,0+6]=6

L(x_{9})=min[\infty ,0+12]=12

Ш А Г 3. На данном шаге итерации имеем следующие временные метки вершин:

L(х_{2}) = 10,  L(х_{3}) = \infty,

L(х_{7}) = 3,     L(х_{4}) = \infty,

L(х_{8}) = 6,     L(х_{5}) = \infty,

L(х_{9}) = 12,  L(х_{6}) = \infty.

Очевидно, что минимальную метку, равную 3, имеет вершина х7 .

Ш А Г 4. За следующую текущую метку принимаем вершину х7 , т. е. p = х7 , а ее метка становится постоянной, L(х7) = 3+ .

Ш А Г 5. Так как не все вершины графа имеют постоянные метки, переходим к шагу 2.

< Лекция 8 || Лекция 9: 123
Dmitry Schelkov
Dmitry Schelkov

В лекции 3 часть номер 2 приведён пример нахождения транзитивного замыкания по матрице смежности. Из примера для обратного транзитивного замыкания видно, что путь для достижения вершины х6 в вершину х3 равен 3, а не 2, как показано в табличном примере. Мне кажется, что в лекции ошибка.

Вячеслав Коваленко
Вячеслав Коваленко

В курсе "Введение в теорию графов" в лекции 4 "Достижимость в графарх" дано выражение для нахождения множетсва вершин, входящих в путь из одной вершины графа в другую и по рис.4.2. показан пример нахождения такого множества для пути из вершины х2 в вершину х4 - это множетсво (х2, х3, х4, х5). По рисунку видно что путь не оптимален и для того, чтобы он проходил через все вершины этого множества, через х4 нужно пройти два раза. Правильно ли я понимаю, что данное определение пути дает не всегда оптимальный путь и что определение оптимально (кратчайшего) пути - отдельная задача? Или в примере ошибка?