Алгоритм Дейкстры
Алгоритм Дейкстры— алгоритм на графах, изобретённый нидерландским ученым Э. Дейкстрой в 1959 году. Находит кратчайшее расстояние от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса. Алгоритм широко применяется в программировании и технологиях, например его использует протокол OSPF для устранения кольцевых маршрутов.
Вариант 1. Дана сеть автомобильных дорог, соединяющих города Московской области. Некоторые дороги односторонние. Найти кратчайшие пути от города Москва до каждого города области (если двигаться можно только по дорогам).
Вариант 2. Имеется некоторое количество авиарейсов между городами мира, для каждого известна стоимость. Стоимость перелёта из A в B может быть не равна стоимости перелёта из B в A. Найти маршрут минимальной стоимости (возможно, с пересадками) от Копенгагена до Барнаула.
Рассмотрим алгоритм. Каждой вершине из V сопоставим метку — минимальное известное расстояние от этой вершины до α. Алгоритм работает пошагово — на каждом шаге он «посещает» одну вершину и пытается уменьшать метки. Работа алгоритма завершается, когда все вершины посещены.
Инициализация. Метка самой вершины α полагается равной 0, метки остальных вершин — бесконечности. Это отражает то, что расстояния от α до других вершин пока неизвестны. Все вершины графа помечаются как не посещённые.
Шаг алгоритма. Если все вершины посещены, алгоритм завершается. В противном случае, из ещё не посещённых вершин выбирается вершина u, имеющая минимальную метку. Мы рассматриваем всевозможные маршруты, в которых u является предпоследним пунктом. Вершины, в которые ведут рёбра из u, назовем соседями этой вершины. Для каждого соседа вершины u, кроме отмеченных как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки u и длины ребра, соединяющего u с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину u как посещенную и повторим шаг алгоритма.
Рассмотрим выполнение алгоритма на примере графа, показанного на рисунке. Пусть требуется найти расстояния от 1-й вершины до всех остальных.
Кружками обозначены вершины, линиями — пути между ними (ребра графа). В кружках обозначены номера вершин, над ребрами обозначена их «цена» — длина пути. Рядом с каждой вершиной красным обозначена метка — длина кратчайшего пути в эту вершину из вершины 1.
Первый шаг. Рассмотрим шаг алгоритма Дейкстры для нашего примера. Минимальную метку имеет вершина 1. Её соседями являются вершины 2, 3 и 6.
Первый по очереди сосед вершины 1 — вершина 2, потому что длина пути до неё минимальна. Длина пути в неё через вершину 1 равна сумме кратчайшего расстояния до вершины 1, значению её метки, и длины ребра, идущего из 1-ой в 2-ую, то есть 0 + 7 = 7. Это меньше текущей метки вершины 2, бесконечности, поэтому новая метка 2-й вершины равна 7.
Аналогичную операцию проделываем с двумя другими соседями 1-й вершины — 3-й и 6-й.
Все соседи вершины 1 проверены. Текущее минимальное расстояние до вершины 1 считается окончательным и пересмотру не подлежит (то, что это действительно так, впервые доказал Э. Дейкстра). Вычеркнем её из графа, чтобы отметить, что эта вершина посещена.
Второй шаг. Шаг алгоритма повторяется. Снова находим «ближайшую» из непосещенных вершин. Это вершина 2 с меткой 7.
Снова пытаемся уменьшить метки соседей выбранной вершины, пытаясь пройти в них через 2-ю вершину. Соседями вершины 2 являются вершины 1, 3 и 4.
Первый (по порядку) сосед вершины 2 — вершина 1. Но она уже посещена, поэтому с 1-й вершиной ничего не делаем.
Следующий сосед вершины 2 — вершина 3, так как имеет минимальную метку из вершин, отмеченных как не посещённые. Если идти в неё через 2, то длина такого пути будет равна 17 (7 + 10 = 17). Но текущая метка третьей вершины равна 9<17, поэтому метка не меняется.
Ещё один сосед вершины 2 — вершина 4. Если идти в неё через 2-ю, то длина такого пути будет равна сумме кратчайшего расстояния до 2-ой вершины и расстояния между вершинами 2 и 4, то есть 22 (7 + 15 = 22). Поскольку 22< , устанавливаем метку вершины 4 равной 22.
Все соседи вершины 2 просмотрены, замораживаем расстояние до неё и помечаем её как посещенную.
Третий шаг. Повторяем шаг алгоритма, выбрав вершину 3. После её «обработки» получим такие результаты:
Дальнейшие шаги. Повторяем шаг алгоритма для оставшихся вершин. Это будут вершины 6, 4 и 5, соответственно порядку.
Завершение выполнения алгоритма. Алгоритм заканчивает работу, когда вычеркнуты все вершины. Результат его работы виден на последнем рисунке: кратчайший путь от вершины 1 до 2-й составляет 7, до 3-й — 9, до 4-й — 20, до 5-й — 20, до 6-й — 11.
Рассмотрим псевдокод алгоритма Дейкстры:
functionDijkstra(Graph, source):
for each vertex v in Graph: // Initializations
dist[v] := infinity ; // Unknown distance function from source to v
previous[v] := undefined ; // Previous node in optimal path from source
end for ;
dist[source] := 0 ; // Distance from source to source
Q := the set of all nodes in Graph ;
// All nodes in the graph are unoptimized - thus are in Q
While Q is not empty: // The main loop
u := vertex in Q with smallest dist[] ;
if dist[u] = infinity:
break ;// all remaining vertices are inaccessible from source
end if ;
remove u from Q ;
for each neighbor v of u: // where v has not yet been removed from Q.
alt := dist[u] + dist_between(u, v) ;
if alt < dist[v]: // Relax (u,v,a)
dist[v] := alt ;
previous[v] := u ;
end if ;
end for ;
end while ;
return dist[] ;
end Dijkstra.
- Общие сведения Сведения об эумк
- Методические рекомендации по изучению дисциплины
- Рабочая учебная программа Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»
- Пояснительная записка
- Содержание дисциплины
- 1. Название тем лекционных занятий, их содержание, объем в часах Наименование тем, их содержание
- 2. Перечень тем ипр
- Перечень тем контрольных работ
- 4. Литература
- 4.1 Основная
- 4.2 Дополнительная
- 5. Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
- 6. Учебно-методическая карта дисциплины содержание дисциплины
- Теоретический раздел Вступление
- Дискретная и вычислительная математика
- Часть 1. Вычислительная математика Математическое моделирование и вычислительный эксперимент
- 1 Решение систем линейных алгебраических уравнений
- 1.1 Точные методы
- 1.1.1 Метод Гаусса
- 1.1.2 Связь метода Гаусса с разложением матрицы на множители. Теорема об lu разложении
- Теорема об lu разложении
- 1.1.3 Метод Гаусса с выбором главного элемента
- 1.1.4 Метод Холецкого (метод квадратных корней)
- 1.2 Итерационные методы решений систем алгебраических уравнений
- 1.2.1 Метод Якоби (простых итераций)
- 1.2.2 Метод Зейделя
- 1.2.3 Матричная запись методов Якоби и Зейделя
- 1.2.4 Метод Ричардсона
- 1.2.5 Метод верхней релаксации (обобщённый метод Зейделя)
- 1.2.6 Сходимость итерационных методов
- 2 Плохо обусловленные системы линейных алгебраических уравнений
- 2.1 Метод регуляризации для решения плохо обусловленных систем
- 2.2 Метод вращения (Гивенса)
- 3 Решение нелинейных уравнений
- 3.1 Метод простых итераций
- 3.1.1 Условия сходимости метода
- 3.1.2 Оценка погрешности
- 3.2 Метод Ньютона
- 3.2.1 Сходимость метода
- 4 Решение проблемы собственных значений
- 4.1 Прямые методы
- 4.1.1 Метод Леверрье
- 4.1.2 Усовершенствованный метод Фадеева
- 4.1.3 Метод Данилевского
- 4.1.4 Метод итераций определения первого собственного числа матрицы
- 5 Задача приближения функции
- 5.1 Интерполяционный многочлен Лагранжа
- 5.1.1 Оценка погрешности интерполяционного многочлена
- 5.2 Интерполяционные полиномы Ньютона
- 5.2.1 Интерполяционный многочлен Ньютона для равноотстоящих узлов
- 5.2.2 Вторая интерполяционная формула Ньютона
- 5.3 Интерполирование сплайнами
- 5.3.1 Построение кубического сплайна
- 5.3.2 Сходимость процесса интерполирования кубическими сплайнами
- 5.4 Аппроксимация функций методом наименьших квадратов
- 6 Численные методы решения задачи Коши для обыкновенных дифференциальных уравнений и систем дифференциальных уравнений
- 6.1 Семейство одношаговых методов решения задачи Коши
- 6.1.1 Метод Эйлера (частный случай метода Рунге-Кутта)
- 6.1.2 Методы Рунге-Кутта
- 6.2 Многошаговые разностные методы решения задачи Коши для обыкновенных дифференциальных уравнений
- 6.2.1 Задача подбора числовых коэффициентов aк , bк
- 6.2.2 Устойчивость и сходимость многошаговых разностных методов
- 6.2.3 Примеры m-шаговых разностных методов Адамса для различных m
- 6.3 Численное интегрирование жестких систем обыкновенных дифференциальных уравнений
- 6.3.1 Понятие жесткой системы оду
- 6.3.2 Некоторые сведения о других методах решения жестких систем
- 6.3.2.1 Методы Гира
- 6.3.2.2 Метод Ракитского(матричной экспоненты) решения систем оду
- 6.4 Краевые задачи для обыкновенных дифференциальных уравнений
- 6.5 Решение линейной краевой задачи
- 6.6 Решение двухточечной краевой задачи для линейного уравнения второго порядка сведением к задаче Коши
- 6.7 Методы численного решения двухточечной краевой задачи для линейного уравнения второго порядка
- 6.7.1 Метод конечных разностей
- 6.7.2 Метод прогонки (одна из модификаций метода Гаусса)
- 7 Приближенное решение дифференциальных уравнений в частных производных
- 7.1 Метод сеток для решения смешанной задачи для уравнения параболического типа (уравнения теплопроводности)
- 7.2 Решение задачи Дирихле для уравнения Лапласа методом сеток
- 7.3 Решение смешанной задачи для уравнения гиперболического типа методом сеток
- Часть 2. Дискретная математика
- 1. Основные Элементы теории множеств
- 1.1 Элементы и множества
- 1.2 Задание множеств. Парадокс Рассела
- 1.3 Операции над множествами
- 1.4 Булеан множества
- 1.5 Представление множеств в эвм
- Разбиения и покрытия
- 2 Отношения и функции
- 2.1 Прямое произведение множеств
- Элементы комбинаторики
- Теория конфигураций и теория перечисления
- Размещения
- Сочетания
- 3.1 Перестановки и подстановки
- 4 Элементы математической логики
- 5 Конечные графы и сети Основные определения
- 5.1 Матрицы графов
- Матрица смежности Списки инцидентности
- 5.2 Достижимость и связность
- 5.3 Эйлеровы и гамильтоновы графы
- 5.4 Деревья и циклы
- 5.5 Алгоритмы поиска пути
- Двунаправленный поиск
- Поиск по первому наилучшему совпадению
- Алгоритм Дейкстры
- АлгоритмА*
- Остовное дерево
- Матрица Кирхгофа
- 5.6 Конечные автоматы
- 5.6 Элементы топологии
- 5.7 Метрическое пространство
- Указания по выбору варианта
- Контрольная работа № 2 Общие сведения
- Квадратурная формула Гаусса
- Указания по выбору варианта
- Индивидуальные практические работы Индивидуальная практическая работа № 1 Общие сведения
- Интерполяционный полином Лагранжа
- Аппроксимация функций с помощью кубического сплайна
- Приближение формулами Ньютона
- Аппроксимация функций методом наименьших квадратов
- Индивидуальная практическая работа № 2