1 / 36

Programación Declarativa Avanzada Resolución De Puzzles

Programación Declarativa Avanzada Resolución De Puzzles. Vicente Andrade Alcántara Miguel Ángel Sánchez González. Programación Declarativa Avanzada Puzzle: Coloreado de Mapas. Vicente Andrade Alcántara Miguel Ángel Sánchez González. I. Definición del problema.

nira
Download Presentation

Programación Declarativa Avanzada Resolución De Puzzles

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programación Declarativa Avanzada Resolución De Puzzles Vicente Andrade Alcántara Miguel Ángel Sánchez González

  2. Programación Declarativa Avanzada Puzzle: Coloreado de Mapas Vicente Andrade Alcántara Miguel Ángel Sánchez González

  3. I. Definición del problema • Hay que colorear un mapa, de forma que las provincias vecinas nunca coincidan en el color

  4. I. Definición del problema • Los colores elegidos son rojo, verde y azul Solución:

  5. II. Implementación en árbol • Este puzzle se podía realizar mediante un árbol que generara todas las posibles soluciones. • Dado un nivel ‘n’, colorear la provincia determinada para dicho nivel, se aceptan todas las configuraciones válidas y se desechan las ramas cuyo color de la provincia a colorear coincida con uno de sus provincias fronterizas.

  6. II. Implementación en árbol • Al final, para mostrar todas las posibles soluciones, se utilizaría el algoritmo de búsqueda que más convenga, como amplitud, profundidad, de coste, incluso se podría utilizar algún heurístico para saber si una rama determinada llegará a una solución y no tendrá poda.

  7. II. Implementación en árbol

  8. III. Implementación en listas Estructuras de datos • Estructuras de datos para definir los colores, las provincias, la estructura de salida y las fronteras de las provincias • data Color = Rojo|Verde|Azul • data Provincia = Almeria|Cadiz|Cordoba|Granada|Jaen|Huelva| Malaga|Sevilla • type ProvColor = [(Provincia,Color)] • type Frontera = Provincia -> [Provincia] • El mapa está definido por una lista de provincias y las fronteras de éstas • data Mapa = Atlas [Provincia] Frontera

  9. III. Implementación en listas Ejemplo • lProvincia=[Almeria .. Sevilla] • lColores=[Rojo .. Azul] • frontera p = case p of Almeria -> [Granada] Cadiz -> [Huelva,Sevilla,Malaga] Cordoba -> [Sevilla,Malaga,Jaen,Granada] Granada -> [Malaga,Cordoba,Jaen,Almeria] Jaen -> [Cordoba,Granada] Huelva -> [Cadiz,Sevilla] Malaga -> [Cadiz,Sevilla,Cordoba,Granada] Sevilla -> [Huelva,Cadiz,Malaga,Cordoba] • andalucia = Atlas lProvincia frontera

  10. III. Implementación en listasFunciones • Función que devuelve los colores de las provincias que son fronteras de la provincia "prov" colorDeFronteras :: Provincia -> ProvColor -> Frontera -> [Color] colorDeFronteras prov provCol f = [col'|let frontsDeProv = f prov, (prov',col')<- provCol, elem prov' frontsDeProv] • Colorea un mapa a partir de una lista de colores dada. Una vez obtenida el coloreado del resto de provincias, se miran que colores no son permitidos, ya que los utiliza la provincia que es anexa a "prov", y se escogen el resto de colores permitidos colorearMapa :: Mapa -> [Color] -> [ProvColor] colorearMapa (Atlas [] _) colores = [[]] colorearMapa (Atlas (prov:restoprov) f) colores = [(prov,color):restoMapa | restoMapa <- colorearMapa (Atlas restoprov f) colores, let coloresNoP = colorDeFronteras prov restoMapa f, color <- diff colores coloresNoP]

  11. III. Implementación en listasFunciones • Función que devuelve True si el mapa coloreado es correcto solucionBuena:: ProvColor -> Frontera -> Bool solucionBuena xs f = solaux xs xs f solaux:: ProvColor -> ProvColor -> Frontera -> Bool solaux [] _ _ = True solaux ((prov,col):resto) provcol f |elem col (colorDeFronteras prov provcol f) = False |otherwise = solaux resto provcol f

  12. III. Implementación en listasSolución • head(colorearMapa andalucia lColores) [(Almeria,Verde),(Cadiz,Azul),(Cordoba,Azul),(Granada,Rojo),(Jaen,Verde),(Huelva,Verde),(Malaga,Verde),(Sevilla,Rojo)]

  13. Programación Declarativa Avanzada Puzzle: Cuadrados mágicos con fichas de dominó Vicente Andrade Alcántara Miguel Ángel Sánchez González

  14. Definición del problema • El puzzle consiste en colocar una lista de N piezas del famoso juego del dominó en un tablero cuadrado de dimensiones MxM.

  15. 19 19 19 19 19 19 19 19 • La única restricción que plantea este puzzle para colocar las piezas, es que la suma de los valores de cada fila y cada columna sea la misma para todas.

  16. Estrategias de búsqueda • Existen principalmente dos estrategias a seguir para encontrar las soluciones a este problema: • Usar una búsqueda en grafos • Método de generación/prueba

  17. Búsqueda en Grafos • Para la estrategia de búsqueda en grafos, obtendríamos el camino de ir de un nodo inicial, que representa el tablero vacío, hasta aquél que tenga colocadas todas las piezas, y satisfaga las restricciones del problema. • La función ‘suc’, que genera los sucesores de un nodo, devolvería aquellos tableros, resultado de colocar cada una de las piezas restantes en un hueco dado

  18. ... Ejemplo de la primera generación de sucesores

  19. Estrategia basada en generación/prueba (I) • La estrategia basada en generación/prueba es sustancialmente distinta de la búsqueda en grafos. • Con éste método, la finalidad es generar todas aquellas posibles combinaciones de los elementos que forman el problema, y comprobar que cumplen las restricciones que imponen.

  20. Estrategia basada en generación/prueba (II) • En el caso de nuestro cuadrado mágico, se trata de generar todas las formas posibles de colocar las piezas de dominó sobre el tablero, y seleccionar aquéllas que cumplan la restricción: Para cada fila ‘i’, Σ tab(i)(j) = K1 Para cada columna ‘j’, Σ tab(i)(j) = K2 K1 = K2

  21. Implementación en Haskell (I) • Se ha optado por desarrollar para este problema la segunda solución: generación/prueba. • Para implementar esta estrategia en Haskell, hemos usado listas por comprensión, de manera que una función se encarga de generar todas las combinaciones posibles de tableros, y otra actúa como condición de filtro.

  22. Implementación en Haskell (II) • La sentencia queda de la siguiente forma: cuadrados_magicos x = [s | s <- posibles x, valida s]. En este ejemplo, la función ‘posibles’ genera una lista enorme de candidatos: (más de 160.000) ...

  23. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  24. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  25. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  26. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  27. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  28. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  29. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  30. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  31. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  32. Implementación en Haskell (II) • Y la función que filtra, elimina los que no cumplen las restricciones:

  33. Implementación en Haskell (III) • Las dos funciones principales son: • posibles :: [(Int, Int)] -> Int -> Int -> [Tablero] • Recibe una lista de fichas y devuelve una lista de tableros • valida :: Tablero -> Bool • Recibe un tablero y comprueba si cumple la restricción Ambas se apoyan en la definición de un tipo auxiliar: Tablero, que se define como sigue: type Tablero = [ [ Int ] ]

  34. La función ‘posibles’ • La definición de la función ‘posibles’ en el código del programa queda como sigue: posibles :: [(Int, Int)] -> Int -> Int -> [Tablero] posibles x n m = elimina_vacio (alisar_nivel (map (generar_tableros (tableroinicial n m )) (map (\ x -> alisar_nivel (map tablear x)) (permutaciones x))))

  35. La función ‘valida’ • La definición de la función ‘valida’ en el código del programa queda como sigue: valida :: Tablero -> Bool valida t = (buenaH t n) && (buenaV t n) where n = sum (head t)

  36. Algunas conclusiones • El uso de listas por comprensión facilita bastante la definición de la solución. • Por el contrario, la implementación de la solución del problema de puzzles mágicos mediante esta estrategia presenta una elevada carga computacional, dado el orden de magnitud de la función ‘posibles’. • Probado para 8 fichas, en un equipo a una frecuencia de 2,4 GHz, el tiempo consumido en mostrar todas las soluciones fue de 40 minutos aprox.

More Related