Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ДМ.doc
Скачиваний:
133
Добавлен:
21.11.2019
Размер:
4.91 Mб
Скачать

2. Минимальные пути в нагруженных орграфах

Орграф D(V, X) называется нагруженным, если на множестве дуг X определена функция, называемая весовой, ставящая в соответствие каждой дуге некоторое действительное число l(x). Значение l(x) будем называть длиной дуги х.

Обозначим какой-либо путь в орграфе D через , тогда l() – длина этого пути, равная сумме длин входящих в  дуг. Заметим, что если длины всех дуг в орграфе равны 1, то длина любого пути будет равна числу дуг в этом пути. Таким образом, можно считать ненагруженный орграф нагруженным с длинами дуг, равными 1.

Путь в нагруженном орграфе D из вершины v в вершину w (v  w) называется минимальным, если он имеет минимальную длину среди всех путей орграфа D из v в w.

Длины дуг могут быть как положительными, так и отрицательными. Рассмотрим только такие орграфы, длины дуг которых есть числа l(x) > 0.

Приведем некоторые свойства минимальных путей в нагруженных орграфах:

    1. если для любой х Х l(x) > 0, то любой минимальный путь является простой цепью;

    2. если v1v2…vk – минимальный путь, то для любых номеров i и j таких, что 1 i j k , путь vi vi+1…vj также – минимальный;

    3. если v…uw – минимальный путь среди путей из v в w, содержащих не более k + 1 дуг, то v..u – минимальный путь среди путей из v в u , содержащих не более k дуг.

Рассмотрим теперь задачу поиска минимальных путей в орграфах.

Пусть D(V, X) – нагруженный орграф, n  2. Введем величины ik , где i = 1, …, n, k = 1, 2…Для каждых фиксированных i и k величина ik равна длине минимального пути среди всех путей из v1 в vi (v1 - начало пути), содержащего k дуг. Если таких путей нет, то ik = . Если произвольную вершину v считать путем из v в v нулевой длины, то величины ik можно ввести для k = 0, при этом 10 = 0, i0 = , i = 2,…,n.

Введем также квадратную матрицу С(D) = [cij], порядка n, называемую матрицей длин дуг:

l(vi, vj) – длина дуги (vi, vj).

Для вычисления ik используем формулы:

При i = 2, …,n, k  0 выполняется равенство:

ik+1 = min{jk + cji},

1 j  n

где jk – это величины всех вершин кроме i- ой, cji – это длины дуг из каждой j – ой вершины в i – ую, для которой вычисляется ik+1.

при i = 1, k  0 верно равенство:

1k+1 = min{0; min{jk + cj1}, если нет дуг отрицательной длины, то 1k+1 = 0.

1 j  n

Приведем алгоритм, позволяющий по таблице величин ik , i = 1, 2,…,n, k = 0, 1, …, n – 1, определить минимальный путь в нагруженном графе D из v1 в любую достижимую вершину, причем алгоритм выделяет путь с наименьшим числом дуг.

Алгоритм носит название алгоритма Форда – Беллмана.

Шаг1. Пусть составлена таблица величин ik , i = 1, 2,…,n, k = 0, 1, …, n – 1. Если i1n-1 = , то вершина vi1 не достижима из v1. Работа алгоритма заканчивается.

Шаг2. Пусть i1n-1< , тогда число i1n-1 выражает длину минимального пути из вершины v1 в вершину vi1. Определим минимальное число дуг k1  1, при котором выполняется равенство i1k1 = i1n-1. Получаем, что k1 - минимальное число дуг в минимальном пути.

Шаг3. Последовательно определим номера вершин в этом пути i2, … , ik1+1:

i2k1-1 + ci2, i1 = i1k1;

i3k1-2 + ci3, i2 = i2k1-1;

………………………

ik1+10 + cik1+1 = ik11.

Пример:

Определить минимальный путь из v1 в v6 в нагруженном орграфе D, изображенном на рисунке:

Составим матрицу длин дуг графа и рядом таблицу величин ik, содержащую шесть столбцов k = 0, 1, …, 5, используя соотношения:

При i = 2, …,n, k  0 выполняется равенство

ik+1 = min{jk + cji},

1 j  n

при i = 1, k  0 верно равенство

1k+1 = min{0; min{jk + cj1},

1 j  n

V1

V2

V3

V4

V5

V6

i0

i1

i2

i3

i4

i5

V1

5

5

2

12

0

0

0

0

0

0

V2

2

7

5

5

5

V3

2

5

3

3

3

3

V4

2

5

4

4

4

4

V5

1

2

2

2

2

2

2

V6

12

12

9

7

7

Первый столбец значений ik : 10= 0 (начало пути), остальные - . Вся первая строка содержит нули, т.к. это начало пути и 0 – наименьшая длина из v1 в v1.

Второй столбец: i1 – это длины дуг , соединяющих v1 с другими вершинами и , начиная со второй вершины , заносим значения из первой строки матрицы длин дуг.

Третий столбец: 22 = min{0+, 5+2, 5+2, 2+, 12+}= 7;

32 = min {0+5, +, 5+, 2+1, 12+}=3;

42 = min{0+5, +, 5+, 2+2,12+}= 4;

52 = min{0+2, +,5+,5+,12+} = 2;

62 = min{0+12, +2,5+,5+,2+} = 12.

Четвертый столбец:

23 = min{0+, 3+2, 4+2, 2+, 12+}= 5;

33 = min {0+5, 7+, 4+, 2+1, 12+}=3;

43 = min{0+5, 7+, 3+, 2+2,12+}= 4;

53 = min{0+2, 7+,3+,4+,12+} = 2;

63 = min{0+12, 7+2,3+,4+,2+} = 9.

Пятый столбец:

24 = min{0+, 3+2, 4+2, 2+, 9+}= 5;

34 = min {0+5, 5+, 4+, 2+1, 9+}=3;

44 = min{0+5, 5+, 3+, 2+2,9+}= 4;

54 = min{0+2, 5+,3+,4+,9+} = 2;

64 = min{0+12, 5+2,3+,4+,2+} = 7.

Последний шестой столбец:

25 = min{0+, 3+2, 4+2, 2+, 7+}= 5;

35 = min {0+5, 5+, 4+, 2+1, 7+}=3;

45 = min{0+5, 5+, 3+, 2+2,7+}= 4;

55 = min{0+2, 5+,3+,4+,7+} = 2;

65 = min{0+12, 5+2,3+,4+,2+} = 7.

Итак, минимальный путь из v1 в v6 равен 7 и содержит 4 дуги, т.к. первый раз 7 появилось в столбце i4, т.е. для вершины v664 = 7.

Найдем последовательность вершин, входящих в этот путь:

64 = 7= 23 + с26 =5+2;

23 = 5 = 32 + с32 = 3+2;

32 = 3 = 51 + с53 = 2+1;

51 = 10 + с15 = 0+2.

Получили путь v1v5v3v2v6 .