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



1) Найти минимальный путь в нагруженном орграфе из вершины  в вершину  по алгоритму Форда–Беллмана.

Рассмотрим сначала общую задачу – нахождения минимального пути из вершины vнач в vкон.

Пусть D = (V,X) – нагруженный орграф, V = {v1,…,vn}, n > 1. Введем величины , где i = 1,…,n, k = 0,1,2,…,n – 1.

Для каждого фиксированного i и k величина  равна длине минимального пути среди путей из vнач в vi, содержащих не более k дуг. Если путей нет, то .

Положим также .

Составляем матрицу длин дуг C(D) = [cij] порядка n:

                                

 

& Утверждение 8

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

                                     .                                        

 

Алгоритм ФордаБеллмана

 записываем в виде матрицы, i – строка, k – столбец.

1. Составляем таблицу , i = 1,…,n, k = 0,…,n – 1. Если , то пути из vнач в vкон нет. Конец алгоритма.

2. Если  то это число выражает длину любого минимального пути из vнач в vкон. Найдем минимальное k1  1, при котором . По определению  получим, что k1 – минимальное число дуг в пути среди всех минимальных путей из vначв vкон.

3. Затем определяем номера i2,…,  такие, что

,

,

,

т.е. восстанавливаем по составленной таблице и матрице стоимости искомый минимальный путь из vнач в vкон.

Заметим, что алгоритм ФордаБеллмана позволяет найти минимальные пути из заданной вершины во все остальные.

 

Пример

v Найдем минимальный путь из вершины v2 в v6 в нагруженном орграфе D (рис.2.84). n = 7, следовательно, матрица длин дуг графа D будет иметь размерность 7×7.

 

Рис. 2.84. Пример нагруженного орграфа для алгоритма ФордаБеллмана

 

Матрица длин дуг для данного графа:

 

                       .

 

Согласно алгоритму, составляем таблицу стоимости минимальных путей из вершины v2 в вершину vi не более чем за k шагов, k = 0,…n – 1 (n = 7, следовательно, k = 0,…6).

Как было определено выше, , и  для всех остальных вершин vi v2, т.е. первый столбец таблицы состоит из элементов, равных , кроме элемента .

Второй столбец таблицы повторяет вторую строку матрицы стоимости, поскольку представляет собой стоимость возможных путей из вершины v2 за один шаг. Далее по формуле утверждения 8 находим по столбцам все оставшиеся элементы таблицы. Например, чтобы найти элемент , складываем элементы столбца  и первого столбца матрицы стоимости и выбираем минимальное из получившихся чисел:

.

В конечном итоге получаем следующую таблицу:

 

 

Теперь необходимо по построенной таблице и по матрице C(D) восстановить минимальный путь из вершины v2 в v6, который будет строиться с конца, т.е., начиная с вершины v6. Для этого выбираем минимальное из чисел, стоящих в строке, соответствующей v6 в таблице. Это число 21 – длина минимального искомого пути. В первый раз такая длина была получена при количестве шагов, равном 4.

В вершину v6 можно попасть за один шаг из вершин v1 и v7 (длины соответствующих дуг 8 и 5, соответственно, – данные из матрицы C(D)). Выбираем минимальную по длине из этих дуг. Далее, в вершину v7 можно попасть из v4 и v5 (длины соответствующих дуг 7 и 3, соответственно). Продолжая аналогичным образом, найдем искомый путь за 4 шага минимальной длины из вершины v2 в v6:

v2 v3 v5 v7 v6.

 

2) Найти все минимальные пути из вершины  нагруженного орграфа по алгоритму Дейкстры.

Алгоритм Дейкстры в отличие от алгоритма ФордаБеллмана не допускает ребра с отрицательным весом и также решает задачу о кратчайших путях из одной вершины vнач во все оставшиеся для нагруженного орграфа D = (V,X), V = {v1,…,vn}, n > 1. Пусть в общем случае необходимо определить минимальный путь из vнач в vz.

 

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

1. Каждой вершине из множества V в ходе реализации алгоритма присваивается число d(vi), равное длине кратчайшего пути из вершины vнач в вершину vi и включающем только пройденные вершины. Полагается d(vнач) = 0 и d(vi) = ∞ для всех остальных вершин графа. Проходится вершина vнач и полагается vj = vнач, где vj – последняя пройденная вершина.

2. Для каждой непройденной вершины vi пересчитывается величина d(vi) по формуле:

d (vi) = min{d(vi); d(vj) + }.

