Anda di halaman 1dari 20

El algoritmo X

Antonio Jess Roa Valverde

13/07/2013

Programacin Declarativa Avanzada

Contenido

Introduccin Descripcin Filosofa Implementacin va Dancing Links Aplicaciones Bibliografa


Programacin Declarativa Avanzada 2

13/07/2013

Introduccin

Debido a Donald Knuth (ao 2000)

http://www-cs-faculty.stanford.edu/~uno/

Algoritmo de bsqueda para problemas de recubrimiento como N-reinas, sudoku,

13/07/2013

Programacin Declarativa Avanzada

Descripcin

Algoritmo para encontrar todas las soluciones al problema del recubrimiento (exact cover problem).

Recursivo No determinista Primero en profundidad Fuerza bruta

13/07/2013

Programacin Declarativa Avanzada

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

El funcionamiento es el siguiente: OJO: Si al iterar aparece


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:

Elegir primero aquella columna que presenta menor nmero de 1s


Programacin Declarativa Avanzada 7

13/07/2013

Ejemplo (pizarra)
La siguiente matriz surge como resultado de modelar un determinado problema de recubrimiento.

13/07/2013

Programacin Declarativa Avanzada

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

DLX se basa en que en una lista circular doblemente enlazada:

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

Programacin Declarativa Avanzada

10

Implementacin

Estructura de datos

13/07/2013

Programacin Declarativa Avanzada

11

Implementacin

13/07/2013

Programacin Declarativa Avanzada

12

Implementacin

13/07/2013

Programacin Declarativa Avanzada

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

Programacin Declarativa Avanzada

14

Aplicaciones

Sudoku (2006)

13/07/2013

Programacin Declarativa Avanzada

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

Existen 4 tipos de restricciones:


Cada Cada Cada Cada

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

La matriz DLX tiene dimensin 729x324

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

Solucin C Solucin Lisp

13/07/2013

Programacin Declarativa Avanzada

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

Pgina de Donald E. Knuth

http://www.codigoescrito.com/archivos/000194.html

Solucin Sudoku en Lisp Solucin Sudoku en C

http://www.puzzle.jp/en/

Pgina donde se muestran otros posibles puzzles


Programacin Declarativa Avanzada

13/07/2013

20

Anda mungkin juga menyukai