1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

# теория · шаг 2 из 6

Допустимость и согласованность: когда эвристике можно верить

Коротко

Эвристика - это обещание «отсюда до цели осталось не меньше h». Обещание должно быть ЧЕСТНЫМ в одну сторону: допустимая эвристика никогда не переоценивает остаток (h(v) <= настоящее расстояние до цели). Переоценит - и A* может выдать не кратчайший путь, зато быстро; это осознанный размен, а не ошибка, если ты знаешь, на что идёшь. Более сильное требование - согласованность (монотонность): h(u) <= w(u, v) + h(v) для каждого ребра и h(цель) = 0. Она означает, что перевешенные веса неотрицательны, и тогда A* ведёт себя как настоящая Дейкстра: извлечённая вершина окончательна, переоткрывать её не придётся. Согласованность влечёт допустимость; обратное неверно.

Если ты различаешь допустимость и согласованность, знаешь, что ломается при нарушении каждой, и помнишь, что согласованность сильнее, листай до «Теперь сам».

Как думаешь, чем плоха завышенная оценка

Эвристика говорит: «отсюда до цели ещё километров десять». Прежде чем читать дальше, подумай, что случится, если на самом деле осталось два. A* сравнивает f = g + h у разных вершин - какую вершину он отложит и чем это грозит ответу?

На что это похоже

Прогноз времени в пути. Навигатор, который занижает («доедете за час», а выходит полтора), заставит тебя рассмотреть больше вариантов, но верный маршрут ты не потеряешь: любой недооценённый вариант рано или поздно будет проверен. Навигатор, который ЗАВЫШАЕТ («туда три часа», а на деле час), отговорит от правильной дороги вовсе - ты поедешь другой, потому что поверил прогнозу.

Механизм: два свойства и что они дают

ДОПУСТИМОСТЬ (не переоценивать):
    h(v) <= d(v, цель)   для каждой вершины
    ⇒ A* находит ОПТИМАЛЬНЫЙ путь (если разрешено переоткрывать вершины)

СОГЛАСОВАННОСТЬ (монотонность):
    h(u) <= w(u, v) + h(v)   для каждого ребра,   h(цель) = 0
    ⇒ перевешенные веса w' = w + h(v) − h(u) неотрицательны
    ⇒ A* = Дейкстра: извлечённая вершина окончательна, переоткрывать не нужно
    ⇒ f вдоль любого пути не убывает (отсюда и слово «монотонность»)

согласованность ⇒ допустимость;  обратное НЕВЕРНО

Почему согласованность влечёт допустимость: идём по кратчайшему пути от v к цели и складываем неравенства h(x) <= w(x, y) + h(y) вдоль него; промежуточные h сокращаются, остаётся h(v) <= d(v, цель) + h(цель) = d(v, цель). Это та же телескопическая сумма, что и в потенциалах.

Практические эвристики почти всегда согласованы: расстояние по прямой на карте, манхэттенское расстояние на сетке с единичными шагами, сумма расстояний фишек до своих мест в пятнашках. Обычно это и не проверяют отдельно - достаточно убедиться, что эвристика получена «расслаблением» задачи: если убрать часть ограничений (разрешить ходить сквозь стены, двигаться по прямой), точное решение упрощённой задачи и будет согласованной эвристикой для исходной.

Правило

Допустимая эвристика не переоценивает остаток (h(v) <= d(v, цель)) - с ней A* даёт оптимальный ответ, но может переоткрывать вершины. Согласованная дополнительно удовлетворяет h(u) <= w(u, v) + h(v) при h(цель) = 0 - с ней перевешенные веса неотрицательны, извлечённая вершина окончательна, и A* работает ровно как Дейкстра. Согласованность влечёт допустимость, обратное неверно. Эвристика, полученная точным решением УПРОЩЁННОЙ задачи, согласована автоматически.

Разбор: что бывает при переоценке

Граф: s→a = 1, a→t = 1, s→t = 3. Настоящий кратчайший путь: s → a → t длиной 2.

Возьмём эвристику, которая завышает: h(a) = 5 (а на самом деле от a до цели 1), h(t) = 0, h(s) = 0.

