El documento describe el problema del rompecabezas de 8 piezas y el enfoque para resolverlo mediante búsqueda informada A*. Se generará un nodo inicial aleatorio, se evaluarán diferentes heurísticas como número de piezas desacomodadas y distancia Manhattan total para seleccionar la mejor, y al encontrar la solución se mostrará la ruta recorrida. Se implementará en Java usando varias clases como GeneradorDeNodoInicial, BuscarCoordenadas, y NodoFrontera.
investigación de los Avances tecnológicos del siglo XXI
Problema 8 puzzle
1. Problema del 8 Puzzle
Arámburo Cabada Joseph David
Chávez Sierra Juan Paúl
Hernández Castaños Gabriela
Leyva Bujons Iván Alberto
2. Planteamiento del problema.
• Se tiene un puzzle de 8 números los cuales están colocados
aleatoriamente en un espacio de 3 x 3 y se desean ordenar de la
siguiente manera:
1 4 7
2 5 8
3 6
3. Condiciones del problema
• Se debe generar un nodo inicial de forma aleatoria.
• Se debe utilizar el método de busca informado A*.
• Debe evaluarse todas las posibles heurísticas para seleccionar la
mejor.
• Al encontrar el nodo final se debe mostrar la ruta recorrida hacia la
solución.
5. Número de fichas desacomodadas
h=4
h=3
h=2 h=4
Tres fichas
desacomodadas
Cuatro fichas
desacomodadas
Dos fichas
desacomodadas
cuatro fichas
desacomodadas
7. Resultado de la evaluación de la heurística.
• Se usara el método de búsqueda informado A*.
• La heurística que se usara es Distancia Manhattan Total.
• Estructuras de datos que se usaran:
• Nodos cerrados: pila.
• Nodos abiertos: cola con prioridad.
8. Entorno de desarrollo seleccionado
• Lenguaje : Java
• Se escogió resolver el problema con este lenguaje con el que estamos mas
familiarizados a través de su interfaz de consola.
• IDE: Netbeans v8.0
9. Implementación
• Se desarrollo una estructura orientada a objetos con la finalidad de
una legible comprensión por parte de usuarios terceros. Cada clase
realiza una tarea especifica que es usada en la clase principal.
10. Las clases
• A continuación se muestran las clases desarroladas:
11. Class GeneradorDeNodoInicial
• Consiste en almacenar los números
del 1 al 9 en un arreglo para luego
extraerlos de forma aleatoria a través
de su numero de posición. La posición
seleccionada será eliminada.
12. Class BuscarCoordenadas
Consiste en visitar todas las casillas de
la matriz del nodo actual con el
objetivo de saber la localización del
espacio representado por el numero 9
y asi poder realizar los siguientes
movimientos.
13. Class CompararNodos
• Consiste en hacer una
comparación entre el nodo
actual y el nodo meta. Se toma
cada elemento de la matriz y se
compara con su contraparte en
la matriz objetivo. Si surge una
diferencia el método se detiene
y devuelve false, de lo contrario
devolvería true y finaliza la
búsqueda.
14. Class CalcularManhattan
• Consiste en la suma acumulada de
las distancias en X y Y de cada ficha
desde su estado actual hasta la
meta. El método devuelve el valor
acumulado el cual se guardara en el
campo h del nodo.
15. Class MoverFicha
• Consiste en realizar el intercambio
del elemento con el numero 9 que
representa el espacio vacío con
alguna de su ficha contiguas a la
derecha, abajo, izquierda o arriba
según sea permitido. El método
realiza el movimiento o en su
defecto un nulo si no se puede
mover porque esta contigua al
limite.
16. Class NodaCerrado
• Clase que nos sirve para generar
objetos tipo NodoCerrado para
agregarlos a la cola de cerrados.
17. Class NodoFrontera
• Clase que nos sirve para crear objetos
de tipo NodoFrontera que serian los
nodo abierto o frontera que están
pendientes por visitar.
18. Class BuscarCerrados
• Esta clase realiza una búsqueda en la
cola de nodos cerrados
comparándolos con el nodo actual. La
clase devuelve un false de no
encontrarse, de lo contrario devuelve
un true.
19. Class BusquedaFronteras
• Esta clase realiza una búsqueda en la
cola de nodos frontera comparándolos
con el actual que resulta del
ordenamiento por prioridad. El
método devuelve un true de
encontrarse el nodo o en su defecto
devuelve un false.
20. Class BusquedaPadre
• Esta clase realiza una búsqueda a
través de los identificadores de
los nodos para encontrar el padre
del nodo actual. El método
devuelve el identificados del
padre o de lo contrario devuelve
un nulo.
21. Class ImprimirNodo
• Este método imprime los nodos
que representan el camino
desde el nodo inicial al nodo
meta.
22. Demostración del Código
• A continuación se hace una demostración del código desarrollado en
la consola de NetBeans.