3. Если d(vi) = ∞ для всех непройденных вершин, то алгоритм заканчивается, так как отсутствуют пути из вершины vнач в непройденные вершины. Иначе обозначается пройденной та вершина, для которой величина d (vi) является минимальной. Обозначается и дуга, инцидентная этой вершине, в соответствии с формулой шага 2, и полагается vj = vi.

4. Если vj = vz, кратчайший путь из vнач в vz найден. Иначе переходим к шагу 2.

 

Пример

v Найдем все минимальные пути из вершины v2 в нагруженном орграфе D (рис.2.85).

 

Рис. 2.85. Пример нагруженного орграфа для алгоритма Дейкстры

В графе 7 вершин, следовательно, матрица длин дуг будет подобна предыдущему случаю:

 

.

 

Согласно алгоритму зададим начальные условия: d(v2) = 0, d(vi) = ∞. Проходим вершину v2, vj = v2. Находим ближайшую вершину к пройденной, используя формулу:

d (vi) = min { d (vi); d (vj) + l(vj, vi)}:

d(v1) = min{d(v1); d(v2) + l(v2, v1)} = min{∞; 0 + 1} = 1;

d(v3) = min{d(v3); d(v2) + l(v2, v3)} = min{∞; 0 + 12} = 12;

d(v4) = min{d(v4); d(v2) + l(v2, v4)} = min{∞; 0 + ∞} = ∞;

d(v5) = min{d(v5); d(v2) + l(v2, v5)} = min{∞; 0 + ∞} = ∞;

d(v6) = min{d(v6); d(v2) + l(v2, v6)} = min{∞; 0 + ∞} = ∞;

d (v7) = min { d (v7); d(v2) + l(v2, v7)} = min{∞; 0 + ∞} = ∞.

Минимальную длину имеет путь от вершины v2 до вершины v1 d(v1) = 1. Включаем вершину v1 в текущее ориентированное дерево, а так же дугу, инцидентную этой вершине. Согласно выражению это дуга (v2,v1). Далее повторяем процедуру, исключая вершину v1, теперь vj = v1.

d(v3) = min{d(v3); d(v1) + l(v1, v3)} = min{12; 1 + 12} = 12;

d(v4) = min{d(v4); d(v1) + l(v1, v4)} = min{∞; 1 + ∞} = ∞;

d(v5) = min{d(v5); d(v1) + l(v1, v5)} = min{∞; 1 + 11} = 12;

d(v6) = min{d(v6); d(v1) + l(v1, v6)} = min{∞; 1 + 8} = 9;

d (v7) = min { d (v7); d(v1) + l(v1, v7)} = min{∞; 1 + ∞} = ∞.

Минимальную длину имеет путь от вершины v1 до вершины v6 d(v6) = 9. Включаем вершину v6 в текущее ориентированное дерево, а так же дугу (v1,v6), инцидентную этой вершине. Далее повторяем процедуру, исключая вершину v6, теперь vj = v6.

d(v3) = min{d(v3); d(v6) + l(v6, v3)} = min{12; 9 + ∞} = 12;

d(v4) = min{d(v4); d(v6) + l(v6, v4)} = min{∞; 9 + ∞} = ∞;

d(v5) = min{d(v5); d(v6) + l(v6, v5)} = min{12; 9 + 2} = 11;

d (v7) = min { d (v7); d(v6) + l(v6, v7)} = min{∞; 9 + ∞} = ∞.

Подобным образом получаем, что vj = v5, d(v5) = 11.

d(v3) = min{d(v3); d(v5) + l(v5, v3)} = min{12; 11 + 2} = 12;

d(v4) = min{d(v4); d(v5) + l(v5, v4)} = min{∞; 11 + ∞} = ∞;

d (v7) = min { d (v7); d(v5) + l(v5, v7)} = min{∞; 11 + 3} = 14.

Теперь vj = v3, d(v3) = 12.

d(v4) = min{d(v4); d(v3) + l(v3, v4)} = min{∞; 12 + 6} = 18;

d (v7) = min { d (v7); d(v3) + l(v3, v7)} = min{14; 12 + 3} = 14.

Далее vj = v7, d(v7) = 14.

d(v4) = min{d(v4); d(v7) + l(v7, v4)} = min{18; 14 + ∞} = 18.

И последнее vj = v4, d(v4) = 18.

Мы получили ориентированное дерево кратчайших путей начинающихся в вершине v2 для исходного графа (рис.2.86)

d(v1) = 1, путь v2v1;

