Графи, веса и расслабление
Граф G = (V, E) состоит из вершин и ребер; в взвешенном графе каждая ребра (u, v) несет отрицательный вес w(u,v), который представляет собой расстояние, время или другую плату. Алгоритмы поиска кратчайшего пути находят минимальную стоимость пути от источника до одного или всех остальных вершин, и почти все они используют один и тот же основной оператор – расслабление: если недавно обнаруженный маршрут к v дешевле, чем известная ранее лучшая стоимость, обновите ее.
Relaxation:
if d[v] > d[u] + w(u,v):
d[v] = d[u] + w(u,v)
parent[v] = u
d[v] = current best known distance from source to v
Initially: d[s] = 0, d[v] = ∞ for all other v
Алгоритм Дейкстры
Дейкстра (1959) обробляє вершини в порядку їхньої тимчасово найкоротшої відомої відстані, використовуючи чергу пріоритетів: повторно видобуває вершину з найменшою відомою відстанню та розглядає всі ребра, що виходять з неї. Оскільки ваги ребер є невід’ємними, після вилучення вершини її відстань є доведеною — жодна необроблена вершина ніколи не запропонує дешевших маршрутів до неї. Ця гарантія порушується в момент, коли дозволено від'ємні ваги ребер, тому Дейкстрі потрібен Bellman-Ford (O(VE), обробляє негативні ваги, виявляє негативні цикли) як резервний варіант. Продуктивність значною мірою залежить від черги пріоритетів: невідсортований масив дає O(V²), що підходить для щільних графів; бінарне дерево (бінарна куча) дає O((V+E) log V), практичний вибір для розріджених графів, типових для мереж доріг, де бінарно-кущовий алгоритм Дейкстри над карткою міста з мільйона вузлів працює приблизно за 50–100мс.
Пошук A* та евристики
A* (Hart, Nilsson, Raphael, 1968) покращує Dijkstra для пошуку цілі з однієї точки шляхом додавання евристичної функції h(v), оцінки залишків вартості від v до мети:
f(v) = g(v) + h(v) g(v) = точна вартість від джерела до v (та сама, як і у Dijkstra d[v]) h(v) = евристична оцінка вартості від v до мети Поширені евристики: Евклідова відстань: h(v) = √((x_v−x_t)² + (y_v−y_t)²) Манхеттенська відстань: h(v) = |x_v−x_t| + |y_v−y_t| (графічні мережі) Dijkstra досліджує концентричними колами навколо джерела; A*, сортуючи чергу пріоритетів за f замість g, досліджує еліпс, розтягнутий до мети — зазвичай на 5-100 разів менше вузлів розширено на мережах дорожнього типу. Гарантія того, що A* все ще знаходить справді оптимальний шлях, залежить від допустимості: h(v) ніколи не повинна переоцінювати реальну залишкову вартість. Евклідова та Манхеттенська відстані є обома допустимими (і послідовними, що задовольняє трикутному нерівності, яка запобігає повторному відкриттю вузлів); евристика, яка завжди повертає нуль, є безперечно допустимою і зменшує A* до простого Dijkstra. Варіанти з вагою, такі як f = g + w·h, де w > 1, є недопустимими, але швидшими, гарантуючи лише шлях протягом (1+ε) від оптимального — типова компроміс у реальному часі для штучного інтелекту в іграх.
f(v) = g(v) + h(v) g(v) = exact cost from source to v (same as Dijkstra's d[v]) h(v) = heuristic estimate of cost from v to the goal Common heuristics: Euclidean distance: h(v) = √((x_v−x_t)² + (y_v−y_t)²) Manhattan distance: h(v) = |x_v−x_t| + |y_v−y_t| (grid graphs)
Варіанти та практичне застосування
Виробничі системи додають додаткові хитрощі: бідиректionale пошук запускається як з джерела, так і з цілі та зустрічається посередині; Jump Point Search обрізає величезну кількість проміжних вузлів на гратах-коштів для прискорення в 10-100 разів; Contraction Hierarchies попередньо обчислює короткі шляхи офлайн, тому запит маршруту на 1000 км у європейській дорожній мережі виконується за мілісекунди. Google Maps, Apple Maps та Waze поєднують варіації цих методів з інформацією про трафік в реальному часі. Ігрові двигуни запускають тисячі запитів A* на секунду для навігації NPC у мережах шляху, маршрутизатори Інтернету виконують Dijkstra безпосередньо в базах даних стану зв’язків для OSPF маршрутизації, а роботи використовують D* Lite для ефективного перепланування, коли їх карта світу змінюється — той самий основний принцип, виявлений у 1956 році, все ще маршрутизує літаки, пакети та пікселі сьогодні.
Часті запитання
Чому алгоритм Дейкстри може не працювати з від'ємними вагами ребер?
Дейкстра жадібно вибирає вершину з найменшою відомою відстанню та вважає цю відстань кінцевою, припускаючи, що жодна необроблена вершина ніколи не запропонує коротшого шляху. Від'ємний вага ребра може порушити це припущення, дозволяючи здано визначеній відстані пізніше зменшуватися. Алгоритм Беллмана-Форда правильно обробляє від’ємні ваги, займає O(VE) часу та навіть може виявляти негативні цикли.
Як A* покращує алгоритм Дейкстри?
A* розширює Дейкстру, сортуючи чергу пріоритетів за f(v) = g(v) + h(v), де g(v) є точна вартість до цього моменту, а h(v) – евристична оцінка вартості до мети, така як відстань Евкліда або Манхеттен. Дейкстра досліджує від джерела в концентричних колах; A* досліджує еліпс, розтягнутий у напрямку до мети, зазвичай розширюючи на 5-100 разів менше вузлів на графах, що імітують дорожню мережу.
Що робить евристику допустимою та чому це важливо?
Евристика h(v) є допустимою, якщо вона ніколи не перебільшує справжню вартість до мети, h(v) ≤ h*(v) для кожної вершини. Це гарантує, що A* все ще знаходить оптимальний шлях; евристика, яка завжди повертає нуль, є допустимою та зводитиме A* до простого Дейкстри. Недопустимі евристики, такі як зважений A* з w > 1, працюють швидше, але гарантують лише шлях протягом обмеженого коефіцієнта від оптимального — корисні в реальному часі для штучного інтелекту, де швидкість важливіша за точність.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте the simulation і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію the simulation