Нарушение допустимости A* вызвало экспоненциальное ускорение?

Я работал над обобщенной версией головоломки со скользящими плитками, где плитки не имеют чисел. Вместо этого каждое местоположение имеет плитку или отверстие и представлено логическим значением как true или false (плитка или отверстие).

Смысл поиска состоит в том, чтобы взять начальное состояние с n плитками и целевое состояние с n целевыми местоположениями и использовать A*, чтобы найти решение о том, как перемещать плитки, чтобы каждое целевое местоположение было заполнено. Вот пример ниже для сетки 4x3:

Initial State:
T F T F
F F T F
F F T T

Goal State
T T T T
T F F F
F F F F

Для этого я работал над разными эвристиками, и у наиболее успешной была логика, которая выглядела примерно так:

int heuristicVal = 0

for every tile (i)...
int closest = infinity
for every goal location (j)...
if (manhattan distance of ij < closest) closest = manhattan distance of ij
end for
heuristicVal += closest
end for

return heuristicVal

К сожалению, это все еще было слишком медленным в ситуациях, когда две или более плитки направлялись эвристикой к одному и тому же целевому местоположению. Я попытался умножить heuristicVal на количество плиток, и внезапно произошло экспоненциальное ускорение. Проблемы, которые раньше выполнялись за 28 секунд, теперь выполнялись менее чем за 1 секунду.

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


person asimes    schedule 27.05.2013    source источник


Ответы (1)


Если вы нарушаете допустимость, A* больше не работает правильно. Обратите внимание, что не работает корректно не означает, что вы никогда не получите оптимального результата — просто нет гарантии, что вы его получите. Вы также можете быстрее сходиться к решению, но какой в ​​этом смысл, если это решение не является правильным?

person Cubic    schedule 27.05.2013
comment
Когда вы говорите, что больше не работает правильно, вы имеете в виду, что потенциально никогда не сможете найти решение или можете получить неоптимальные решения? Конечная цель этого теста — перемещать визуальные элементы без столкновений друг с другом. Если проблема заключается только в неоптимальных решениях, то это может быть нормально для меня, если компромисс — скорость. - person asimes; 27.05.2013
comment
@asimes Я не имею в виду неоптимальные решения. Я имею в виду что угодно. Ваша эвристика неприемлема (то есть не эвристика), вы можете найти что угодно. A* всегда должен находить решение, однако то, что вы делаете, на самом деле не является A*, если ваша эвристика не является эвристикой. - person Cubic; 27.05.2013
comment
Вы имеете в виду, что умноженная эвристика недопустима, верно? Я знаю, что это не так, но я совершенно уверен, что исходный вариант будет давать оптимальные решения (хотя иногда очень медленно). - person asimes; 27.05.2013
comment
Да, умноженный. Ваш оригинал выглядит нормально для меня, хотя я не удосужился это доказать. Я предполагаю, что вы уже сделали это. - person Cubic; 27.05.2013