d(v2) = 0, путь v2;

d(v3) = 12, путь v2v3;

d(v4) = 18, путь v2v3v4;

d(v5) = 11, путь v2v1v6v5;

d(v6) = 9, путь v2v1v6;

d (v7) = 14, путь v2v1v6v5v7.

 

 

Рис. 2.86. Ориентированное дерево кратчайших путей из вершины v2

 

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

Рассмотрим другой вариант представления и реализации алгоритма Дейкстры.

Пусть l(v i) пометка вершины v i; - начальная (базовая) вершина.

1. Положим l(p) = 0. Далее будем считать эту пометку постоянной. Для всех остальных вершин пометка l(v i) , считаем эти пометки временными.

2. Обновление пометок. Для всех вершин из образа вершины p  (вершин, в которые можно попасть непосредственно из p), не имеющих постоянной пометки, , где - вес дуги из p в v i.

3. Найдем  с минимальной временной пометкой, обозначим ее как , пометка  становится постоянной (при этом  есть длина кратчайшего пути из v в ).

4. Если вершина p совпадает с конечной вершиной (если требуется найти путь из v в w) или пометки всех вершин постоянные, то работа алгоритма завершена. Иначе возврат к шагу 2.

 

Пример

v Пусть дан нагруженный орграф с матрицей длин дуг С(D). Необходимо найти минимальный путь из v1 в v9, используя алгоритм Дейкстры.

 

 

1. Метка вершины v1 постоянна, равна 0.

2. Из вершины v1 можно попасть в вершины v3 (за 1) и v6 (за 7), т. е. теперь временные метки вершин v3 и v6 становятся равными 1 и 7 соответственно:

 

v1 v2 v3 v4 v5 v6 v7 v8 v9
0 ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥
õ ¥ 1 ¥ ¥ 7 ¥ ¥ ¥

 

3. Минимальная из временных пометок – 1, поэтому v3 принимает статус начальной и ее метка становится постоянной. Снова меняем метки оставшихся вершин. Из v3 можно попасть в v1 (нам туда не надо) и v6 (за 4), тогда метка v6 будет равна .

 

v1 v2 v3 v4 v5 v6 v7 v8 v9
0 ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥
õ ¥ 1 ¥ ¥ 7 ¥ ¥ ¥
õ ¥ õ ¥ ¥ 5 ¥ ¥ ¥

 

4. Поскольку в последней строке одна временная метка , то она автоматически становится постоянной. Продолжаем процесс:

 

  v1 v2 v3 v4 v5 v6 v7 v8 v9
1 шаг® 0 ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥
2 шаг® õ ¥ 1 ¥ ¥ 7 ¥ ¥ ¥
3 шаг® õ ¥ õ ¥ ¥ 5 ¥ ¥ ¥
4 шаг® õ 7 õ ¥ ¥ õ 17 ¥ ¥
5 шаг® õ õ õ ¥ 10 õ 17 12 ¥
6 шаг® õ õ õ 18 õ õ 17 12 ¥
7 шаг® õ õ õ 18 õ õ 17 õ 27
8 шаг® õ õ õ 18 õ õ õ õ 27
9 шаг® õ õ õ õ õ õ õ õ 27

 

Таким образом, путь из v1 в v9 имеет вес 27. Восстановим этот путь, начиная с конца. По столбцу v9 поднимаемся до строки, в которой получено конечное значение (7 шаг). В тот момент времени роль вершины с постоянной меткой играла v8. В столбце v8 число 12 появляется на 5 шаге, чему соответствует v2. Продолжая, доберемся до v1. Восстановленный путь:

v1 ® v3 ® v6 ® v2 ® v8 ® v9 (общий вес = 1 + 4 + 2 + 5 + 15 = 27).

2.7.7. Метод ветвей и границ

Метод ветвей и границ(англ. branch and bound) – общий алгоритмический метод для нахождения оптимальных решений различных задач оптимизации. Метод является вариацией полного перебора с отсевом подмножеств допустимых решений, заведомо не содержащих оптимальных решений.

Общая идея метода может быть описана на примере поиска минимума функции f(x) на множестве допустимых значений переменной x. Для метода ветвей и границ необходимы две процедуры: ветвление и нахождение оценок (границ).

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

Процедура нахождения оценок заключается в поиске верхних и нижних границ для решения задачи на подобласти допустимых значений переменной x.

