У меня есть квадратная карта. Допускается только горизонтальное и вертикальное движение (без диагоналей). Стоимость движения всегда 1.
Я реализую алгоритм A * на этой карте, используя манхэттенское расстояние в качестве эвристики расстояния. Согласна ли эта эвристика? Можно ли избежать проверки g(node)
на узлы, которые находятся в наборе ЗАКРЫТО?
Изменить: под последовательным я имею в виду монотонность.
tiles
path-finding
geometry
Эмилиано
источник
источник
Ответы:
На самом деле ответить на ваш вопрос: Manhatten расстояние соответствует , когда вы вынуждены двигаться по вертикали / horizonally вдоль невзвешенном сетки (это можно легко показать , по определению на википедии) . Так что да, в вашем случае вы можете избежать перепроверки узлов в закрытом наборе.
Однако после того, как вы разрешите перемещение по диагонали или под любым углом, ручное расстояние становится недопустимым, поскольку оно переоценивает диагональные затраты, что обязательно означает, что оно не согласовано.
источник
h(x) = min(manhattan(p1), manhattan(p2))
(т.е. либо p1, либо p2 - хорошая конечная точка, и я хочу достичь ближайшей). Этоh(x)
все еще монотонный?h(x, p1)
иh(x, p2)
согласованы, тоmin(h(x,p1), h(x,p2))
также будут согласованы. Это легко показать из определения в википедии (нам нужно показать, чтоmin(h(x, p1), h(x, p2)) <= distance(x,y) + min(h(y, p1), h(y, p2))
для всех узловx
иy
с ребром между ними. Теперь предположим, чтоh(x, p1)
это минимум; можете ли вы показать, что это определенно<=
правая сторона, используя тот факт, что обе эвристики согласуются?)Да, манхэттенское расстояние между двумя точками всегда одинаково, как и обычное расстояние между ними. Вы можете думать, что расстояние до Манхэттена является компонентами X и Y линии, проходящей между двумя точками.
Это изображение ( из Википедии ) хорошо иллюстрирует это:
Зеленая линия фактическое расстояние.
В синих , красных и желтых линиях все представляют собой один и то же Manhattan расстояние (12 единиц). Независимо от того, какую комбинацию движений вверх и вправо вы рисуете из нижней левой точки в нижнюю правую, вы получите одинаковое общее расстояние Манхэттена.
источник
h(x) = 1000
, что, очевидно, не соответствует) . Он может избежать перепроверки узлов, но только потому, что расстояние Манхэттена является постоянным, что этот ответ не показывает.2*manhatten
удовлетворяет это, но не соответствует.В продолжение ответа Byte56 я хотел бы указать, что в вашем конкретном наборе данных использование Манхэттенского расстояния в качестве эвристической функции фактически всегда будет идеальной эвристикой в том смысле, что она всегда будет возвращать фактическую стоимость пути (при условии, что есть ничто не "блокирует" пути).
Следует также отметить, что все узлы в правильном направлении (по горизонтали или по вертикали) будут давать одинаковое ожидаемое расстояние (поскольку существует множество одинаково коротких путей к цели). Вы должны знать, что ваша очередь приоритетов (открытый набор) должна, в случае связанных приоритетов, сначала удалить из очереди последний добавленный узел (LIFO - Last In First Out). При этом вы будете проверять только те узлы, которые окажутся на оптимальном пути . Если вы исследуете одинаково подходящие узлы в порядке FIFO («первым пришел - первым обслужен»), вы будете эффективно проверять все узлы, являющиеся частью лучшего пути. Эта проблема возникает из-за того, что есть несколько одинаково хороших путей к целевому узлу.
источник
Я не уверен, что вы подразумеваете под "всегда" последовательным. Является ли расстояние Манхэттена на фиксированной сетке независимым от пройденного пути? Да, как сказал ответ Byte56.
Однако, например, манхэттенское расстояние не является инвариантным относительно поворотов. Например, манхэттенское расстояние ( L1-норма ) между началом координат и точкой
(10,10)
есть|10-0| + |10-0| = 20
. Однако, если вы повернете свои координаты на 45 градусов (то есть теперь ваша фиксированная точка лежит вдоль одного из направлений сетки), вы обнаружите, что та же самая точка находится сейчас(10sqrt(2),0)
, как и расстояние от Манхэттена до начала координат10sqrt(2)~14.14
.источник