Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭММ_Часть2_печать.doc
Скачиваний:
43
Добавлен:
03.09.2019
Размер:
5.35 Mб
Скачать

6.2.2.Алгоритм для сетей с циклами

А

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

Таблица 80

1

2

n –1

n

ui

1

d11

d12

d1, n-1

d1n

u1

2

d21

d22

d2, n-1

d2n

u2

n

dn1

dn2

dn, n-1

dnn

un

v1

v2

vn-1

vn

Пусть требуется определить кратчайший маршрут между узлом 1 и любым другим узлом сети j, j = 2,…, n. Алгоритм удобно представить, записав расстояния dij между узлами i и j в виде табл. 80 (заметим, что dij могут отличаться от dji). Таким образом, строка i (столбец j) представляет узел i (узел j). Шаги алгоритма можно представить следующим образом.

Шаг 1 Пусть vj – сумма длин дуг, образующих цепь, ведущую из узла 1 в узел j. Положим v1= 0 и ui равным vj, если i = j. При условии, что i и j и соединены дугой, величина vj определяется как vj = min{ui + di j}.

Процесс начинается с i = 1 и v1 =u1 = 0.

Заметим, что ui включает расстояния до узла i, которое заметим используется для определения ближайшего узла j. При этом требуется, чтобы обращение к значению ui (= vj) для i= j происходило сразу после появления vj и прежде чем вычислено какое-либо новое значение vj.

Шаг 2 Положить i =1.

1) Вычислить vjui для всех j.

2) Если dij vjui для всех j, то между узлами i и j не существует более короткого пути. Если i = n, перейти к п. 4. Иначе положить i=i+1 и перейти к п. 1.

3) Если di j< vj - ui, вычислить новые значения vj , v /j используя формулу

v /j = ui + di j .

Заменить vj и ui и для i = j на v /j. Если i = n, перейти к п. 4, в противном случае положить i=i+1 и перейти к п. 1.

4) Если значение vj изменялось в п. 3, повторить пункт 2, используя изменённое значение. В противном случае перейти к шагу 3.

Шаг 3 Полученные значения vj определяют кратчайшее расстояние между узлами 1 и j =2, 3, …, n. Для получения соответствующих цепей последняя дуга (i, j) в цепи (i, j) должна удовлетворять условию = vjdi j .

После определения i1 предпоследняя вершина i2 должна удовлетворять равенству =

Процесс продолжается, пока не будет достигнут узел 1.

Пример 6.0:

Рассмотрим сеть на рис. 6.4. Сеть содержит циклы, возникающие из-за возможности двустороннего движения. Если дуга ориентирована (т.е. движение одностороннее), расстояние в другом направлении полагается равным .

Соответствующие величины dij вместе с предварительными значениями ui и vj и приведены в табл. 81. Исходные величины vj и ui определяются следующим образом. Пусть u1 = v1 = 0 . При использовании формулы

vj = min{ui +di j}

Осуществляется последовательное обращение к величинами vj и ui по мере того как они становятся доступными.

v2 = 0+2= 2, u2 =2,

v3 = {u1 + d13 , u2 + d23}= {0+8, 2+3}= 5, u3 = 5,

v4 = {u1+d14 , u2+d34}= {0+11, 5+ }=11, u4 = 11,

v5 = {u1+d15, u2+d25}= {0+9, 2+5}=7, u5 =7,

v6 = {u2+d26,u3+d36,u4+d46 ,u5 +d56}= {2+1,5+2,11+2,7+7}= 3, u6= 3,

v7 = {u4 + d47 , u5 + d57, u6 + d67,}= {11+23,7+9,3+10}=13, u7=13.

Рис. 6.12. Пример сети с циклами

Таблица 81

i/j

1

2

3

4

6

6

7

ui

1

2

8

11

9

0

2

4

3

5

1

2

3

1

4

2

2

5

4

5

9

2

23

11

5

2

7

9

7

6

8

3

5

1

10

3

7

10

4