кладём s: f = 0 + 0 = 0
извлекаем s, релаксируем:
    a: g = 1, f = 1 + 5 = 6
    t: g = 3, f = 3 + 0 = 3
извлекаем t (f = 3 меньше, чем 6) → ЦЕЛЬ ИЗВЛЕЧЕНА, ответ 3

Алгоритм вернул 3, хотя правильный ответ 2: завышенная оценка отпугнула его от вершины a. Это и есть цена недопустимой эвристики - потеря оптимальности.

Обрати внимание, что алгоритм при этом работал БЫСТРЕЕ: он раскрыл меньше вершин. Именно на этом размене построен «взвешенный A*». Коэффициент ε > 1 попадает ровно в одно место - в формулу приоритета: f(v) = g(v) + ε·h(v), то есть эвристику умножают на него при каждом вычислении f, а сам граф и веса не трогают. Ответ при этом гарантированно не хуже оптимального более чем в ε раз, зато находится быстрее. В играх и планировании так делают сознательно: «маршрут на 10% длиннее, но найден за миллисекунду» - нормальный инженерный выбор, если он сделан осознанно.

Разбор: допустимая, но не согласованная

Такие эвристики встречаются редко, но пример полезен: он показывает, что бывает, если написать A* «как Дейкстру», с множеством закрытых вершин, и дать ему только допустимую оценку.

Граф: s→a = 1, s→b = 3, a→b = 1, b→t = 3. Настоящий кратчайший путь - s→a→b→t весом 1 + 1 + 3 = 5; прямой путь s→b→t весит 6.

Эвристика: h(s) = 0, h(a) = 4, h(b) = 0, h(t) = 0. Она ДОПУСТИМА - настоящие расстояния до цели равны 5, 4, 3 и 0, и ни одно значение их не превышает. Но не согласована: для ребра a→b требуется h(a) <= w(a, b) + h(b) = 1 + 0 = 1, а у нас h(a) = 4.

раскрываем s:  a получает g=1, f = 1 + 4 = 5
               b получает g=3, f = 3 + 0 = 3
раскрываем b (f=3, минимум!):  закрыли b; b→t даёт g=6, f=6
раскрываем a (f=5):  a→b даёт g=2 < 3 - УЛУЧШЕНИЕ,
                     но b уже в закрытых, и улучшение отбрасывается
раскрываем t (f=6):  ответ 6

Ответ 6 вместо 5 - и заметь, никакой недопустимости в эвристике нет, сломало всё именно рассогласование. Виновата заниженная оценка у b: она пустила b вперёд с плохим g, а к моменту, когда нашёлся путь получше, вершина была уже закрыта.

Формально то же видно через перевес: вес ребра a→b становится w + h(b) − h(a) = 1 + 0 − 4 = −3 - отрицательный, а на отрицательных весах Дейкстра окончательности не гарантирует. Лечение - разрешить ПЕРЕОТКРЫТИЕ: если вершина закрыта, а потом нашёлся путь к ней дешевле, её кладут в очередь снова. В примере b вернётся в очередь с g = 2, f = 2, и ответ станет верным - 5. Оптимальность при допустимой эвристике так сохраняется всегда, но работы становится больше: вершину можно раскрывать много раз, и в специально построенных примерах число раскрытий растёт экспоненциально.

Вывод простой: если эвристика согласована, можно писать A* «как Дейкстру», с множеством закрытых вершин, и оценка остаётся O((V + E)·log V). Если только допустима - обязательно разрешай переоткрытие и не рассчитывай на ту же оценку.

Что ломается без этого

Первое: взять эвристику «примерно похожую на расстояние» без проверки на переоценку - и получить неоптимальные маршруты, которые почти всегда выглядят правдоподобно. Второе: забыть h(цель) = 0 - тогда даже правильная в остальном эвристика сдвигает приоритеты и может отправить алгоритм не туда. Третье: использовать множество закрытых вершин с допустимой, но НЕсогласованной эвристикой - ответ станет неоптимальным; либо проверяй согласованность, либо разрешай переоткрытия. Четвёртое: считать эвристику дорого (например, запускать ради неё вложенный поиск) - выигрыш съедается вычислением подсказки. Пятое: применять эвристику от координат в графе, где веса не связаны с расстоянием (например, вес - это цена, а не километры): тогда «расстояние по прямой» легко переоценит остаток и сломает оптимальность.