В основе метода ветвей и границ лежит следующая идея: если нижняя граница значений функции на подмножестве А дерева поиска больше, чем верхняя граница на какой-либо ранее просмотренного подмножества B, то А может быть исключена из дальнейшего рассмотрения (правило отсева). Обычно минимальную из полученных верхних оценок записывают в глобальную переменную m; любая вершина дерева поиска, нижняя граница которой больше значения m, может быть исключена из дальнейшего рассмотрения.

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

 

Задача коммивояжера

Одна из самых известных и важных задач теории графов, представляющая собой целый класс задач оптимизации – задача коммивояжера (англ. «Travelling salesman problem», TSP). Также встречается под названием «задача о бродячем торговце». Суть задачи сводится к поиску пути наименьшей стоимости, проходящего через все вершины графа по одному разу, с возвратом в конце в исходную вершину. Решим задачу методом ветвей и границ.

Введем следующие обозначения: пусть D = (V, X) – полный орграф и f: X ® R – весовая функция, V = {v1,v2,…,vn} – множество вершин, X – множество дуг, C = {cij}, i, j = 1,2…n – матрица длин дуг данного орграфа, т. е. с ij = f(v i,vj), причем для любого i справедливо cii = ¥. Требуется найти простой остовной контур (или контур коммивояжера) минимального веса.

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

Очевидно, что вычитая любую константу из всех элементов любой строки или столбца матрицы C, минимальный путь останется минимальным.

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

Привести матрицу по строкам означает, что все строки приводятся. Аналогичный смысл имеет фраза «привести матрицу по столбцам». Приведение матрицы означает сначала приведение этой матрицы по строкам, а затем по столбцам.

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

Весом элемента матрицы называют сумму констант приведения матрицы. Следовательно, слова «самый тяжелый нуль в матрице» означают, что в матрице подсчитан вес каждого нулевого элемента, и зафиксирован нуль с максимальным весом.

 

Пример

v Пусть дан нагруженный орграф с матрицей длин дуг С(D).

.

Найдем константу приведения в каждой строке и выпишем ее в отдельный столбец min r.

 

  v1 v2 v3 v4 min r
v1 ¥ 5 11 9 5
v2 10 ¥ 8 7 7
v3 7 14 ¥ 8 7
v4 12 6 15 ¥ 6

 

Из каждого элемента в строке вычитаем соответствующее значение константы приведения (min r).

  v1 v2 v3 v4 min r
v1 ¥ 0 6 4 5
v2 3 ¥ 1 0 7
v3 0 7 ¥ 1 7
v4 6 0 9 ¥ 6

 

В итоге в каждой строке будет хотя бы одно нулевое значение.

Далее повторяем процедуру для каждого столбца и выписываем константы приведения в отдельную строку min c.

 

  v1 v2 v3 v4 min r
v1 ¥ 0 6 4 5
v2 3 ¥ 1 0 7
v3 0 7 ¥ 1 7
v4 6 0 9 ¥ 6
min c 0 0 1 0  

 

Вычитаем из каждого элемента матрицы соответствующее ему min c. В итоге и в каждом столбце будет хотя бы одно нулевое значение.

 

  v1 v2 v3 v4 min r
v1 ¥ 0 5 4 5
v2 3 ¥ 0 0 7
v3 0 7 ¥ 1 7
v4 6 0 8 ¥ 6
min c 0 0 1 0  

 

Обозначим за Г множество всех обходов коммивояжера (т. е. всех простых ориентированных остовных контуров). Поскольку граф – полный, это множество заведомо не пусто. Сопоставим ему число j(Г), которое будет играть роль значения на этом множестве оценочной функции: это число равно сумме констант приведения данной матрицы длин дуг графа и является оценкой снизу для стоимости минимального пути коммивояжера. Начальную матрицу длин дуг данного графа обозначим через С1.

Подсчитаем j(Г) = 5 + 7 + 7 + 6 + 1 = 26. Таким образом, нижняя оценка искомого пути найдена: . Для получения верхней оценки выберем один из существующих в графе гамильтоновых контуров и его стоимость возьмем за максимально возможную. Построим этот контур, пользуясь принципом «ближайшего соседа» (начинаем с произвольной вершины, например, с v3, ищем дугу минимального веса из нее, это дуга в вершину v1, и т. д., исключая переходы в уже пройденные вершины, только на последнем, четвертом шаге возвращаемся в v3):

v3v1v2v4v3, .

Окончательно определенные границы для оптимального пути: .

Для каждого нулевого значения получившейся матрицы находим вес: сумму заново посчитанных констант приведения по строке и столбцу, в которых размещено данное нулевое значение. Само оно при этом не учитывается. Полученный вес записываем рядом с нулем, в скобках.

 

  v1 v2 v3 v4
