A* поиск

Оптимизация Дейкстры для поиска пути к конкретной цели: добавляем эвристическую функцию h(v) (оценка расстояния от v до цели), используем f(v) = g(v) + h(v) для приоритета (g(v) — реальное расстояние от старта). Требования к h: admissible (не переоценивает, h(v) ≤ истинное расстояние), consistent (h(u) ≤ cost(u,v) + h(v)). Эвристики: Euclidean distance (√[(x₁-x₂)²+(y₁-y₂)²]) для 2D grid, Manhattan distance (|x₁-x₂|+|y₁-y₂|) для grid с 4 направлениями. Применение: игры (pathfinding), навигация (Google Maps), роботы

📖2 мин чтения📊Уровень 7📅16 апреля 2026 г.

Загрузка карты...

A* (A-star) — алгоритм поиска кратчайшего пути в графе, сочетающий принцип алгоритма Дейкстры с эвристической оценкой расстояния до цели. Разработан Питером Хартом, Нилсом Нильссоном и Бертрамом Рафаэлем в 1968 году. Является оптимальным и полным при допустимой (admissible) эвристике.

Принцип работы

A* оценивает каждую вершину v функцией f(v) = g(v) + h(v), где:

  • g(v) — реальная стоимость пути от старта до v
  • h(v) — эвристическая оценка расстояния от v до цели
  • f(v) — полная оценка; алгоритм всегда расширяет вершину с минимальным f

Алгоритм сохраняет открытый список (вершины для рассмотрения, priority queue) и закрытый (уже обработанные). На каждом шаге берётся вершина с минимальным f, проверяются её соседи.

Требования к эвристике

  • Admissible (допустимая) — h(v) никогда не переоценивает истинное расстояние: h(v) ≤ d*(v). Это гарантирует оптимальность пути
  • Consistent (согласованная) — h(u) ≤ cost(u,v) + h(v) для любого ребра. Более сильное условие, гарантирует монотонность

Примеры эвристик: Евклидово расстояние √[(x₁−x₂)²+(y₁−y₂)²] для 2D-сетки, Манхэттенское расстояние |x₁−x₂|+|y₁−y₂| для движения по четырём направлениям.

Применение

A* — стандарт в игровом AI для нахождения пути персонажей. Используется в навигационных системах (Google Maps, Яндекс.Навигатор) вместе с иерархическими улучшениями. Применяется в робототехнике для планирования маршрутов. На больших графах используют A* с «jump point search» или bidirectional A* для ускорения.