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

Алгоритм определения кратчайших путей

Эта задача имеет большое значение в практических примене­ниях. К ней сводятся многие задачи выбора наиболее экономичного (с точки зрения расстояния или стоимости) маршрута на имеющейся карте дорог, наиболее экономичного способа перевода динамиче­ской системы из одного состояния в другое и т.д. Существует много математических способов решения, но часто методы, основанные на теории графов, наименее трудоемки.

Рассмотрим задачу о кратчайшем пути. Пусть дан граф G(X), ду­гам которого приписаны веса (расстояния, стоимости и т.п.), задаваемые матрицей С = || cij ||.

Задача о кратчайшем пути состоит в нахож­дении кратчайшего пути от заданной начальной вершины s Î X до заданной конечной вершины t Î X при условии, что такой путь су­ществует. В общем случае возможно Сij > 0, Сij < 0, Сij = 0. Единст­венное ограничение состоит в том, чтобы в графе G(X) не было циклов с отрицательным суммарным весом.

Приведем очень простой и эффективный алгоритм Дейкстры решения этой задачи для случая Сij ³ 0 " i, j. Алгоритм основан на приписывании вершинам временных пометок, причем пометка вер­шины дает верхнюю границу длины пути от s к этой вершине. Вели­чины этих пометок постепенно уменьшаются с помощью некоторой итерационной процедуры, и на каждом шаге итерации точно одна из временных пометок становится постоянной. Это означает, что по­метка уже не является верхней границей, а дает точную длину крат­чайшего пути от s к рассматриваемой вершине. Пусть l(xi) – пометка вершины xi. Опишем основные этапы алгоритма.

Шаг 1. Присвоение начальных значений. Для исход­ной вершины s положим l (s) = 0 и эта пометка будет по­сто­янной. Для всех других вершин имеем: 1(хi) = ¥ " xi ¹ s. Эти пометки временные. Положим p = s и составим мно­жество образов этой вершины: G(p).

Шаг 2. Обновление пометок. Для всех xi Î G(p), помет­ки которых являются времен­ными, изменить пометки в соответствии с выражением:

1(хi) = min [1(хi), 1(р) + c(p, xi)] (8)

Шаг 3. Превращение пометок в постоянные. Среди всех вершин с временными пометками найти та­кую xi*, для которой l(xi*) = min[l(xi)]. Считать пометку вершины xi* постоянной и положить р = xi*.

Шаг 4. Переход к шагу 2, если р ¹ t. Останов при р = t. В случае, если требуется найти лишь путь от s к одной вершине t, следует окончание счета. Длина этого крат­чайшего пути будет 1(р).

При необходимости нахождения путей от s ко всем остальным вершинам графа переходим к шагу 2. Продолжаем вычисления, пока все вершины не получат по­стоянные пометки. Эти отметки и дают длины кратчайших путей от s к этим вершинам.

Проиллюстрируем работу алгоритма на примере графа, изо­браженного на рис. 3.34. Матрица весов – в табл. 3.4. Граф является смешанным, т. е. ребра у него ориентирова-нные и неори­ентированные. Требуется найти все кратчайшие пути от x1 ко всем остальным вершинам. Постоянные пометки будем обозначать знаком +.

Шаг 1. l(x1) = 0+, 1(xi) = ¥ " xi ¹ x1, р = x1.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: