Estoy tratando de encontrar la solución óptima para un pequeño juego de rompecabezas llamado Twiddle (se puede encontrar un applet con el juego here). El juego tiene una matriz de 3x3 con el número del 1 al 9. El objetivo es traer los números en el orden correcto usando la cantidad mínima de movimientos. En cada movimiento puede rotar un cuadrado de 2x2 en sentido horario o antihorario.Encontrar una buena heurística para A * búsqueda
I.e. si usted tiene este estado
6 3 9
8 7 5
1 2 4
y girar el cuadrado de 2x2 parte superior izquierda hacia la derecha se obtiene
8 6 9
7 3 5
1 2 4
Estoy usando una búsqueda A * para encontrar la solución óptima. Mi f() es simplemente el número de rotaciones necesarias. Mi función heurística ya me lleva a la solución óptima (si la modifico, vea el aviso al final) pero no creo que sea la mejor que pueda encontrar. Mi heurística actual toma cada esquina, mira el número en la esquina y calcula la distancia de manhatten a la posición que este número tendrá en el estado resuelto (que me da el número de rotación necesario para llevar el número a esta posición) y suma todos estos valores Es decir. Se toma el ejemplo anterior:
6 3 9
8 7 5
1 2 4
y este estado final
1 2 3
4 5 6
7 8 9
entonces la heurística hace lo siguiente
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
Además, si h es 0, pero el estado no es completamente ordenó, que h = 1.
Pero existe el problema de rotar 4 elementos a la vez. Entonces hay casos raros en los que puede hacer dos (o más) de estas rotaciones estimadas en un solo movimiento. Esto significa que la heurística de tesis sobrestima la distancia a la solución.
Mi solución actual es, simplemente, excluir una de las esquinas del cálculo que resuelve este problema al menos para mis casos de prueba. No he investigado si realmente resuelve el problema o si esta heurística todavía sobreestima en algunos casos extremos.
Así que mi pregunta es: ¿Cuál es la mejor heurística que se te puede ocurrir?
(Descargo de responsabilidad: Esto es para un proyecto universitario, así que esto es un poco de tarea. Pero soy libre de usar cualquier recurso si se me ocurre, así que está bien preguntarles chicos. También les daré crédito Stackoverflow por ayudarme;))
Su heurística sobreestimando la distancia significa que en algunos casos podría no conducir a la solución óptima. – CodesInChaos
Será mejor que no le digamos a Simon que estás haciendo trampa. :) – bzlm
@CodeInChaos: Como he escrito: lo sé. Y debido a esto estoy buscando uno mejor –