
- •Приложения теории графов: нахождение кратчайших путей и решение задач размещения в графах
- •Содержание
- •Лабораторная работа № 1
- •2.2. Алгоритм Дейкстры (случай неотрицательной матрицы весов)
- •2.3. Алгоритм Форда (случай общей матрицы весов)
- •2.4. Алгоритм Флойда (кратчайшие пути между всеми парами вершин)
- •2.5. Применение к сетевому планированию и управлению
- •3. Задание
- •4. Контрольные вопросы
- •2.2. Центр и радиус графа
- •2.3. Абсолютный центр графа
- •2.4. Кратные центры (р-центры) графа
- •2.5. Практическое применение задачи размещения центров
- •2.6. Медиана графа
- •2.7. Кратные медианы (р-медианы) графа
- •2.8. Приближенный алгоритм нахождения кратных медиан графа
- •2.9. Практическое применение задачи размещения медиан
- •3. Задание
- •4. Контрольные вопросы
- •Список литературы
- •Лабораторный практикум по дисциплине «Прикладная теория графов»
- •450000, Уфа-центр.Ул.К.Маркса,12
2.3. Алгоритм Форда (случай общей матрицы весов)
Алгоритм
Дейкстры применим лишь в том случае,
когда
для всехi
и j.
Однако если матрица С
является матрицей стоимостей, то дуги,
приносящие доход, должны иметь
отрицательные «стоимости». В этом случае
для нахождения кратчайших путей между
вершиной s
и всеми другими вершинами можно
воспользоваться описанной ниже
процедурой. Этот метод также является
итерационным и основан на пометках
вершин, причем в конце k-й
итерации пометки равны длинам тех
кратчайших путей (от s ко всем остальным
вершинам), которые содержат не более
k+1
дуг. В отличие от алгоритма Дейкстры
никакая из пометок во время этого
процесса не рассматривается как
окончательная. Описываемый метод был
первоначально предложен Фордом.
Описание алгоритма Форда:
Пусть
- пометка вершины
в конце (k+1)–й
итерации.
Шаг
1. Положить S=Г(s),
k=1,
,
для всех
и
для всех остальныхxi.
Шаг
2. Для каждой вершины
(
)
изменить ее пометку следующим образом:
,
где
(множество
содержит те вершины, для которых текущие
кратчайшие пути изs
состоят из k
дуг и для которых существуют дуги к
вершине xi.).
Для вершин
положим
.
Шаг 3.
1.
Если
и
для всехxi,
то получен оптимальный ответ и пометки
равны длинам кратчайших путей.
2.
Если
и
для некоторой вершиныxi,
то перейти к шагу 4.
3.
Если
и
для некоторой вершиныxi,
то в графе существует цикл отрицательного
веса и задача не имеет решения.
Шаг 4. Обновить множество S следующим образом:
.
Шаг
4. Положить
и перейти к шагу 2.
Также
можно привести общую матрицу весов к
неотрицательной, увеличив вес каждого
ребра на величину
и найти кратчайшие пути между вершинойs
и всеми другими вершинами с помощью
алгоритма Дейкстры.
2.4. Алгоритм Флойда (кратчайшие пути между всеми парами вершин)
Пусть
требуется найти кратчайшие пути между
всеми парами вершин графа. Очевидный
способ получить ответ на этот вопрос
заключается в n-
кратном применении алгоритма Дейкстры
или алгоритма Форда, причем каждый раз
в качестве начальной вершины s
берутся различные вершины. В случае
полного графа с неотрицательной матрицей
весов C
время, необходимое для вычислений,
пропорционально
,
а для произвольной матрицы весов оно
пропорционально
.
Опишем
совершенно иной подход к задаче нахождения
кратчайших путей между всеми парами
вершин. Этот метод применим как к
неотрицательным, так и к произвольным
матрицам весов и время, необходимое для
вычислений, пропорционально
.
Если этот метод применим к графам с
неотрицательной матрицей весов, то он
сэкономит почти 50 % времени по сравнению
сn-кратным
применением алгоритма Дейкстры. Метод
был предложен первоначально Флойдом.
Он базируется на использовании
последовательности из n
преобразований (итераций) начальной
матрицы весов С.
При этом на k-й
итерации матрица представляет длины
кратчайших путей между каждой парой
вершин с тем ограничением, что путь
между
и
(для любых
и
)
содержит в качестве промежуточных
только вершины из множества
.
Описание алгоритма Флойда:
Предположим,
что в начальной матрице весов
для всех
и
,
если в графе отсутствует дуга
.
Шаг
1. Присвоить
.
Шаг
2.
.
Шаг
3. Для всех
,
таких, что
,
и для всех
,
таких, что
,
введем операцию
.
(1.3)
Шаг 4.
1.
Если
,
то в графеG
существует цикл отрицательного веса,
содержащий вершину
,
и решения нет.
2.
Если все
и
,
то получено решение. Матрица
дает длины всех кратчайших путей.
3.
Если все
,
но
,
то вернуться к шагу 2.
Сами
кратчайшие пути можно найти по их длинам
с помощью рекурсивной процедуры, подобной
той, которая выше определялась соотношением
(1.2). С другой стороны, можно использовать
информацию о самих путях (наряду с
информацией о длинах путей). Этот
последний метод полезен в тех случаях,
когда требуется найти в графе цикл
отрицательного веса (если такой
существует). В этом методе в дополнение
к матрице весов C
хранится и обновляется вторая
-матрица
.
Элемент
указывает вершину, непосредственно
предшествующую вершине
в кратчайшем пути от
к
.
Матрице
присваиваются начальные значения
для всех
и
.
В соответствии с (1.3) на шаге 3 алгоритма
обновление матрицы происходит так:
.
В
конце алгоритма кратчайшие пути
получаются непосредственно из
заключительной матрицы
.
Таким образом, кратчайший путь между
двумя вершинами
и
дается следующей последовательностью
вершин:
,
где
,
,
и т.д. до
.
Здесь
следует отметить, что если всем
придать
начальные значения ∞ (а не 0), то конечное
значение величины
будет равно
весу цепи, проходящей через вершину
.
Исходя из структуры матрицы
,
полученной в процессе той итерации,
когда элемент
становится
отрицательным, можно найти цикл
отрицательного веса, соответствующий
этому элементу.