programación declarativa avanzada resolución de puzzles

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

Upload: nira

Post on 08-Jan-2016

47 views

Category:

Documents


0 download

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

TRANSCRIPT

Page 1: Programación Declarativa Avanzada Resolución De Puzzles

1

Programación Declarativa Avanzada

Resolución

De Puzzles

Vicente Andrade Alcántara

Miguel Ángel Sánchez González

Page 2: Programación Declarativa Avanzada Resolución De Puzzles

2

Programación Declarativa Avanzada

Puzzle:

Coloreado de Mapas

Vicente Andrade Alcántara

Miguel Ángel Sánchez González

Page 3: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 4: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 5: Programación Declarativa Avanzada Resolución De Puzzles

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.

Page 6: Programación Declarativa Avanzada Resolución De Puzzles

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.

Page 7: Programación Declarativa Avanzada Resolución De Puzzles

7

II. Implementación en II. Implementación en árbolárbol

Page 8: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 9: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 10: Programación Declarativa Avanzada Resolución De Puzzles

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]

Page 11: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 12: Programación Declarativa Avanzada Resolución De Puzzles

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)]

Page 13: Programación Declarativa Avanzada Resolución De Puzzles

13

Programación Declarativa Avanzada

Puzzle:

Cuadrados mágicos con fichas de dominó

Vicente Andrade Alcántara

Miguel Ángel Sánchez González

Page 14: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 15: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 16: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 17: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 18: Programación Declarativa Avanzada Resolución De Puzzles

18

Ejemplo de la primera Ejemplo de la primera generación de sucesoresgeneración de sucesores

..

.

Page 19: Programación Declarativa Avanzada Resolución De Puzzles

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.

Page 20: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 21: Programación Declarativa Avanzada Resolución De Puzzles

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.

Page 22: Programación Declarativa Avanzada Resolución De Puzzles

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)

...

Page 23: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 24: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 25: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 26: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 27: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 28: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 29: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 30: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 31: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 32: Programación Declarativa Avanzada Resolución De Puzzles

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:

Page 33: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 34: Programación Declarativa Avanzada Resolución De Puzzles

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

Page 35: Programación Declarativa Avanzada Resolución De Puzzles

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)

Page 36: Programación Declarativa Avanzada Resolución De Puzzles

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.