Я выполняю задание, в котором мне нужно использовать звездочку, чтобы решить 15-puzzle (на языке C).
Эвристическая функция — это Манхэттенское расстояние (также известное как расстояние такси).
Нам дан пример ввода/вывода, где доска решается за 22 ходов и после расширения 395 узлов (состояний доски) (т.е. мы должны были посмотреть на потомков 395 узлы)
Под «правильной» эвристикой я подразумеваю, что моя функция такая же, как и та, которая используется для создания выборочных выходных данных и дает правильное расстояние.
Проблема в том, что мое решение расширяет более 400 узлов, чтобы найти решение (оптимально 22 хода, но другой).
Я заметил, что число изменяется в зависимости от порядка создания дочерних узлов (перемещение плитки пробела вверх, влево, вниз, вправо или в других направлениях).
Есть 24 способа перемещать космическую плитку вверх, вниз, влево и вправо для создания дочерних элементов, и я попробовал все из них, но ни один из них не расширил 395 узлов.
Почему это происходит?
Терминология:
- узел: каждый узел представляет собой конфигурацию доски с 15 головоломками
- дочерние элементы: конфигурации, которые вы можете получить, перемещая плитку пространства вверх, вниз, влево или вправо от текущего узла.
PS: я использую двоичную кучу для открытого списка, если это имеет значение
Спасибо