La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "1 Programación Declarativa Avanzada Resolución De Puzzles Vicente Andrade Alcántara Miguel Ángel Sánchez González."— Transcripción de la presentación:

1

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

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

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

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

6 5 II. Implementación en árbol Este puzzle se podía realizar mediante un árbol que generara todas las posibles soluciones. 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. 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.

7 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. 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.

8 7 II. Implementación en árbol

9 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 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 Color = Rojo|Verde|Azul data Provincia = Almeria|Cadiz|Cordoba|Granada|Jaen|Huelva| Malaga|Sevilla data Provincia = Almeria|Cadiz|Cordoba|Granada|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 provincias y las fronteras de éstas El mapa está definido por una lista de provincias y las fronteras de éstas data Mapa = Atlas [Provincia] Frontera data Mapa = Atlas [Provincia] Frontera

10 9 III. Implementación en listas Ejemplo lProvincia=[Almeria.. Sevilla] lProvincia=[Almeria.. Sevilla] lColores=[Rojo.. Azul] lColores=[Rojo.. Azul] frontera p = case p of 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 andalucia = Atlas lProvincia frontera

11 10 III. Implementación en listas Funciones Función que devuelve los colores de las provincias que son fronteras de la provincia "prov" 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 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]

12 11 III. Implementación en listas Funciones Función que devuelve True si el mapa coloreado es correcto 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

13 12 III. Implementación en listas Solución head(colorearMapa andalucia lColores) head(colorearMapa andalucia lColores) [(Almeria,Verde),(Cadiz,Azul),(Cordoba,Azul),(Gra nada,Rojo),(Jaen,Verde),(Huelva,Verde),(Malaga, Verde),(Sevilla,Rojo)]

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

15 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. El puzzle consiste en colocar una lista de N piezas del famoso juego del dominó en un tablero cuadrado de dimensiones MxM.

16 15 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. 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. 19

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

18 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. 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 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

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

20 19 Estrategia basada en generación/prueba (I) La estrategia basada en generación/prueba es sustancialmente distinta de la búsqueda en grafos. 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. 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.

21 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: 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

22 21 Implementación en Haskell (I) Se ha optado por desarrollar para este problema la segunda solución: generación/prueba. 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. 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.

23 22 Implementación en Haskell (II) La sentencia queda de la siguiente forma: 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)...

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

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

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

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

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

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

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

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

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

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

34 33 Implementación en 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 tableros Recibe una lista de fichas y devuelve una lista de tableros valida :: Tablero -> Bool valida :: Tablero -> Bool Recibe un tablero y comprueba si cumple la restricción 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 ] ]

35 34 La función ‘posibles’ La definición de la función ‘posibles’ en el código del programa queda como sigue: 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))))

36 35 La función ‘valida’ La definición de la función ‘valida’ en el código del programa queda como sigue: 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)

37 36 Algunas conclusiones El uso de listas por comprensión facilita bastante la definición de la solución. 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’. 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. 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.


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

Presentaciones similares


Anuncios Google