View
44
Download
0
Category
Preview:
DESCRIPTION
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. - PowerPoint PPT Presentation
Citation preview
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 I. Definición del problemaproblema
Hay que colorear un mapa, de forma que las Hay que colorear un mapa, de forma que las provincias vecinas nunca coincidan en el colorprovincias vecinas nunca coincidan en el color
4
I. Definición del I. Definición del problemaproblema
Los colores elegidos son rojo, verde y azul Los colores elegidos son rojo, verde y azul
Solución:Solución:
5
II. Implementación en II. Implementación en árbolárbol
Este puzzle se podía realizar mediante un Este puzzle se podía realizar mediante un árbol que generara todas las posibles árbol que generara todas las posibles soluciones.soluciones.
Dado un nivel ‘n’, colorear la provincia Dado un nivel ‘n’, colorear la provincia determinada para dicho nivel, se aceptan determinada para dicho nivel, se aceptan todas las configuraciones válidas y se todas las configuraciones válidas y se desechan las ramas cuyo color de la desechan las ramas cuyo color de la provincia a colorear coincida con uno de provincia a colorear coincida con uno de sus provincias fronterizas.sus provincias fronterizas.
6
II. Implementación en II. Implementación en árbolárbol
Al final, para mostrar todas las Al final, para mostrar todas las posibles soluciones, se utilizaría el posibles soluciones, se utilizaría el algoritmo de búsqueda que más algoritmo de búsqueda que más convenga, como amplitud, convenga, como amplitud, profundidad, de coste, incluso se profundidad, de coste, incluso se podría utilizar algún heurístico para podría utilizar algún heurístico para saber si una rama determinada saber si una rama determinada llegará a una solución y no tendrá llegará a una solución y no tendrá poda.poda.
7
II. Implementación en II. Implementación en árbolárbol
8
III. Implementación en III. Implementación en listas Estructuras de datoslistas Estructuras de datos
Estructuras de datos para definir los Estructuras de datos para definir los colores, las provincias, la estructura de colores, las provincias, la estructura de salida y las fronteras de las provinciassalida y las fronteras de las provincias data Color = Rojo|Verde|Azul data Color = Rojo|Verde|Azul data Provincia = Almeria|Cadiz|Cordoba|data Provincia = Almeria|Cadiz|Cordoba|
Granada|Jaen|Huelva| Malaga|SevillaGranada|Jaen|Huelva| Malaga|Sevilla type ProvColor = [(Provincia,Color)]type ProvColor = [(Provincia,Color)] type Frontera = Provincia -> [Provincia]type Frontera = Provincia -> [Provincia]
El mapa está definido por una lista de El mapa está definido por una lista de provincias y las fronteras de éstasprovincias y las fronteras de éstas data Mapa = Atlas [Provincia] Fronteradata Mapa = Atlas [Provincia] Frontera
9
III. Implementación en III. Implementación en listas Ejemplolistas Ejemplo
lProvincia=[Almeria .. Sevilla]lProvincia=[Almeria .. Sevilla] lColores=[Rojo .. Azul]lColores=[Rojo .. Azul] frontera p = case p offrontera p = case p of
Almeria -> [Granada]Almeria -> [Granada]Cadiz -> [Huelva,Sevilla,Malaga]Cadiz -> [Huelva,Sevilla,Malaga]Cordoba -> [Sevilla,Malaga,Jaen,Granada]Cordoba -> [Sevilla,Malaga,Jaen,Granada]Granada -> [Malaga,Cordoba,Jaen,Almeria]Granada -> [Malaga,Cordoba,Jaen,Almeria]Jaen -> [Cordoba,Granada]Jaen -> [Cordoba,Granada]Huelva -> [Cadiz,Sevilla]Huelva -> [Cadiz,Sevilla]Malaga -> [Cadiz,Sevilla,Cordoba,Granada]Malaga -> [Cadiz,Sevilla,Cordoba,Granada]Sevilla -> [Huelva,Cadiz,Malaga,Cordoba]Sevilla -> [Huelva,Cadiz,Malaga,Cordoba]
andalucia = Atlas lProvincia fronteraandalucia = Atlas lProvincia frontera
10
III. Implementación en III. Implementación en listaslistas
FuncionesFunciones Función que devuelve los colores de las provincias que son Función que devuelve los colores de las provincias que son
fronteras de la provincia "prov"fronteras de la provincia "prov"colorDeFronteras :: Provincia -> ProvColor -> Frontera -> colorDeFronteras :: Provincia -> ProvColor -> Frontera -> [Color][Color]colorDeFronteras prov provCol f = [col'|let frontsDeProv = f colorDeFronteras prov provCol f = [col'|let frontsDeProv = f prov, (prov',col')<- provCol, elem prov' frontsDeProv]prov, (prov',col')<- provCol, elem prov' frontsDeProv]
Colorea un mapa a partir de una lista de colores dada. Una Colorea un mapa a partir de una lista de colores dada. Una vez obtenida el coloreado del resto de provincias, se miran vez obtenida el coloreado del resto de provincias, se miran que colores no son permitidos, ya que los utiliza la provincia que colores no son permitidos, ya que los utiliza la provincia que es anexa a "prov", y se escogen el resto de colores que es anexa a "prov", y se escogen el resto de colores permitidospermitidoscolorearMapa :: Mapa -> [Color] -> [ProvColor]colorearMapa :: Mapa -> [Color] -> [ProvColor]colorearMapa (Atlas [] _) colores = [[]]colorearMapa (Atlas [] _) colores = [[]]colorearMapa (Atlas (prov:restoprov) f) colores = colorearMapa (Atlas (prov:restoprov) f) colores =
[(prov,color):restoMapa | [(prov,color):restoMapa | restoMapa <- colorearMapa (Atlas restoprov f) colores, restoMapa <- colorearMapa (Atlas restoprov f) colores, let coloresNoP = colorDeFronteras prov restoMapa f, let coloresNoP = colorDeFronteras prov restoMapa f, color <- diff colores coloresNoP]color <- diff colores coloresNoP]
11
III. Implementación en III. Implementación en listaslistas
FuncionesFunciones Función que devuelve True si el mapa Función que devuelve True si el mapa
coloreado es correctocoloreado es correctosolucionBuena:: ProvColor -> Frontera -> BoolsolucionBuena:: ProvColor -> Frontera -> BoolsolucionBuena xs f = solaux xs xs fsolucionBuena xs f = solaux xs xs f
solaux:: ProvColor -> ProvColor -> Frontera -> solaux:: ProvColor -> ProvColor -> Frontera -> BoolBool
solaux [] _ _ = Truesolaux [] _ _ = Truesolaux ((prov,col):resto) provcol fsolaux ((prov,col):resto) provcol f
|elem col (colorDeFronteras prov provcol f) = |elem col (colorDeFronteras prov provcol f) = FalseFalse|otherwise = solaux resto provcol f |otherwise = solaux resto provcol f
12
III. Implementación en III. Implementación en listaslistas
SoluciónSolución head(colorearMapa andalucia head(colorearMapa andalucia
lColores)lColores)
[(Almeria,Verde),(Cadiz,Azul),[(Almeria,Verde),(Cadiz,Azul),(Cordoba,Azul),(Granada,Rojo),(Cordoba,Azul),(Granada,Rojo),(Jaen,Verde),(Huelva,Verde),(Jaen,Verde),(Huelva,Verde),(Malaga,Verde),(Sevilla,Rojo)](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 problemaDefinición del problema
El puzzle consiste en colocar una lista El puzzle consiste en colocar una lista de de NN piezas del famoso juego del piezas del famoso juego del dominó en un tablero cuadrado de dominó en un tablero cuadrado de dimensiones dimensiones MxMMxM..
15
La La única restricciónúnica restricción que plantea este puzzle que plantea este puzzle para colocar las piezas, es que la para colocar las piezas, es que la sumasuma de los de los valores de cada valores de cada filafila y cada y cada columnacolumna sea la sea la mismamisma para todas. para todas.
19
19
19
19
19 19 19 19
16
Estrategias de búsquedaEstrategias de búsqueda
Existen principalmente dos Existen principalmente dos estrategias a seguir para encontrar estrategias a seguir para encontrar las soluciones a este problema:las soluciones a este problema: Usar una búsqueda en grafosUsar una búsqueda en grafos Método de generación/pruebaMétodo de generación/prueba
17
Búsqueda en GrafosBúsqueda en Grafos
Para la estrategia de búsqueda en grafos, Para la estrategia de búsqueda en grafos, obtendríamos el camino de ir de un nodo obtendríamos el camino de ir de un nodo inicial, que representa el tablero vacío, inicial, que representa el tablero vacío, hasta aquél que tenga colocadas todas las hasta aquél que tenga colocadas todas las piezas, y satisfaga las restricciones del piezas, y satisfaga las restricciones del problema.problema.
La función ‘La función ‘sucsuc’, que genera los ’, que genera los sucesores de un nodo, devolvería sucesores de un nodo, devolvería aquellos tableros, resultado de aquellos tableros, resultado de colocar cada una de las piezas colocar cada una de las piezas restantes en un hueco dadorestantes en un hueco dado
18
Ejemplo de la primera Ejemplo de la primera generación de sucesoresgeneración de sucesores
..
.
19
Estrategia basada en Estrategia basada en generación/prueba (I)generación/prueba (I)
La estrategia basada en La estrategia basada en generación/pruebageneración/prueba es sustancialmente es sustancialmente distinta de la búsqueda en grafos.distinta de la búsqueda en grafos.
Con éste método, la finalidad es Con éste método, la finalidad es generar todas aquellas posibles generar todas aquellas posibles combinaciones de los elementos que combinaciones de los elementos que forman el problema, y comprobar forman el problema, y comprobar que cumplen las restricciones que que cumplen las restricciones que imponen.imponen.
20
Estrategia basada en Estrategia basada en generación/prueba (II)generación/prueba (II)
En el caso de nuestro En el caso de nuestro cuadrado mágicocuadrado mágico, , se trata de generar todas las formas se trata de generar todas las formas posibles de colocar las piezas de dominó posibles de colocar las piezas de dominó sobre el tablero, y seleccionar aquéllas sobre el tablero, y seleccionar aquéllas que cumplan la restricción:que cumplan la restricción:
Para cada fila ‘i’, Σ tab(i)(j) = K1Para cada columna ‘j’, Σ tab(i)(j) = K2
K1 = K2
21
Implementación en Implementación en Haskell (I)Haskell (I)
Se ha optado por desarrollar para este Se ha optado por desarrollar para este problema la segunda solución: problema la segunda solución: generación/pruebageneración/prueba..
Para implementar esta estrategia en Para implementar esta estrategia en Haskell, hemos usado listas por Haskell, hemos usado listas por comprensión, de manera que una comprensión, de manera que una función se encarga de generar todas función se encarga de generar todas las combinaciones posibles de las combinaciones posibles de tableros, y otra actúa como condición tableros, y otra actúa como condición de filtro.de filtro.
22
Implementación en Implementación en Haskell (II)Haskell (II)
La sentencia queda de la siguiente forma:La sentencia queda de la siguiente forma:cuadrados_magicos x = [s | s <- posibles x, valida cuadrados_magicos x = [s | s <- posibles x, valida
s]s]..
En este ejemplo, la función ‘En este ejemplo, la función ‘posiblesposibles’ genera una ’ genera una lista enorme de candidatos: lista enorme de candidatos: (más de 160.000)(más de 160.000)
...
23
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
24
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
25
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
26
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
27
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
28
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
29
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
30
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
31
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
32
Implementación en Implementación en Haskell (II)Haskell (II)
Y la función que filtra, elimina los Y la función que filtra, elimina los que no cumplen las restricciones:que no cumplen las restricciones:
33
Implementación en Implementación en Haskell (III)Haskell (III)
Las dos funciones principales son:Las dos funciones principales son: posibles :: [(Int, Int)] -> Int -> Int -> [Tablero]posibles :: [(Int, Int)] -> Int -> Int -> [Tablero]
Recibe una lista de fichas y devuelve una lista de Recibe una lista de fichas y devuelve una lista de tablerostableros
valida :: Tablero -> Boolvalida :: Tablero -> Bool Recibe un tablero y comprueba si cumple la Recibe un tablero y comprueba si cumple la
restricciónrestricció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 función ‘posibles’
La definición de la función ‘posibles’ en el La definición de la función ‘posibles’ en el código del programa queda como sigue: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 función ‘valida’
La definición de la función ‘valida’ en el La definición de la función ‘valida’ en el código del programa queda como sigue: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 conclusionesAlgunas conclusiones El uso de listas por comprensión facilita El uso de listas por comprensión facilita
bastante la definición de la solución.bastante la definición de la solución. Por el contrario, la implementación de Por el contrario, la implementación de
la solución del problema de puzzles la solución del problema de puzzles mágicos mediante esta estrategia mágicos mediante esta estrategia presenta una presenta una elevada carga elevada carga computacionalcomputacional, dado el orden de , dado el orden de magnitud de la función ‘magnitud de la función ‘posiblesposibles’.’.
Probado para Probado para 8 fichas8 fichas, en un equipo a , en un equipo a una frecuencia de una frecuencia de 2,4 GHz2,4 GHz, el tiempo , el tiempo consumido en mostrar todas las consumido en mostrar todas las soluciones fue de soluciones fue de 40 minutos 40 minutos aprox.aprox.
Recommended