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