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

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

Задача поиска на графе кратчайшего пути между каждой парой вершин могла бы быть решена путем многократного применения алгоритма Дейкстры (или Форда) с последовательным выбором каждой вершины графа в качестве вершины s. Но это потребовало бы сравнительно больших вычислительных затрат. Существуют более эффективные способы.

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

Введем некоторые обозначения. Перенумеруем вершины исходного графа целыми числами от 1 до N. Обозначим  длину кратчайшего пути из вершины i в вершину j, который в качестве промежуточных может содержать только первые m вершин графа. Если между вершинами i и j не существует ни одного такого пути, то условно будем считать, что . Отсюда  – длина кратчайшей дуги, соединяющей i с j, если таких дуг в графе нет, то . Для любой вершины i положим . Очевидно,  – длина кратчайшего пути из i в j. Обозначим Dm матрицу размера N×N, элемент (i,j) которой есть . Если в исходном графе нам известны длины (веса) дуг, то мы можем сформировать матрицу D0, целью же нашей является матрица DN.

Процедура алгоритма Флойда .

Шаг 1. Перенумеровать вершины исходного графа. Определить матрицу D0, задав величину элемента (i,j) равной длине (весу) кратчайшей дуги из i в j. Если вершины не соединены, положить . Положить .

Шаг 2. Для целого m, последовательно принимающего значения 1,2,...,N, определить по величинам элементов матрицы Dm–1 величины элементов матрицы Dm, используя рекурсивное соотношение

.

При определении величины каждого элемента матрицы Dm фиксировать соответствующий кратчайший путь.

По окончании данной процедуры величина (i,j)-го элемента матрицы DN определяет длину кратчайшего пути, ведущего из вершины i в вершину j.

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

То, что алгоритм Флойда действительно находит кратчайшие пути, может быть индуктивно доказано на основе следующего факта: длина кратчайшего пути из вершины i в вершину j, допускающего использование в качестве промежуточных первых m вершин, должна быть не больше длины кратчайшего пути из i в j, допускающего использование в качестве промежуточных первых (m-1) вершин, и не больше длины кратчайшего пути из i в j, допускающего использование в качестве промежуточных первых (m-1) вершин и обязательно - вершины m.

Замечание. Для всех i и m , поэтому нет необходимости в вычислении диагональных элементов матриц D1, D2, ..., DN. Кроме того, для всех  имеют место соотношения  и , т.к. вершина m при отсутствии в графе контуров отрицательной длины не может выступать в качестве промежуточной в любых кратчайших путях, начинающихся или заканчивающихся в самой вершине m. Следовательно, при определении матрицы Dm нет необходимости в пересчете элементов m-й строки и m-го столбца матрицы Dm–1. Таким образом, пересчитывать приходится не N2, a (N–1)(N–2) элементов.

Пример. Построить матрицу кратчайших расстояний для графа, изображённого на рис. 3.3.

Рис. 3.3.

Вершины графа перенумерованы, длины дуг известны. Сформируем матрицу D0:

;

Выполняя шаг 2, алгоритма пять раз (по количеству вершин в графе), получим следующие матрицы:

;          ;

;        ;

.

Матрица D5 содержит длины кратчайших путей (расстояния) между каждой парой вершин графа, изображённого на рис. 3.3.

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

Пусть pij - номер предпоследней вершины кратчайшего пути, соединяющего вершину i с вершиной j. Если pij известно для каждой пары вершин i и j, то все промежуточные вершины кратчайшего пути могут быть определены. Предположим pij = k, тогда вторая от конца вершина на этом пути pik и т.д., пока не будет пройден в обратном порядке весь кратчайший путь. Существуют два способа определения pij - встроенный и внешний.

Встроенный способ. В алгоритме Флойда перед шагом 2 в качестве pij принять i (pij= i для  i,j ). Далее в процессе выполнения алгоритма при вычислении значения dij,  если окажется, что , положить pij равным pmj, в противном случае оставить pij неизменным.

Внешний способ. Если работа алгоритма Флойда закончена, и матрица DN известна, можно определить каждое pij, положив его равным любому k, для которого .

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

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

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

Шаг 1. Перенумеровать вершины исходного графа. Сформировать матрицу D0 размерности N×N, каждый (i,j)-ый элемент которой  есть длина кратчайшей дуги из i в j. В отсутствие такой дуги положить . .

Шаг 2. Через Dm={ } обозначается матрица размерности m×m, m=1,N, элементы которой определяются из элементов матриц Dm-1 и D0 следующим образом:

                                                                                          (*)

                                                                                        (**)

                                                                            (***)

                                                                                                                                           

Элементы     матрицы DN есть длины кратчайших путей из i в j.

Что касается восстановления кратчайших путей, длины которых определяются величинами  в матрице DN, то внешний способ, поскольку он использует только матрицы D0 и DN, одинаково применим как для алгоритма Флойда, так и для алгоритма Данцига. Реализация встроенного способа несколько отлична: при использовании соотношения (*) pmj совпадает с pij,  где i - индекс, для которого в соотношении (*) достигается минимум, но это в случае, если i≠j, при i=j  pmj равно m; при использовании соотношения (**) pim совпадает с индексом j, для которого в соотношении (**) достигается минимум; при использовании соотношения (***)  pij равно pmj, если из двух величин  и  меньшей оказывается первая, и pij  остается неизменным в противном случае.

Пример. Используя алгоритм Данцига, построить матрицу кратчайших расстояний для графа, изображённого на рис. 3.4.

Рис. 3.4.

Вершины графа перенумерованы, длины дуг известны. Сформируем матрицу D0:

Выполняя шаг 2 алгоритма восемь раз (по количеству вершин в графе), получим следующие матрицы:

;   ;   ;  

;       

Матрица D8 содержит длины кратчайших путей (расстояния) между каждой парой вершин графа, изображённого на рис. 3.4.