Я создал решатель 8 головоломок, используя поиск в ширину. Теперь я хотел бы изменить код для использования эвристики. Буду признателен, если кто-нибудь ответит на следующие два вопроса:
Решаемость
Как мы решаем, разрешима ли головоломка 8? (данные начальное состояние и целевое состояние) Вот что говорит Википедия:
Инвариант - это четность перестановки всех 16 квадратов плюс четность расстояния такси (количество строк плюс количество столбцов) пустого квадрата от нижнего правого угла.
К сожалению, я не мог понять, что это значит. Было немного сложно понять. Может кто-нибудь объяснить на более простом языке?
Самое короткое решение
Учитывая эвристику, гарантируется ли кратчайшее решение с использованием алгоритма A*? Чтобы быть более конкретным, будет ли первый узел в открытом списке всегда иметь глубину (или количество движений, сделанных таким жирным), которая является минимальной из глубин всех узлов, присутствующих в открытом списке?
Должна ли эвристика удовлетворять некоторым условиям, чтобы приведенное выше утверждение было верным?
Правка : Как получается, что допустимая эвристика всегда обеспечивает оптимальное решение? И как проверить, допустима ли эвристика?
Я бы использовал эвристики, перечисленные здесь
Manhattan Distance
Linear Conflict
Pattern Database
Misplaced Tiles
Nilsson's Sequence Score
N-MaxSwap X-Y
Tiles out of row and column
Для уточнения от Эяля Шнайдера: