JavaRush /Курсы /Модуль 1: Python Core /Алгоритмы поиска кратчайшего пути

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

Модуль 1: Python Core
17 уровень , 8 лекция
Открыта

9.1 Принципы работы алгоритма Дейкстры

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

Шаги алгоритма:

1. Инициализация:

  • Устанавливаем расстояние до начальной вершины равным 0.
  • Устанавливаем расстояние до всех остальных вершин равным бесконечности.
  • Создаём множество непосещённых вершин.

2. Выбор текущей вершины:

  • Выбираем непосещённую вершину с наименьшим расстоянием (начальная вершина на первом шаге).

3. Обновление расстояний:

  • Для каждой соседней вершины текущей вершины, если новый путь через текущую вершину короче известного пути, обновляем расстояние до этой вершины.

4. Помечаем текущую вершину как посещённую:

  • Удаляем текущую вершину из множества непосещённых вершин.

5. Повторяем шаги 2–4, пока не будут посещены все вершины или не достигнем целевой вершины.

Временная и пространственная сложность алгоритма Дейкстры:

Временная сложность:

O((V + E) log V) при использовании очереди с приоритетом (например, куча Фибоначчи), где V — количество вершин, E — количество рёбер.

O(V^2) при использовании простого списка для хранения расстояний.

Пространственная сложность:

O(V) для хранения расстояний и предков (для восстановления пути).

9.2 Реализация алгоритма Дейкстры

Реализация алгоритма Дейкстры длинная, но очень простая. Рекомендую попробовать в ней разобраться. Если будет непонятно — вернитесь чуть выше и перечитайте основные шаги алгоритма.

Пример реализации алгоритма Дейкстры с использованием очереди с приоритетом (куча):


import heapq

def dijkstra(graph, start):
    # Инициализация
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    priority_queue = [(0, start)]
    parents = {vertex: None for vertex in graph}
            
    while priority_queue:
        current_distance, current_vertex = heapq.heappop(priority_queue)
            
        # Если текущее расстояние больше записанного, пропускаем вершину
        if current_distance > distances[current_vertex]:
            continue
            
        # Обновление расстояний до соседних вершин
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            # Если найден более короткий путь к соседней вершине
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                parents[neighbor] = current_vertex
                heapq.heappush(priority_queue, (distance, neighbor))
            
    return distances, parents
            
# Пример использования:
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}
start_vertex = 'A'
distances, parents = dijkstra(graph, start_vertex)
print("Кратчайшие расстояния от начальной вершины:", distances)
print("Предки для восстановления пути:", parents)

Вывод:


Кратчайшие расстояния от начальной вершины: {'A': 0, 'B': 1, 'C': 3, 'D': 4}
Предки для восстановления пути: {'A': None, 'B': 'A', 'C': 'B', 'D': 'C'}

9.3 Примеры задач, решаемых с использованием алгоритма Дейкстры

Классические примеры задач, решаемых с использованием алгоритма Дейкстры:

1. Оптимизация маршрутов в транспортных сетях

Нахождение кратчайшего пути между точками в транспортной сети (например, между городами).

Применение:

Навигационные системы, такие как Google Maps, используют алгоритм Дейкстры для расчёта оптимальных маршрутов.

2. Планирование маршрутов доставки

Оптимизация маршрутов для служб доставки товаров, чтобы минимизировать затраты и время доставки.

Применение:

Логистические компании используют алгоритм Дейкстры для планирования маршрутов доставки и снижения операционных затрат.

3. Управление сетями

Оптимизация маршрутизации пакетов данных в компьютерных сетях для минимизации задержек и увеличения пропускной способности.

Применение:

Протоколы маршрутизации, такие как OSPF (Open Shortest Path First), используют алгоритм Дейкстры для нахождения кратчайших путей в сетях.

4. Анализ социальных сетей

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

Применение:

Социальные платформы анализируют связи между пользователями для предоставления рекомендаций и анализа сетевой активности.

5. Игры и виртуальные миры

Нахождение пути для персонажей в игровых мирах с препятствиями и различными уровнями сложности.

Применение:

Игровые движки используют алгоритм Дейкстры для расчёта движения персонажей и объектов в виртуальных мирах.

6. Системы управления энергией

Оптимизация распределения энергии в электросетях для минимизации потерь и обеспечения надёжности поставок.

Применение:

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

Пример:

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

7. Системы эвакуации и планирования пути

Оптимизация маршрутов эвакуации в зданиях или городах для быстрого и безопасного вывода людей в случае чрезвычайных ситуаций.

Применение:

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

Пример:

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

2
Задача
Модуль 1: Python Core, 17 уровень, 8 лекция
Недоступна
Путь между городами
Путь между городами
2
Задача
Модуль 1: Python Core, 17 уровень, 8 лекция
Недоступна
Города и списки
Города и списки
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