Я пишу программу, которая решает 24-головоломку (сетка 5x5), используя две эвристики. Первый использует количество блоков в неправильном месте, а второй использует манхэттенское расстояние между текущим и желаемым местом блоков.
У меня есть разные функции в программе, которые используют каждую эвристику с A * и жадным поиском и сравнивают результаты (всего 4 разные части).
Мне любопытно, неверна ли моя программа или это ограничение головоломки. Головоломка генерируется случайным образом, части перемещаются несколько раз, и в большинстве случаев (~ 70%) решение находится с помощью большинства поисков, но иногда они терпят неудачу.
Я могу понять, почему жадный код потерпит неудачу, поскольку он не завершен, но видя, что A * завершен, это заставляет меня поверить, что в моем коде есть ошибка.
Так может ли кто-нибудь сказать мне, является ли это ошибкой в моем мышлении или ограничением головоломки? Извините, если это плохо сформулировано, я перефразирую, если это необходимо.
Спасибо
РЕДАКТИРОВАТЬ:
Так что я почти уверен, что я что-то делаю не так. Вот пошаговый список того, как я выполняю поиск, что-то здесь не так?
- Создайте новый список для периферии, отсортированный по используемой эвристике.
- Создайте набор для хранения посещенных узлов
- Добавьте начальное состояние головоломки к краю
- while the fringe isn't empty..
- pop the first element from the fringe
- если узел был посещен ранее, пропустите его
- если узел является целью, вернуть его
- добавить узел в наш посещенный набор
- разверните узел и добавьте всех потомков обратно к краю