Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ODM-ch2(Дискретка).doc
Скачиваний:
28
Добавлен:
03.03.2016
Размер:
808.96 Кб
Скачать

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

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

Рассмотрим этот алгоритм для случая, когда вес каждого ребра графа неотрицателен (cij 0, (i,j)).

Алгоритм :

Пусть l(xi) – пометка вершины хi.

Шаг 1. Положить l(s)=0 и считать эту пометку постоянной. Положить l(xi)=∞ для всех хis и считать эти пометки временными. Положить p=s.

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

l(xi)← min [l(xi), l(p)+c(p,xi)]

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

l(xi­­­­* )= min [l(xi)]

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

Шаг 5. Если p=t, то l(p) является длиной кратчайшего пути. Если pt, то перейти к шагу 2.

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

l(xi’)+c(xi’,xi)=l(xi)

Алгоритм Форда

Задача о кратчайшем пути состоит в нахождении кратчайшего пути от заданной начальной вершины sX до заданной конечной вершины tX, при условии что такой путь существует. Элементы сij матрицы весов CG могут быть положительными, отрицательными или нулями.

Все циклы в графе G имеют неотрицательный суммарный вес.

Пусть l­­ k (xi) – пометка вершины хi в конце (k+1)-й итерации, Г(s)-множество вершин, смежных с s.

Шаг 1.Положим S=Г(s), k=1, l1(s)=0, l1(xi)=c (s,xi) для всех хiГ(s) и l1(xi)= для всех остальных xi.

Шаг 2.Для каждой вершины xi s) (xis) изменить ее пометку следующим образом :

l k+1 (xi) = min [ l k (xi­), min { l k ( xj ) + c ( xj, xi ) } ],

x j Ti

где T i = Г –1 ( x i ) S

Шаг 3. Если k<= n-1 и l k+1 ( x i ) = l k ( x i ) для всех хi , то пометки равны длинам кратчайших путей.

Если k< n-1 и lk+1(xi)lk(xi) для некоторой вершины xi , то перейти к шагу 4.

Если k= n-1 и l k-1 (xi)lk(xi) для некоторой вершины xi , то в графе существует цикл отрицательного веса и задача не имеет решения.

Шаг 4. Обновить множество следующим образом :

S = { x i \ l k+1 ( x i ) l k ( x i ) }

Шаг 5. Положить k=k+1 и перейти к шагу 2.

Алгоритм Флойда

Метод базируется на использовании последовательности из n преобразований (итераций ) начальной матрицы весов С. При этом на к-той итерации матрица представляет длины кратчайших путей между каждой парой вершин с тем ограничением, что путь между xi и xj (для любых xi и xj) содержит в качестве промежуточных только вершины из множества: {x1,x2,.........,xn}.

Все циклы в графе G имеют неотрицательный суммарный вес.

Шаг 1.Положить к=0.

Шаг 2. к=к+1

Шаг 3.Для всех ik, таких ,что сi k,и для всех jk, таких,что с k j ,введем операцию:

c i j = min [ c i j , ( c i k + c k j­ ) ]

Шаг 4. Если c i j <0 ,то в графе существует цикл отрицательного веса, содержащий вершину x i , и решения нет.

Если все c i j>=0 и k = n , то получено решение и матрица дает длины всех кратчайших путей.

Если все c i j >=0 но k<n , то вернуться к шагу 2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]