Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тезисы по философии-2.1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.11 Mб
Скачать

3.3. Алгоритмы поиска k кратчайших путей

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

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

Алгоритмы Дейкстры, Флойда и Данцига состоят в основном из операций сложения и сравнения, которые выполняются над числами. Алгоритм двойного поиска также использует операции сложения и сравнения, но не над числами, а над наборами из k чисел, представляющих длины соответствующих путей.

Введем множество Rk векторов (d1, d2, ..., dk), удовлетворяющих условию (d1<d2<…<dk). Пусть A=(a1, a2,..., ak) и B=(b1, b2, ..., bk) – два вектора из множества Rk.

Обобщенная операция сравнения  для векторов А и В, обозначаемая знаком “+”, определяется следующим образом:

A+B = mink { ai, bi :  i= 1, k },

где mink {X} - вектор из k различных наименьших элементов множества Х.

Обобщенная операция сложения  для векторов А и В, обозначаемая знаком “×”, определяется следующим образом:

A×B = mink { ai+ bi :  i= 1, k }.

Пример.    Пусть во множестве R4 даны векторы:

А=(1,3,4,8),  В=(3,5,7,16).

Результатом обобщённой операции сравнения этих векторов является вектор

А+В = min4 {1,3,4,8,3,5,7,16} = (1,3,4,5),

а результатом обобщённой операции сложения – вектор:

А×В = min4 {1+3,1+5,1+7,1+16,3+3,3+5,3+7,3+16,4+3, ...,8+16}= (4,6,7,8).

A+B Rk  и  A×B Rk, т.к. их компоненты тоже можно упорядочить по возрастанию.

Заметим, что обобщенная операция сравнения требует выполнения не более чем k обычных операций сравнения,  а обобщенная операция сложения требует выполнения не более чем k(k-1) обычных операций сложения и не более чем k(k-1) обычных операций сравнения.

Определим на множестве Rk  вектор , компоненты которого задают длины k кратчайших дуг из i в j. Если две дуги из i в j имеют одинаковые длины, то соответствующее число определяет лишь один из компонентов вектора . Если среди рассматриваемых дуг нельзя найти k дуг, имеющих различные длины, то неопределенные компоненты вектора  условно полагаются равными

Пример. Вершина i соединена с вершиной j тремя дугами, длины которых равны соответственно 7, 15, 7, тогда  для  k=4   = (7,15,,).

При i=j будем считать, что имеется некоторая дуга нулевой длины, являющаяся петлей в вершине i. Обозначим D0 матрицу, элемент (i,j) которой совпадает с вектором . Определим на множестве Rk  вектор , компоненты которого задают длины k кратчайших дуг из i в j, использующих в качестве промежуточных вершины с номерами 1,2,...,m. Dm – матрица, элемент (i,j) которой есть вектор . Обозначим через Rk  вектор, компоненты которого совпадают с длинами k кратчайших путей из i в j. D*– матрица, элемент (i,j) которой есть вектор . Пусть матрица L образована из матрицы D0 путем замены всех компонентов каждого вектора , для которого i≤j, “величиной” , а матрица U образована из матрицы D0 путем замены всех компонентов каждого вектора , для которого i≥j, “величиной” . Матрицы L  и U называются соответственно верхней треугольной и нижней треугольной  подматрицами матрицы D0.

Пример.  Пусть   , а   k=2

Тогда матрицы L  и U имеют вид:

       

