МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
____________________________
Кафедра ____________________________
РЕФЕРАТ
на тему: «Алгоритм Дейкстры на примере карты дорог»
Выполнил(а): ____________________________
Группа: ____________________________
Проверил(а): ____________________________
2026
Содержание
- 3
- 5
- 7
- 9
- 11
1. Графы и дорожные сети
Дорожную сеть любого города удобно представлять в виде графа. Это математическая модель, состоящая из двух типов объектов: вершин и рёбер. Вершины соответствуют перекрёсткам, развязкам или населённым пунктам, а рёбра соединяют их, обозначая дороги. Подобный подход имеет прямое отношение к реальности. Навигационные сервисы (Яндекс Карты, Google Maps) используют именно графы для расчёта маршрутов, и это работает на практике.
Каждому ребру в графе присваивается вес. Вес может означать длину дороги в километрах, среднее время в пути или даже расход топлива. Например, если вершина A, это центр Москвы, а вершина B, аэропорт Шереметьево, то ребро между ними будет иметь вес, равный примерно 28 километрам по Ленинградскому шоссе. Без весов граф описывал бы лишь структуру связей, но не давал бы ответа на вопрос, какой маршрут выгоднее. Именно веса превращают простую схему в полноценную модель для вычислений.
После того как сеть представлена в виде взвешенного графа, возникает классическая задача: как найти путь между двумя вершинами с минимальным суммарным весом. Это и есть задача поиска кратчайшего пути. Суммарный вес складывается из весов всех рёбер, через которые проходит маршрут. Если нужно доехать из точки A в точку B, вариантов может быть несколько: через центр города, по объездной или по платной трассе. Требуется выбрать тот, где сумма весов окажется наименьшей. В терминах графа это звучит так: найти последовательность рёбер, соединяющую две заданные вершины, такую, что сумма их весов минимальна.
Задача поиска кратчайшего пути возникла задолго до появления компьютеров. Ещё в 1950-х годах её решали вручную для планирования транспортных потоков. Однако с ростом масштаба сетей ручной подсчёт стал невозможен, и потребовались формальные алгоритмы. Один из первых и самых известных алгоритмов для этой задачи предложил
нидерландский учёный Эдсгер Дейкстра в 1956 году. Его метод стал классическим для графов, в которых веса рёбер неотрицательны. Это важное ограничение: если вес ребра отрицателен, алгоритм Дейкстры может дать неверный результат. В реальных дорожных сетях отрицательные длины не встречаются, поэтому ограничение не мешает практическому применению.
Существуют и другие подходы к решению: алгоритм Беллмана-Форда, который допускает отрицательные веса, или алгоритм A* для эвристического поиска. Но именно алгоритм Дейкстры выделяется своей простотой и эффективностью для большинства практических случаев. Он гарантирует нахождение точного решения за приемлемое время. В следующих главах будет подробно разобрано, как именно он устроен, как его реализовать на языке программирования и какие у него есть ограничения. Пока же важно зафиксировать главное: граф с взвешенными рёбрами, это адекватная модель дорожной сети, а поиск кратчайшего пути, это строгая математическая задача, для которой существуют проверенные алгоритмы решения.
2. Принцип работы алгоритма Дейкстры
Эдсгер Дейкстра предложил свой алгоритм в 1959 году. Изначально задача формулировалась просто: найти кратчайший путь между двумя конкретными городами в Нидерландах. Однако предложенный метод решает более общую проблему. Он находит кратчайшие расстояния от одной исходной вершины до всех остальных вершин графа.
Суть подхода заключается в жадной стратегии. Алгоритм последовательно наращивает множество вершин с уже известным кратчайшим расстоянием. На каждом шаге из необработанных вершин выбирается та, текущее расстояние до которой минимально. Выбранная вершина помечается как обработанная, и для неё это расстояние фиксируется окончательно.
Рассмотрим механизм подробнее. В начале работы всем вершинам, кроме стартовой, присваивается бесконечное расстояние. Стартовая вершина получает нулевое значение. Далее алгоритм переходит к релаксации рёбер. Для текущей вершины проверяются все её соседи. Если путь через текущую вершину оказывается короче, чем уже записанное расстояние до соседа, то это расстояние обновляется.
Ключевой элемент, обеспечивающий эффективность, это очередь с приоритетом. Она хранит все вершины, до которых уже удалось добраться, но которые ещё не обработаны. Приоритетом служит текущее известное расстояние до вершины. Извлечение из такой очереди всегда даёт вершину с наименьшим расстоянием. Это позволяет избежать линейного поиска минимума на каждом шаге. Для графов с большим числом вершин, например, для дорожной сети крупного региона, такой поиск был бы слишком медленным.
Корректность алгоритма Дейкстры опирается на строгое математическое обоснование. Оно справедливо только при условии, что веса всех рёбер неотрицательны. В тот момент, когда вершина извлекается из очереди с приоритетом, её расстояние является
окончательным. Предположим обратное: существует более короткий путь до этой вершины. Тогда этот путь должен проходить через какую-то другую, ещё не обработанную вершину. Но расстояние до любой необработанной вершины не меньше, чем расстояние до извлечённой (очередь всегда выдаёт минимум). Прибавив к этому расстоянию неотрицательный вес ребра, мы получим значение, которое никак не может быть меньше уже найденного. Это противоречие доказывает невозможность существования более короткого пути.
Процесс завершается, когда очередь опустеет. К этому моменту каждая достижимая вершина будет обработана, и для неё будет найдено кратчайшее расстояние от стартовой точки. Именно эта особенность, гарантия нахождения точного решения, а не приближённого, делает алгоритм Дейкстры стандартом для навигационных систем и задач маршрутизации в сетях.
3. Моделирование дорожной карты и реализация
Переход от теории к практике упирается в вопрос: как превратить реальную дорожную сеть в структуру, с которой способен работать компьютер? Первый шаг, абстракция. Из карты выделяются ключевые точки: города, крупные перекрёстки, развязки. Каждая точка становится вершиной графа. Дороги между ними превращаются в рёбра, а вес ребра, это либо километраж, либо среднее время в пути. Так, для карты Нидерландов, о которой писал Дейкстра, вершинами служат города, а рёбрами, автобаны с указанием протяжённости.
Второй шаг, выбор способа хранения этого графа в памяти. Здесь есть два основных варианта. Матрица смежности, это таблица размером N×N, где N, число вершин. Ячейка [i][j] хранит вес ребра между вершинами i и j. Такой подход удобен для плотных графов, где рёбер много, но он тратит память впустую, если дорожная сеть разреженная. Список смежности, это массив, где для каждой вершины хранится перечень её соседей и весов соответствующих рёбер. Он экономит память и позволяет быстро перебирать соседей, что критично для алгоритма Дейкстры. В реальных навигационных системах, где графы содержат миллионы узлов, выбор очевиден: список смежности.
Теперь перейдём к реализации. Ниже приведён код на Python, использующий список смежности и модуль heapq для организации очереди с приоритетом. Библиотека heapq реализует двоичную кучу, которая позволяет за O(log N) извлекать вершину с минимальным расстоянием и добавлять новые кандидаты.
```python import heapq
def dijkstra(graph, start): distances = {vertex: float('inf') for vertex in graph} distances[start] = 0 priority_queue = [(0, start)] while priority_queue: current_dist, current_vertex = heapq.heappop(priority_queue) if current_dist >
distances[current_vertex]: continue for neighbor, weight in graph[current_vertex].items(): distance = current_dist + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances ```
Разберём, как это работает, на конкретном примере. Возьмём небольшой граф из пяти городов: A, B, C, D, E. Связи между ними заданы списком смежности: A соединён с B (вес 4) и C (вес 2); B, с C (вес 1), D (вес 5) и E (вес 3); C, с D (вес 8); D, с E (вес 2). Стартуем из вершины A. Изначально расстояние до A равно 0, до остальных, бесконечность.
Первый шаг: извлекаем A из очереди, обрабатываем её соседей. До B расстояние становится 4, до C, 2. Оба попадают в кучу. Теперь в приоритете C, так как 2 меньше 4. Извлекаем C: её сосед D получает расстояние 10 (2+8). Сравниваем с бесконечностью, обновляем. В очереди теперь B (4) и D (10). Следующая, B. Из неё идут пути к C (но 4+1=5 больше текущего 2, пропускаем), к D (4+5=9 меньше 10, обновляем) и к E (4+3=7). В куче остаются D (9) и E (7). Берём E, её сосед D имеет путь 7+2=9, что не лучше текущего. Финальный шаг: извлекаем D, соседей нет. Алгоритм завершён.
Итоговые кратчайшие расстояния от A: до B, 4, до C, 2, до D, 9, до E, 7. Эти значения хранятся в словаре distances. Сам путь восстанавливается отдельно, обычно через массив предшественников, но для нахождения дистанций приведённого кода достаточно. Такой подход позволяет обрабатывать графы с тысячами вершин за доли секунды, что и делает алгоритм Дейкстры основой многих картографических сервисов.
4. Анализ эффективности и ограничения
Эффективность алгоритма Дейкстры напрямую зависит от организации очереди с приоритетом. В базовом варианте, когда следующая вершина ищется простым перебором всех необработанных узлов, сложность достигает O(V²). Для небольших графов это терпимо. Но для карты целого региона с миллионами перекрёстков такой подход становится катастрофически медленным.
Использование двоичной кучи заметно меняет ситуацию. Вставка и извлечение минимума в такой структуре занимают O(log V), а суммарная сложность алгоритма снижается до O(E log V), где E, количество рёбер. Эта реализация считается классической и приводится в большинстве учебников, включая лекции на портале Intuit. Для типичной дорожной сети, где число рёбер сравнимо с числом вершин, это даёт практически линейный рост времени работы.
Однако у алгоритма есть жёсткое ограничение, которое нельзя обойти простой модификацией. Он корректно работает только с неотрицательными весами рёбер. Если в графе появляется ребро с отрицательным весом, жадная стратегия Дейкстры даёт сбой: уже обработанная вершина может получить более короткий путь через отрицательное ребро, но алгоритм к ней не вернётся. Для таких случаев существуют другие методы, например алгоритм Беллмана-Форда, но он работает медленнее. В дорожных сетях отрицательные веса практически не встречаются, так что данное ограничение не мешает применению. Но о нём стоит помнить при попытке адаптировать алгоритм для других задач, скажем, в финансовых расчётах.
Выбор структуры хранения графа тоже влияет на производительность. Матрица смежности обеспечивает доступ к любому ребру за O(1), но занимает O(V²) памяти. Для плотных графов, где рёбер много, это оправдано. Список смежности экономит память и позволяет быстро перебирать соседей вершины, что критично для разреженных графов. Дорожные сети как раз относятся к разреженным: из одного
перекрёстка обычно выходит не больше четырёх-пяти дорог. Поэтому на практике почти всегда применяют список смежности.
Существуют и теоретические улучшения. Фибоначчиева куча, предложенная Майклом Фридманом и Робертом Тарьяном в 1987 году, позволяет снизить сложность до O(E + V log V). Это лучший показатель для алгоритмов, основанных на поиске в ширину. Но реализация фибоначчиевой кучи сложна, а константы настолько велики, что выигрыш проявляется лишь на графах с миллионами вершин и очень плотной структурой. Для практических задач, особенно в навигации, проще использовать оптимизированную двоичную кучу.
Несмотря на все ограничения, алгоритм Дейкстры остаётся основой современных навигационных систем. В маршрутизации пакетов в интернете, где протокол OSPF использует его модификации, и в поиске пути в картографических сервисах он демонстрирует высокую надёжность. Многие реальные системы добавляют к нему эвристики, например A* для ускорения поиска, но фундамент остаётся неизменным. Именно сочетание простоты и приемлемой производительности делает алгоритм Дейкстры стандартом индустрии уже более шестидесяти лет.
СПИСОК ЛИТЕРАТУРЫ
1. Алгоритм Дейкстры — Википедия — https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D1%8B
2. Алгоритм Дейкстра поиска кратчайших путей в графе — https://intuit.ru/studies/courses/1439/241/lecture/6224
3. Лекция 9: Алгоритм Дейкстра поиска кратчайших путей в графе — https://intuit.ru/studies/courses/1033/241/lecture/6224
4. Задача поиска кратчайшего пути в графе — https://education.yandex.ru/handbook/algorithms/article/zadacha-poiska-kratchajshego-puti-v-grafe
5. Алгоритм Дейкстры — Алгоритмика — https://ru.algorithmica.org/cs/shortest-paths/dijkstra/
6. Графы дорожных сетей и алгоритмы работы с ними — https://habr.com/ru/articles/180269/
7. Графы для самых маленьких: Dijkstra — https://habr.com/ru/articles/202314/
8. Таблицы, графы, дорожные сети, иерархические структуры — https://urok.1sept.ru/articles/649658
Нужна такая же работа по своей теме? Соберём структуру, текст и источники в этом же оформлении.