v1 ¥ 0 (4) 5 4
v2 3 ¥ 0 (5) 0 (1)
v3 0 (4) 7 ¥ 1
v4 6 0 (6) 8 ¥

 

Далее выбираем нулевое значение с наибольшим весом. Это значение 6 в ячейке v4v2. Разобьем множество Г на две части: множество  (все контуры, проходящие через дугу v4v2) и  (все контуры, не проходящие через дугу v4v2). Такое ветвление определяет необходимость выбора одного из этих вариантов.

Множеству  соответствует матрица С1,1, полученная вычеркиванием соответствующих строки (v4) и столбца (v2). У оставшихся строк и столбцов сохраним их исходные номера. Разумеется, вместе с вычеркиванием строки и столбца, в матрице надо заменить на ¥ числа в определенных ячейках так, чтобы исключить возврат в уже пройденные вершины, т. е. чтобы не получалось коротких контуров длиной меньше n. В данном случае из v2 уже нельзя попасть в v4, поэтому в ячейке v2v4 ставим ¥. Найденные веса нулей удаляются.

 

  v1 v3 v4
v1 ¥ 5 4
v2 3 0 ¥
v3 0 ¥ 1

 

После приведения матрица С1,1 (приводим только строку v1 с константой приведения 4).

 

  v1 v3 v4
v1 ¥ 1 0
v2 3 0 ¥
v3 0 ¥ 1

 

Сумма констант приведения матрицы С1,1 здесь равна 4, поэтому j(Г{(4,2)}) = j{4,2} = 26 + 4 = 30.

Множеству , в свою очередь, соответствует другая матрица – С1,2, полученная заменой на ¥ элемент с4,2 в матрице С1:

 

  v1 v2 v3 v4
v1 ¥ 0 5 4
v2 3 ¥ 0 0
v3 0 7 ¥ 1
v4 6 ¥ 8 ¥

 

Сумма констант последнего приведения равна весу замененного нуля, т. е. 6, так что .

Теперь выберем между множествами  и  то, на котором минимальна функция j. Поэтому дальнейшей разработке подвергнется множество Г{(4,2)}.

Таким образом найдена первая дуга пути: v4v2, построены новые матрицы, к которым, очевидно, можно применить описанную выше процедуру. При каждом таком повторном применении будет фиксироваться очередная дуга графа, которая в конечном итоге войдет в искомый гамильтонов контур (контур коммивояжера), который будет иметь минимальный вес.

В матрице С1,1 вычислим веса нулевых ячеек:

 

  v1 v3 v4
v1 ¥ 1 0 (2)
v2 3 0 (4) ¥
v3 0 (4) ¥ 1

 

Выбираем нулевое значение с наибольшим весом. В данном случае это 4 и таких значений два, выбирается любое из них, пусть это будет ячейка v2v3. Теперь следует рассматривать множества  и . Ясно, что .

Вычеркнем строку v2 и столбец v3 в матрице С1,1 и избавимся от короткого цикла, заменив 1 в ячейке v3v4 на ¥. Получим матрицу С1,1,1, которая после приведения будет следующей:

 

  v1 v4
v1 ¥ 0
v3 0 ¥

 

При этом , следовательно, в дальнейшем разрабатываем . Таким образом найдена вторая дуга пути: v2v3.

Приведем матрицу С1,1,1 и подсчитаем веса нулевых ячеек.

 

  v1 v4
v1 ¥ 0 (¥)
v3 0 ( ¥ ) ¥

 

Выбираем одно из нулевых значений с весом ¥: v3v1. При этом , . Таким образом найдена третья дуга пути: v3v1. Строку v3 и столбец v1 вычеркиваем.

 

  v4
v1 0

 

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

Имеем следующий минимальный путь: v4v2v3v1v4, его стоимость: 6 + 8 + 7 + 9 = 30.

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

 

Эйлеровы циклы и цепи

Найти Эйлерову цепь в неориентированном псевдографе.

Исходя из утверждений 1 и 2 (подглава 2.2), чтобы найти Эйлерову цепь, нужно соединить две вершины с нечетными степенями фиктивным ребром. Тогда задача сводится к нахождению Эйлерова цикла по приведенному ниже алгоритму. Из найденного цикла удаляется фиктивное ребро, тем самым находится искомая Эйлерова цепь.

 


Дата добавления: 2021-02-10; просмотров: 719; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!