Если мы хотим определить длины k кратчайших путей, ведущих, к примеру, из вершины 1 во все остальные, то нам необходимо определить только первую строку  матрицы D*. Эта строка состоит из N векторов, принадлежащих Rk. Следовательно, необходимо определить Nk величин и Nk путей соответствующих длин. Алгоритм двойного поиска позволяет эффективно находить указанные Nk путей при отсутствии в исходном графе контуров отрицательной длины. Работа алгоритма начинается с формирования некоторой строки , покомпонентно оценивающей сверху оптимальную строку . Т.е. каждый компонент вектора  не меньше соответствующего компонента вектора . При этом в начальной точке должно быть   .  В частности, все компоненты оценочной строки, за исключением , могли бы быть приняты равными . Затем в алгоритме вычисляются новые меньшие оценки для каждого вектора  . Это осуществляется путем многократной корректировки исходного оценочного вектора   и состоит в переходе к новому вектору , получаемому в результате выполнения обобщенной операции сравнения над “старым” вектором  и вектором  , корректировка проводится для всех . В результате получается новая оценка  - вектор . Так может быть получена вся новая оценочная строка . Работа алгоритма заканчивается при совпадении двух получаемых оценочных строк   и  для  р ≥ 1.

Процедура алгоритма двойного поиска

Шаг 1. Сформировать начальную строку , покомпонентно оценивающую сверху оптимальную строку , положив , а остальные компоненты равными .

Шаг 2. При условии, что для строки  определена оценочная строка , определить оценочные строки  и  следующим образом:

Обратный поиск:       = ×L+ .

Прямой поиск:      = ×U+ .

Выполнение шага 2 проводится последовательно для r=0,1,2,... до совпадения двух последовательных оценок   и  для некоторого t>1

Умножение и сложение в соотношениях шага 2 следует понимать в обобщенном смысле:

“ד - обобщенная операция сложения;

“+“ - обобщенная операция сравнения.

Пример. Найти с помощью алгоритма двойного поиска длины первых трёх кратчайших путей из вершины 1 во все вершины графа, изображённого на рис. 3.6.

Рис. 3.5.

Составим для данного графа матрицы D0, L и U:

;

;

.

Обратный поиск осуществляется в данном примере по формулам:

,

,

,

,

.

Прямой поиск выполняется по формулам:

,

,

,

,

.

Результаты проведения первых пяти поисков приведены в следующей таблице:

t

Поиск

0

(0,∞,∞)

(∞,∞,∞)

(∞,∞,∞)

(∞,∞,∞)

(∞,∞,∞)

1

Обратный

(0,∞,∞)

(∞,∞,∞)

(∞,∞,∞)

(∞,∞,∞)

(∞,∞,∞)

2

Прямой

(0,∞,∞)

(2,∞,∞)

(5,7,∞)

(7,9,∞)

(4,5,11)

3

Обратный

(0,6,12)

(2,8,9)

(5,7,∞)

(7,8,9)

(4,5,11)

4

Прямой

(0,6,12)

(2,8,9)

(5,7,11)

(7,8,9)

(4,5,10)

5

Обратный

(0,6,12)

(2,8,9)

(5,7,11)

(7,8,9)

(4,5,10)

Так как результаты 4-го (прямого) и 5-го (обратного) поиска совпадают, алгоритм двойного поиска завершает работу. Мы нашли длины первых трёх кратчайших путей из вершины 1 во все вершины графа. Восстановить составы путей можно, воспользовавшись идеей внешнего способа для алгоритма Флойда (см. разд. 3.2.).

Обоснование алгоритма двойного поиска

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

Предположим, что первая оценка длины какого-то кратчайшего пути, оказавшаяся меньше ее действительного значения, относится к  m-му кратчайшему пути из вершины 1 в вершину j. Истинное значение длины указанного пути могло бы быть получено как сумма оценки длины какого-либо кратчайшего пути из вершины 1 в некоторую вершину i, полученной ранее, и длины дуги из i в j. Отсюда следует, что оценка длины упомянутого пути из 1 в i должна быть меньше истинного ее значения. Но это противоречит тому, что первая, меньшая действительного значения оценка была получена лишь для m-го кратчайшего пути из 1 в j.

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

Лемма 1. Если вершина i является предпоследней вершиной m-го кратчайшего пути Р, ведущего из вершины 1 в вершину j, то часть этого пути P/,  заключенная между вершинами 1 и i, является некоторым l-м кратчайшим путем из вершины 1 в вершину i, где  l≤ m.