2

13

vj

0

2

5

11

7

3

13

При переходе к шагу 2 проводится проверка условия оптимальности путём сравнения (vjui) с dij следующим образом.

j = 1:

j = 1

2

3

4

5

6

7

vj u1

*

2

5

11

7

*

*

d1j

*

2

8

11

9

*

*

Поскольку vjuidij для всех j, величины vj пересчитывать не следует. Заметим, что для j=1, 6 и 7 расстояния dij не определены, поэтому эти величины при сравнении не берутся. В процессе реализации алгоритма обнаруживается, что условие оптимальности первый раз нарушается при i=6.

При i = 6 условие оптимальности нарушается для j = 4 и 5. Величины v4 и v5 изменяются следующим образом:

v /4 = u6 + d64 = 3+5=8 (v4=u4=8),

v /5 =u6 + d65 =3+1= 4 (v5 =u5=4).

В последующих вычислениях, т.е. для i=7, используются изменённые значения v4 , v5 и u4 , u5.

j = 2:

j = 1

2

3

4

5

6

7

vj u2

-2

*

3

*

5

1

*

d2j

4

*

3

*

5

1

*

j = 3:

j = 1

2

3

4

5

6

7

vj u3

-5

-3

*

6

*

-2

*

d3j

1

4

*

*

2

*

j = 4:

j = 1

2

3

4

5

6

7

vj u4

-11

*

-6

*

*

-8

2

d4j

5

*

9

*

*

2

23

j=5:

j = 1

2

3

4

5

6

7

vj u5

-7

-5

*

*

*

-4

6

d5j

2

*

*

*

7

9

j = 6:

j = 1

2

3

4

5

6

7

vj u6

*

-1

2

8

4

*

10

d6j

*

8

3

5

1

*

10

j =7:

j = 1

2

3

4

5

6

7

vj u7

*

*

*

-5

-9

-10

*

d7j

*

*

*

10

4

2

*

После этого повторяется шаг 2 с изменёнными значениями vj и ui. В табл. 82 приведены результаты сравнений, проведённых для i =1, 2, … ,7. Из этой таблицы видно, что в новых изменениях уже нет необходимости, и поэтому последние изменённые величины vj дают длину кратчайшего пути от 1 до j.

Покажем, каким образом используется ui и vj в табл. 81 для определения кратчайших расстояний между узлом 1 и каждым из узлов j=2, 3, … , 7. Проиллюстрируем процедуру на примере нахождения участков кратчайшего пути между узлами 1 и 7.

Как уже известно, кратчайшее расстояние между узлами 1 и 7 равно v7 = 13. Определение участков сети должно начинаться с узла 7. Требуется найти узел, непосредственно предшествующий узлу 7. Из столбца 7 табл. 81 видно, что равенство v7 =u1 + d17 , выполняется при i=5 и i=6, т. е. либо узел 5, либо узел 6 соединён с 7 (альтернативные решения).

Рассмотрим сначала узел 5. Из столбца 5 видно, что равенство v5=u1+d15 выполняется при i=6. Далее из столбца 6 следует, что равенство v6=u1+d16 выполняется при i=2. Наконец, как следует из столбца 2, равенство v2=u1+d12 выполняется при i=1. Получившиеся участки дают путь 12657 с v7 =13.

Аналогичная процедура позволяет получить другой кратчайший путь между узлами 1 и 7, а также все пути между узлами 1 и j = 2, 3, 4, 5 и 6.

Таблица 82

j =1

2

3

4

5

6

7

ui

i =1

2

2

5

8

8

11

4

9

0

i =2

-2

4

3

3

2

5

1

1

2

i =3

-5

1

-3

4

3

-2

2

5

i =4

-8

5

-3

9

-5

2

5

23

8

i =5

-4

2

-2

-1

7

9

9

4

i = 6

-1

8

2

3

5

5

1

1

10

10

3

i = 7

5

10

-9

4

-10

2

13

vj

0

2

5

8

4

3

13