Зачем это в работе

Проверка «не переоцениваю ли я» - главный вопрос при вводе любой эвристики, и он же самый пропускаемый. Практичный рецепт: получай эвристику РАССЛАБЛЕНИЕМ задачи - разреши ходить сквозь препятствия, игнорируй пробки, позволь фишкам головоломки прыгать друг через друга. Точное решение упрощённой задачи никогда не переоценивает решение исходной (она ведь строго проще) и обычно оказывается ещё и согласованным. На дорожных графах так строят эвристики по ориентирам: заранее считают расстояния от нескольких «маяков» и берут оценку из неравенства треугольника - она гораздо точнее расстояния по прямой и остаётся допустимой. А знание, что переоценка даёт скорость ценой оптимальности, позволяет делать этот размен управляемо: умножил эвристику на 1.2 - получил гарантию «не хуже оптимального на 20%».

Теперь сам

Сетка, ходить можно по четырём направлениям, шаг стоит 1. Проверь на допустимость и согласованность две эвристики: (а) манхэттенское расстояние до цели; (б) манхэттенское расстояние, умноженное на 2.

Ответ. (а) Допустима: на сетке с четырьмя направлениями и единичными шагами любой путь от клетки до цели состоит минимум из |Δx| + |Δy| шагов - манхэттенское расстояние и есть точное решение упрощённой задачи «сетка без препятствий», а с препятствиями настоящий путь только длиннее. Значит h никогда не переоценивает. Согласована: при переходе в соседнюю клетку h меняется ровно на единицу - либо уменьшается на 1 (шагнули к цели), либо увеличивается на 1 (шагнули от неё). В обоих случаях h(u) <= 1 + h(v) выполняется, а h(цель) = 0 по определению. Значит можно писать A* с закрытыми вершинами, без переоткрытий.

(б) Недопустима. Возьми клетку в трёх шагах от цели без препятствий: настоящее расстояние 3, а эвристика даёт 6 - переоценка вдвое. A* с ней будет работать быстрее (сильнее «тянет» к цели), но может вернуть путь длиннее кратчайшего. Это и есть взвешенный A* с ε = 2: гарантия - ответ не более чем вдвое хуже оптимального. Согласованность тоже нарушена: при шаге к цели h падает на 2, а вес ребра всего 1, значит h(u) = h(v) + 2 > 1 + h(v). Вывод: (а) - рабочая эвристика на все случаи, (б) - осознанный размен скорости на точность, который надо принимать решением, а не по недосмотру.

Главное

Эвристика - обещание «осталось не меньше h», и оно должно быть честным в одну сторону. ДОПУСТИМАЯ эвристика не переоценивает остаток (h(v) <= d(v, цель)); с ней A* находит оптимальный путь, но вершины может приходиться ПЕРЕОТКРЫВАТЬ. СОГЛАСОВАННАЯ дополнительно удовлетворяет h(u) <= w(u, v) + h(v) при h(цель) = 0; это ровно условие неотрицательности перевешенных весов, поэтому A* становится обычной Дейкстрой: извлечённая вершина окончательна, а f вдоль любого пути не убывает. Согласованность влечёт допустимость (складываем неравенства вдоль пути - телескопическая сумма), обратное неверно, и допустимая-но-несогласованная эвристика требует разрешить переоткрытия. Переоценка ломает оптимальность: на графе s→a=1, a→t=1, s→t=3 с h(a) = 5 алгоритм вернёт 3 вместо 2 - зато быстрее; на этом размене построен взвешенный A*, где эвристику умножают на ε > 1 и получают гарантию «не хуже оптимума в ε раз». Надёжный способ получить хорошую эвристику - точно решить УПРОЩЁННУЮ задачу: она не переоценивает по построению.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.