Я пытаюсь найти оптимальное решение для небольшой головоломки под названием Twiddle (апплет с игрой можно найти здесь ). В игре используется матрица 3х3 с числом от 1 до 9. Цель игры - привести числа в правильном порядке, используя минимальное количество ходов. На каждом ходу вы можете вращать квадрат 2х2 по часовой или против часовой стрелки.
т.е. если у вас есть это состояние
6 3 9
8 7 5
1 2 4
и вы поворачиваете верхний левый квадрат 2x2 по часовой стрелке, вы получаете
8 6 9
7 3 5
1 2 4
Я использую поиск A *, чтобы найти оптимальное решение. My f () - это просто необходимое количество оборотов. Моя эвристическая функция уже приводит к оптимальному решению (если я его изменю, см. Уведомление в конце), но я не думаю, что это лучшее, что вы можете найти. Моя текущая эвристика берет каждый угол, смотрит на число в углу и вычисляет ручное расстояние до позиции, которую это число будет иметь в разрешенном состоянии (что дает мне число поворотов, необходимое для приведения числа в это положение) и суммирует все эти значения. То есть Вы берете приведенный выше пример:
6 3 9
8 7 5
1 2 4
и это конечное состояние
1 2 3
4 5 6
7 8 9
тогда эвристик делает следующее
6 is currently at index 0 and should by at index 5: 3 rotations needed
9 is currently at index 2 and should by at index 8: 2 rotations needed
1 is currently at index 6 and should by at index 0: 2 rotations needed
4 is currently at index 8 and should by at index 3: 3 rotations needed
h = 3 + 2 + 2 + 3 = 10
Кроме того, если h равно 0, но состояние не полностью упорядочено, то h = 1.
Но есть проблема в том, что вы вращаете 4 элемента одновременно. Так что есть редкие случаи, когда вы можете сделать два (или больше) из этих предполагаемых вращений за один ход. Это означает, что тезис эвристический завышает расстояние до решения.
Мой текущий обходной путь - просто исключить один из углов из расчета, который решает эту проблему, по крайней мере, для моих тестовых случаев. Я не исследовал, если действительно решает проблему или эта эвристика все еще переоценивает в некоторых крайних случаях.
Итак, мой вопрос: Какую лучшую эвристику вы можете придумать?
(Отказ от ответственности: это для университетского проекта, так что это немного домашнее задание. Но я могу свободно использовать любой ресурс, если смогу придумать, так что можно спросить вас, ребята. Также я буду благодарен Stackoverflow за помогая мне;))