13/07/2013
Contenido
13/07/2013
Introduccin
http://www-cs-faculty.stanford.edu/~uno/
13/07/2013
Descripcin
Algoritmo para encontrar todas las soluciones al problema del recubrimiento (exact cover problem).
13/07/2013
Filosofa
La siguiente matriz representa un problema de recubrimiento donde el objetivo es elegir un subconjunto de filas de forma que el dgito 1 aparezca en cada columna una sola vez.
Programacin Declarativa Avanzada
13/07/2013
Filosofa
Elegir una columna c de forma una columna sin determinista. 1s De forma hacemos indeterminista escoger una backtrack y fila f que tenga un 1 en la columna c, y aadir r la al conjunto descartamos fila solucin. Eliminar cualquier elegida.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 vaca.
Programacin Declarativa Avanzada
13/07/2013
Filosofa
La solucin se obtiene cuando llegamos a la matriz vaca. Los elementos representados por las filas seleccionadas constituyen el conjunto solucin. Knuth sugiere el siguiente heurstico para reducir el nmero de iteraciones:
13/07/2013
Ejemplo (pizarra)
La siguiente matriz surge como resultado de modelar un determinado problema de recubrimiento.
13/07/2013
Implementacin
Dancing Links (DLX) es la tcnica 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 coreografa.
Programacin Declarativa Avanzada 9
13/07/2013
Implementacin
x.left.right <- x.right; x.right.left <- x.left; x.left.right <- x; x.right.left <- x;
(borrar nodo x)
(restaurar nodo x)
13/07/2013
10
Implementacin
Estructura de datos
13/07/2013
11
Implementacin
13/07/2013
12
Implementacin
13/07/2013
13
Implementacin
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.
13/07/2013
14
Aplicaciones
Sudoku (2006)
13/07/2013
15
Sudoku
En la matriz DLX, las filas representan los posibles movimientos y las columnas las restricciones que una solucin vlida 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 dgito 2 en la celda[5,7] Puesto que hay 9 dgitos y 9x9 celdas, tenemos un total de 9x81=729 filas.
Programacin Declarativa Avanzada 16
13/07/2013
Sudoku
celda debe tener un nico dgito: <r,c> dgito debe aparecer una vez en una fila: <d,r> dgito debe aparecer una vez en una columna: <d,c> dgito debe aparecer una vez en una caja: <d,b>
Ejemplo del tipo 1: la restriccin <5,7> significa que la celda [5,7] tiene un nico dgito. La columna para esta restriccin tiene un 1 en las filas <1,5,7><9,5,7> y un 0 en el resto. La solucin DLX seleccionar slo una de estas filas. Existen 9x9 restricciones de cada tipo. Por tanto, tenemos 4x81=324 columnas
Programacin Declarativa Avanzada
13/07/2013
17
Sudoku
Cada fila contiene slo cuatro 1s, el resto son ceros. Cada columna contiene slo nueve 1s, el resto son ceros. De aqu la importancia de guardar solamente los nodos con un 1.
Programacin Declarativa Avanzada
13/07/2013
18
Sudoku
13/07/2013
19
Bibliografa
Donald E. Knuth, Standford University, Dancing Links. Ao 2000 http://en.wikipedia.org Bertram Felgenhauer, Frazer Jarvis, Enumerating possible Sudoku grids. Ao 2005
http://www-cs-faculty.stanford.edu/~knuth/index.html
http://www.jalat.com/blogs/lisp?id=4
http://www.codigoescrito.com/archivos/000194.html
http://www.puzzle.jp/en/
13/07/2013
20