Я работаю над обобщенной версией головоломки, в которой плитки не имеют чисел. Вместо этого в каждом месте есть плитка или отверстие и представлено логическое значение true или false (плитка или отверстие).Нарушение допустимости A * привело к экспоненциальному ускорению?
Пункт поиска состоит в том, чтобы взять начальное состояние с 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 секунды.
Редактировать: Оказалось, что это не всегда дает оптимальные решения после этого изменения. Тем не менее, я не понимаю, почему это так ускорилось или почему оно все еще находит правильный (хотя и неоптимальный) ответ, несмотря на то, что он не является допустимым.
Когда вы говорите, что больше не работает правильно, вы имеете в виду, что потенциально вы никогда не сможете найти решение или создать субоптимальные решения? Конечная цель этого теста состоит в том, чтобы перемещать визуальные элементы вокруг, без того, чтобы они врезались друг в друга, если это просто субоптимальные решения, которые являются проблемой, тогда это может быть хорошо для меня, если компромисс - это скорость. – asimes
@asimes Я не имею в виду субоптимальные решения. Я имею в виду что угодно. Ваша эвристика недопустима (т. Е. Не эвристическая), вы можете найти что-нибудь. A * всегда должен найти решение, однако то, что вы делаете, действительно не A *, если ваша эвристика не является эвристикой. – Cubic
Вы имеете в виду, что умноженная эвристика недопустима? Я знаю, что это не так, но я уверен, что исходный будет давать оптимальные решения (хотя и очень медленно). – asimes