Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CLIO_фокин24.doc
Скачиваний:
9
Добавлен:
18.11.2019
Размер:
3.11 Mб
Скачать

3.4. Кратчайшие пути в графах. Волновой алгоритм построения дкп (Дейкстра)

Аналогичен алгоритму Прима (Т=O(n2)), но теперь D(k) – текущее кратчайшее расстояние до вершины, в которой находится аварийная служба, и для которой проводится инициализация. При корректировке сравниваем R=D(k)+d(k,j) и D(j). Если < - то коррекция: D(j)=R. Алгоритм работает корректно, если все d(i,j)≥0.

Рассмотрим работу алгоритма Дейкстры на том же примере, что и алгоритм Прима:

O

1

1

1

1

4

6 5

2 3

6 7

i

1

2

3

4

5

6

7

8

9

D

1

3

2

4

7 5

7 5

9 7

W

1

1

1

1

1

1

1

1

0


N

W  O-1(>0) ={i}

{Di}

Dk=

min Di

k=

argmin

W  S(k)

j

Oj

Dj

R= Dk+dk,j

коррекция

Oj=k, Dj=R

2

{4,3,2}

{2,3,1}

1

2

{3, 7}

3

≠0

3

5+1=6

нет

7

=0

6+1=7

O7=2, D7=7

3

{4,3,7}

{2,3,7}

2

4

{3, 5}

3

≠0

3

1+2=3

нет

5

=0

2+2=4

O5=4, D5=4

4

{5,3,7}

{4,3,7}

3

3

{5, 6, 7}

5

≠0

4

3+3=6

нет

6

=0

3+4=7

O6=3, D6=7

7

≠0

7

3+2=5

O7=3, D7=5

5

{5,6,7}

{4,7,5}

4

5

{6}

6

≠0

7

4+1=5

O6=5, D6=5

6

{6,7}

{5,5}

5

6

{7, 8}

7

≠0

5

5+1=6

нет

8

=0

5+4=9

O8=6, D8=9

7

{7,8}

{5,9}

5

7

{8}

8

≠0

9

5+2=7

O8=7, D8=7

8

{8}

{7}

7

8

{}

нет

Получили ДКП. По сравнению с МОД здесь произошли 2 замены: ребро (1,3) вместо (4,3) и ребро (3,7) вместо (6,7) .

При этом вторая замена, увеличив суммарную длину ребер на 1, уменьшила на 1 расстояние от вершины 1 до в-н 7 и 8.

Первая же замена, увеличив сумму длин ребер на 2, никаких расстояний не уменьшила. Нужна оптимизация по Парето.

Корректность алгоритма Дейкстры

Dk(i) - текущее расстояние от i-й до 1-ой вершины, на k-ом шаге

Ok(i) – отец вершины i, на k-ом шаге

Свойства: (считаем, что вершины перенумеровав в порядке включения)

  1. Dk(i) не возрастает по ki.

  2. Dk(k) не убывает по k при условии, что dij≥0.

  3. i → O(i) → O 2(i) …→ 1 - текущий кратчайший путь из i в 1.

  4. Dk(i)= длина пути (из пункта 3) из i в 1.

  5. Для включенных вершин текущий путь по предкам является оптимальным.

  6. Если i1 → i2 →…→1 - это кратчайший путь из i1 в 1, то D(i1)=D(i2)+

Справедливы утверждения:

  1. Задача нахождения всего ДКП имеет смысл в случае ориентированного ациклического графа или графа с циклами положительной длины. В неориентированном графе все ребра должны иметь неотрицательную длину.

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

21. Алгоритм Флойда (могут быть ребра отрицательной длины) :

D

R:=D; Oij=0; i,j

for k:=1 to n

for ik от 1 до n

цикл jk от 1 до n

если rik+rkj<rij

то{rij:=rik+rkj; Oij:=k}

end end end

return (R,O)

={dij≥0} – матрица расстояний, R={rij – кратчайшее расстояние между i и j}

Если на диагонали матрицы R на выходе алгоритма окажутся отрица­тельные элементы  есть цикл с отрицательной длиной, иначе циклов с отрицательной длиной нет и Rij – кратчайшее расстояние между i и j.

“—“ аналог ∞.

Пример: на входе - матрица расстояний D. На выходе на диагонали матрицы R есть отрицательные числа  цикл отрицательной длины  R не матрица кратчайших расстояний.

Поменяем порядок перебора вершин: k=1, k=4, k=3, k=2

D:

k=1

k=2

k=3

k=4

k=4

k=3

k=2

-

10

6

-

-

10

6

-

20

10

5

-

11

8

5

8

11

8

5

8

-

10

6

-

12

4

6

9

10

9

4

7

10

-

-5

-

10

20

-5

-

10

20

-5

-

1

-2

-5

-2

1

-2

-5

-2

10

20

-5

-

1

-2

-5

-2

1

20

-5

-2

6

3

-

3

6

3

12

3

6

3

-2

3

6

3

-2

3

6

3

-2

3

6

3

6

3

6

3

6

3

4

3

-2

1

-

-

3

-

-

-

3

-

-

-

3

-

9

6

3

6

9

6

3

6

-

-

3

-

9

6

3

6

7

6

1

4

Результат зависит от нумерации вершин. Что значат числа в полученной матри­це? После 1-го шага – это длины либо прямых путей, либо двузвенных (через 1 вершину?). После 2-го шага число разрешенных звеньев увеличивается до 4, после 3-го шага – до 8. В результате получим путь длины 2 через 1-ю вер­шину: 2(1)+2(2)+2(3)+3(1 2)+3(1 3)+3(2 3)+4(1 2 1)+4(1 3 1)+4(2 3 2)+8(1 2 1 3 1 2 1)+… +7(…)+… +6(…)+…+5(…)+… В цепочках не участвует только вершина 4 (на 3-ем шаге).

С каждой матрицей можно связать списки вершин. Например: S2= (0,1,2,12, 121).

S3={(v, u): v, uS2}, | S2| = 6  6, | S3| = 36  36- мощность S3.???