La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Antonio Jesús Roa Valverde

Presentaciones similares


Presentación del tema: "Antonio Jesús Roa Valverde"— Transcripción de la presentación:

1 Antonio Jesús Roa Valverde
El algoritmo X Antonio Jesús Roa Valverde 21/11/2018 Programación Declarativa Avanzada

2 Programación Declarativa Avanzada
Contenido Introducción Descripción Filosofía Implementación vía “Dancing Links” Aplicaciones Bibliografía 21/11/2018 Programación Declarativa Avanzada

3 Programación Declarativa Avanzada
Introducción Debido a Donald Knuth (año 2000) Algoritmo de búsqueda para problemas de recubrimiento como N-reinas, sudoku, … 21/11/2018 Programación Declarativa Avanzada

4 Programación Declarativa Avanzada
Descripción Algoritmo para encontrar todas las soluciones al problema del recubrimiento (exact cover problem). Recursivo No determinista Primero en profundidad Fuerza bruta 21/11/2018 Programación Declarativa Avanzada

5 Programación Declarativa Avanzada
Filosofía La siguiente matriz representa un problema de recubrimiento donde el objetivo es elegir un subconjunto de filas de forma que el dígito 1 aparezca en cada columna una sola vez. 21/11/2018 Programación Declarativa Avanzada

6 Programación Declarativa Avanzada
Filosofía El funcionamiento es el siguiente: Elegir una columna c de forma determinista. De forma indeterminista escoger una fila f que tenga un 1 en la columna c, y añadir r al conjunto solución. Eliminar cualquier fila no seleccionada que tenga un 1 en cualquier columna en la que r tenga un 1. Eliminar de la matriz cualquier columna para la que r tenga un 1. Repetir el algoritmo sobre la matriz reducida hasta que quede vacía. OJO: Si al iterar aparece una columna sin 1’s hacemos backtrack y descartamos la fila elegida. 21/11/2018 Programación Declarativa Avanzada

7 Programación Declarativa Avanzada
Filosofía La solución se obtiene cuando llegamos a la matriz vacía. Los elementos representados por las filas seleccionadas constituyen el conjunto solución. Knuth sugiere el siguiente heurístico para reducir el número de iteraciones: Elegir primero aquella columna que presenta menor número de 1’s 21/11/2018 Programación Declarativa Avanzada

8 Programación Declarativa Avanzada
Ejemplo (pizarra) La siguiente matriz surge como resultado de modelar un determinado problema de recubrimiento. 21/11/2018 Programación Declarativa Avanzada

9 Programación Declarativa Avanzada
Implementación Dancing Links (DLX) es la técnica propuesta por Knuth para implementar su algoritmo X usando listas circulares doblemente enlazadas. El nombre viene por la forma en que trabaja el algoritmo: las operaciones entre punteros recuerda a los pasos de baile de una coreografía. 21/11/2018 Programación Declarativa Avanzada

10 Programación Declarativa Avanzada
Implementación DLX se basa en que en una lista circular doblemente enlazada: x.left.right <- x.right; x.right.left <- x.left; (borrar nodo x) x.left.right <- x; x.right.left <- x; (restaurar nodo x) 21/11/2018 Programación Declarativa Avanzada

11 Programación Declarativa Avanzada
Implementación Estructura de datos 21/11/2018 Programación Declarativa Avanzada

12 Programación Declarativa Avanzada
Implementación 21/11/2018 Programación Declarativa Avanzada

13 Programación Declarativa Avanzada
Implementación 21/11/2018 Programación Declarativa Avanzada

14 Programación Declarativa Avanzada
Implementación Los nodos realmente no se eliminan de la estructura. Este mecanismo es lo que permite realizar el backtrack. OJO: Cuidado con el recolector de basura en determinados lenguajes. 21/11/2018 Programación Declarativa Avanzada

15 Programación Declarativa Avanzada
Aplicaciones Sudoku (2006) 21/11/2018 Programación Declarativa Avanzada

16 Programación Declarativa Avanzada
Sudoku En la matriz DLX, las filas representan los posibles movimientos y las columnas las restricciones que una solución válida debe satisfacer. Cada fila puede ser etiquetada como <d,r,c>, donde d,r,c toman valores entre 1 y 9. <2,5,7> Colocar el dígito 2 en la celda[5,7] Puesto que hay 9 dígitos y 9x9 celdas, tenemos un total de 9x81=729 filas. 21/11/2018 Programación Declarativa Avanzada

17 Programación Declarativa Avanzada
Sudoku Existen 4 tipos de restricciones: Cada celda debe tener un único dígito: <r,c> Cada dígito debe aparecer una vez en una fila: <d,r> Cada dígito debe aparecer una vez en una columna: <d,c> Cada dígito debe aparecer una vez en una caja: <d,b> Ejemplo del tipo 1: la restricción <5,7> significa que la celda [5,7] tiene un único dígito. La columna para esta restricción tiene un 1 en las filas <1,5,7>…<9,5,7> y un 0 en el resto. La solución DLX seleccionará sólo una de estas filas. Existen 9x9 restricciones de cada tipo. Por tanto, tenemos 4x81=324 columnas 21/11/2018 Programación Declarativa Avanzada

18 Programación Declarativa Avanzada
Sudoku La matriz DLX tiene dimensión 729x324 Cada fila contiene sólo cuatro 1’s, el resto son ceros. Cada columna contiene sólo nueve 1’s, el resto son ceros. De aquí la importancia de guardar solamente los nodos con un 1. 21/11/2018 Programación Declarativa Avanzada

19 Programación Declarativa Avanzada
Sudoku Solución C Solución Lisp 21/11/2018 Programación Declarativa Avanzada

20 Programación Declarativa Avanzada
Bibliografía Donald E. Knuth, Standford University, “Dancing Links”. Año 2000 Bertram Felgenhauer, Frazer Jarvis, “Enumerating possible Sudoku grids”. Año 2005 Página de Donald E. Knuth Solución Sudoku en Lisp Solución Sudoku en C Página donde se muestran otros posibles puzzles 21/11/2018 Programación Declarativa Avanzada


Descargar ppt "Antonio Jesús Roa Valverde"

Presentaciones similares


Anuncios Google