Доказательство.  Если бы  путь P/  не являлся  одним  из l-ых кратчайших путей, где l≤ m, то нашлось бы m кратчайших путей из 1 в i, длины которых были бы меньше длины пути P/. Каждый из них мог бы быть продлен до вершины j путем добавления соответствующей дуги. Это привело бы к построению m кратчайших путей, длины которых меньше длины пути Р.

Лемма 2. Если в процессе выполнения алгоритма определены длины m кратчайших путей из вершины 1 в каждую другую вершину, то длина (m+1)-го кратчайшего пути, начинающегося и заканчивающегося в вершине 1, будет определена в ходе следующей итерации двойного поиска.

Доказательство. Рассмотрим любой (m+1)-й кратчайший путь Р из вершины 1 в ту же вершину 1. Пусть i – предпоследняя вершина пути Р. В силу леммы 1 часть этого пути P/ между вершиной 1 и вершиной i есть некоторый l-й кратчайший путь из 1 в i, где l≤ m+1. При этом путь P/ не может быть (m+1)-м, иначе наряду с Р нашлось бы еще m путей из 1 в 1, проходящих через i и имеющих меньшую, чем у Р, длину. Но это противоречит тому, что есть еще “путь”, не содержащий дуг, для которого . То есть P/ – один из первых m кратчайших путей из 1 в i, кроме этого, известны длины k кратчайших дуг из i в j, а значит, длина пути Р будет определена в алгоритме на следующей итерации.

Предположим, что перед началом r-й итерации определены длины m кратчайших путей из 1 в каждую из остальных вершин при некотором m≥ 0.  Пусть j – любая вершина, для которой величина   еще не была определена. Рассмотрим соответствующий путь. Пусть i – предпоследняя вершина этого пути. Если  уже была определена на предыдущих итерациях, то на новой итерации будет определена  и , поскольку этот путь состоит из какого-то l-го кратчайшего пути из 1 в i, где l≤ m+1,  и из дуги (i,j). Если же длина (m+1)-го кратчайшего пути из 1 в i не была определена на предыдущих итерациях, то нельзя утверждать что на новой итерации будет получено . Предположим, что действительно в новой итерации не удастся получить , тогда в силу леммы 1 (m+1)-й кратчайший путь из 1 в j должен включать (m+1)-й кратчайший путь из 1 в i  и дугу (i,j). Повторим проведенное рассуждение, заменив вершину j вершиной i. Либо  будет  найдена  в новой итерации,  либо повторим рассуждение для предпоследней вершины в пути из 1 в i. И т.д. до вершины 1, если понадобится. А в этом, последнем, случае, по лемме 2, на новой итерации будет получена величина . Мы показали сходимость алгоритма двойного поиска за конечное число шагов.

Из приведенного доказательства вытекает важное следствие. Пусть исходный граф не содержит контуров отрицательной длины, достижимых из вершины 1. Тогда после r≥N итераций первые компоненты всех векторов оценочной строки  в дальнейшем будут неизменными. После r≥2N итераций первые два компонента всех векторов оценочной строки  в дальнейшем будут неизменными. И т.д.   Таким образом, мы можем выявить наличие контура отрицательной длины, достижимого из вершины 1, по уменьшению любой из первых s компонентов в векторах оценочной строки   после r  итераций алгоритма, где r≥s при любом  s=1,2,...,N.

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

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

Определим для вектора dii  свертку  как вектор из Rk, компоненты которого определяют длины k кратчайших контуров, содержащих вершину i: = dii × dii × ...  × dii Rk.

Процедура обобщенного алгоритма Флойда

(отличия от базового алгоритма)

Компоненты матрицы Dm вычисляются посредством следующей системы соотношений:

Процедура обобщенного алгоритма Данцига

(отличия от базового алгоритма)

Компоненты матрицы Dm вычисляются посредством следующей системы соотношений:

.

Так же, как и для исходных алгоритмов, оптимальность обобщенного алгоритма Флойда и обобщенного алгоритма Данцига может быть доказана методом индукции.