- •6.1. Продолжительность симплекс-алгоритма
- •6.2. Размер экземпляра задачи лп
- •6.3. Задача эквивалентной допустимости
- •6.4. Начальные сведения о методе эллипсоида
- •6.5. Описание метода эллипсоида на интуитивном уровне
- •7.1. Алгоритм Хачияна
- •7.2. Обоснование метода эллипсоида
- •8.1. Терминология теории графов
- •8.2. Задача потока минимальной стоимости
- •8.3. Метод остовного дерева
- •8.4. Условия оптимальности
- •8.5. Стержневое правило для изменения базиса
- •8.6. Поиск начального допустимого решения
- •8.7. Целочисленность оптимальных решений
- •9.1. Транспортная задача
- •9.2. Табличная форма
- •9.3. Задача назначений
- •9.4. Лп-ослабления
- •9.5. Задача о максимальном потоке
- •10.1. Теорема максимального потока – минимального разреза
- •10.2. Управление проектом
- •10.3. Задача кратчайшего пути
- •10.4. Уравнение Беллмана
- •11.1. Алгоритм Беллмана-Форда
- •11.2. Алгоритм Дейкстры
- •11.3. Преформулировка с неотрицательным
- •11.4. Задача минимального остовного дерева (мод)
- •11.5. Жадный алгоритм Прима для задачи мод
- •12.1. Задача максимального разреза
- •12.2. Задача полуопределенного программирования
- •12.3. Игра «Симметричное рандеву»
- •12.4. Методы внутренней точки для лп и поп
- •13.1. Основы метода
- •13.2. Задача о ранце
- •13.3. Метод Дакина
- •14.1. Виды алгоритмов
- •14.2. Точные методы
- •14.3. Полиномиальная формулировка зк
- •14.4. Решение с помощью метода ветвей и границ
- •14.5. Приближенный алгоритм для задачи коммивояжера
- •15.1. Эвристики задачи коммивояжера
- •15.2. Метод ближайшего соседа
- •15.3. Метод ближайшего соседа для зк
- •15.4. Имитация отжига
- •15.5. Генетические алгоритмы
11.1. Алгоритм Беллмана-Форда
Пусть
– длина кратчайшего пути отi
к
n,
причем, этот путь содержит не более t
дуг. Примем
для всехt,
и
для всех
.
Тогда уравнения
![]()
определяют
алгоритм Беллмана-Форда для решения
задачи кратчайшего пути. Этот алгоритм
относится к типу алгоритмов коррекции
меток. Если циклы отрицательной длины
отсутствуют, то
.
Добавление дополнительных дуг не может
уменьшить длину путей, так что
.
Алгоритм Беллмана-Форда работает за время O(mn), где n – число узлов и m – число дуг, поскольку выполняет не более чем n итераций, и на каждой итерации каждая дуга рассматривается только один раз.
Чтобы
найти кратчайшие пути, а не только их
длину
,
мы должны запоминать номер предыдущего
узлаs(i)
для узла i
(так называемый, наследник
i),
поскольку такой узел является первым
узлом на кратчайшем пути от i
к n.
Всякий раз, когда мы получаем
,
следует удалить старого наследникаi,
если такой имеется, и назначить нового
s(i)
так, чтобы выполнялось:
.
11.2. Алгоритм Дейкстры
Этот
алгоритм
был изобретён нидерландским ученым Э.
Дейкстрой в 1959 году. Он может быть
применен только тогда, когда все длины
дуг
неотрицательны. Алгоритм широко
используется в программировании и в
компьютерных технологиях, например,
его использует протокол OSPF для устранения
кольцевых маршрутов.
Идея
алгоритма заключается в отборе узлов
в порядке возрастания длин их кратчайших
путей, начиная с узла с наименьшей длиной
пути. Чтобы упростить изложенное,
предположим, что в графе присутствуют
все дуги, принимая
для некоторых пар узлов, если это
необходимо.
Лемма
11.1.
Предположим,
что
для всех i, j. Пусть
будет таким, что
.
Тогда
и
для
всех
.
Доказательство.
Путь от узла k
к узлу n
имеет последнюю дугу, скажем (i,
n),
длина которой
меньше
.
Для узлаℓ
мы также имеем
.
Таким образом,
для всех
.
Алгоритм Дейкстры состоит из следующих шагов.
Находим узел
такой, что
для всех
.
Принимаем
.Для каждого узла
устанавливаем
.Удаляем узел ℓ из графа и возвращаемся к шагу 1, применяя те же самые шаги к новому графу.
Примечание.
Время работы данного алгоритма –
,
гдеn
–
число узлов графа. Алгоритм производит
n
итераций, каждая включает операцию
сравнения и обновление данных о длинах
дуг для каждого оставшегося узла.В случае плотных графов с числом дуг
,
этот алгоритм работает быстрее алгоритма
Беллмана-Форда (который имеет
вычислительную сложность
.
Алгоритм Дейкстры является наилучшим
из возможных, поскольку любой алгоритм
решения задачи кратчайшего пути будет
нуждаться в
операциях только для изучения каждой
дуги, по меньшей мере, один раз.
Пример 11.1. Рассмотрим граф с четырьмя узлами (рис. 11.1).


Рис. 11.1. Граф задачи из примера
Итерация 1 дает
и
.Изменяем длину дуг:
![]()
Убираем узел ℓ = 3 из графа.
Итерация 2 дает ℓ = 2 и
.Изменяем длину дуги:
.
Убираем узел ℓ = 2.
Остается только узел 1, так что можем записать:
.
11.3. Преформулировка с неотрицательным
Если
(
)
является самой короткой длиной пути от
узла i
к узлу n,
то из уравнения Беллмана следует:
,
для
всех
.
Так
что, величины:
–
имеют смысл неотрицательных длин дуг,
и вдоль некоторого произвольного пути
посещаются узлы:
![]()
.
Таким
образом, кратчайшие пути для новых длин
дуг
являются такими же, как и для оригинальных
(возможно отрицательных) длинах дуг
.
Это свойство используется, когда нужно
найти кратчайшие расстояния между всеми
парами узлов. Если в графе имеются дуги
отрицательной длины, можно использоваль
алгоритм Беллмана-Форда, чтобы получить
для заданного корневого узла и затем
применить алгоритм Дейкстры для решенияn
– 1 оставшихся задач, полагая стоимости
дуг неотрицательными. Величины
,
отпределенные в терминах
,
при этом вычисляются точно.
Для
плотных графов при
общая сложность такого алгоритма:
.
Сравним
это с вычислительной сложностью алгоритма
Беллмана-Форда
,
используемого для решения задачи
нахождения кратчайшего расстояния
между всеми парами узлов.
