Este documento presenta la solución al problema de las 8 reinas mediante un algoritmo de backtracking en Prolog. El problema consiste en colocar 8 reinas en un tablero de ajedrez de modo que ninguna pueda amenazar a otra ya sea estando en la misma fila, columna o diagonal. Se explica el marco teórico, el planteamiento del problema, la solución utilizando backtracking, el pseudocódigo y explicación del código en Prolog, así como las conclusiones y referencias.
3. Dedicatoria
El presente trabajo titulado “El Problema de las 8 Reinas” esta dedicado a todas aquellas
personas interesadas en aprender acerca de este algoritmo. El cual es un tema muy interesante
que utiliza la lógica y nos ayuda a desarrollar nuestra capacidad de razonamiento.
Esta dedicado a todos los estudiantes y en especial a aquellos que estudien la materia
Programación Lógica, pues podrán obtener información valiosa que les ayudará a tener una
mayor comprensión y a saber un poco más acerca de este interesante tema.
También esta dedicado a nuestro profesor de curso, quien nos dio las debidas orientaciones y
nociones básicas del curso, para poder hallar la solución apropiada a dicho problema.
4. Introducción
Los problemas que no tienen solución determinista que se ejecutan en tiempo polinomial se
denominan problemas de tipo NP. Debido a su elevada complejidad (O(2^n) o O(n!)), deben ser
resueltas en una cantidad de tiempo razonable empleando métodos heurísticos.
El problema fue originalmente propuesto en 1848 por el ajedrecista Max Bezzel, y durante los
años, muchos matemáticos, incluyendo a Gauss y a Georg Cantor, han trabajado en este
problema y lo han generalizado a n-reinas. Las primeras soluciones fueron ofrecidas por Franz
Nauck en 1850. Nauck también se abocó a las n-reinas (en un tablero de nxn de tamaño
arbitrario). En 1874, S. Günther propuso un método para hallar las soluciones usando
determinantes, y J.W.L. Glaisher redefinió su aproximación.
Edsger Dijkstra usó este problema en 1972 para ilustrar el poder de la llamada programación
estructurada. Él publicó una descripción altamente detallada del desarrollo del algoritmo de
backtracking, "depth-first".
Este acertijo apareció en el popular juego de computadora de los '90 llamado "The 7th Guest".
Consiste en la manera de situar 8 reinas en un tablero de ajedrez, sin que puedan "amenazarse",
es decir, que ninguna esté en la misma fila, columna o diagonal que la otra.
Es interesante estudiar esta problemática que ha sido resuelta de varias maneras, pero siempre
con una premisa por delante, usar una estrategia heurística para resolverla. La fórmula más
común consiste en el Backtracking. Este procedimiento consiste en ir ubicando las piezas
recordando la posición de las anteriores. Si por algún motivo una no puede ser ubicada, volver
hacia movimientos anteriores para seguir tratando por otro camino.
5. El Problema de las 8 Reinas
Marco Teórico
Capitulo I Planteamiento del problema
El problema original de ocho reinas es intentar encontrar un forma de colocar a ocho reinas en un
tablero de ajedrez de modo que no se vean amenazadas una a la otra. Es decir que un tablero de
8x8, ninguna de las reinas comparta un fila, columna o diagonal debido a que cada reina puede
amenazar a todas las reinas que estén en la misma fila, columna o diagonal.
Existen 92 soluciones a este problema, de las cuales 12 tienen un patrón distinto. Cada una de
las 92 soluciones puede ser transformada en una de estos 12 patrones, utilizando rotaciones y
reflexiones.
En el ajedrez, la reina puede moverse en la medida de lo que le plazca, en horizontal, vertical o
diagonal. Un tablero de ajedrez tiene 8 filas y 8 columnas. El estándar del problema Reina 8x8 le
pregunta cómo colocar 8 reinas en un tablero de ajedrez ordinario de manera que ninguno de
ellos puede tocar cualquier otra en un movimiento.
Podemos representar las 8 reinas mediante un vector[1-8], teniendo en cuenta que cada índice
del vector representa una fila y el valor una columna. Así cada reina estaría en la posición (i,
v[i]) para i = 1-8.
Capítulo II Solución con búsqueda con retroceso Backtracking
El paradigma Backtracking es un método más eficiente que el paradigma de generación y prueba.
Consiste en que las variables se instancian secuencialmente y tan pronto como las variables
relevantes a una restricción están instanciadas, se comprueba la validez de esa restricción. Si una
instanciación parcial viola una restricción, se hace marcha atrás (backtracking) reconsiderando la
última decisión tomada en el proceso de búsqueda, es decir, la variable que se ha instanciado más
recientemente y que aún dispone de valores alternativos disponibles, se instancia a otro valor
posible.
6. El paradigma backtracking es capaz de eliminar un subespacio de todos los valores del producto
cartesiano de los dominios de las variables. Aun así tiene un coste exponencial.
La principal causa de ineficiencia del paradigma de backtracking es que la búsqueda en diferentes
partes del espacio falla debido al nodo-inconsistencia. El nodo-inconsistencia se da cuando un valor
de un dominio de una variable no satisface la restricción unaria de la variable, con lo cual la
instanciación de esa variable a ese valor siempre resulta en un fallo inmediato. El nodo-consistencia
puede conseguirse eliminando los valores del dominio de la variable que no satisfagan la restricción
unaria.
Un estado puede dividirse en otros estados fijando otro elemento de la tupla, generando un proceso
de ramificación que parte de un estado inicial y que induce el árbol de estados.
El estado inicial es la raíz del árbol de estados y contiene implícitamente todo el espacio de
soluciones.
Si el árbol de estados tiene un n´umero elevado de nodos, ser´a imposible construirlo
explícitamente antes de aplicar una de las técnicas de recorrido. Se puede utilizar un “árbol
implícito”, en el sentido de que se van construyendo sus parte relevantes a medida que avanza el
proceso de recorrido.
7. Capítulo III Pseudocódigo del algoritmo y explicación del código(PROLOG)
Sabemos que el problema consiste en ubicar las reinas en el tablero de ajedrez de manera que
ningún par de ellas se amenace.Necesitamos una representación para la solución, usaremos
una lista de la siguiente forma:
donde el par [i,Yi] representan las coordenadas de la reina i en el tablero, claramente no puede
haber más de una reina por columna.
El siguiente predicado genera/1 genera las distintas configuraciones del tablero.
Ahora necesitamos un predicado para determinar si una configuración es tal que las reinas no
se ataquen, lo hacemos verificando la lista por partes de izquierda a derecha
Esta regla establece que en la configuración las reinas no se atacan si la primera reina
no ataca a las restantes (no ataca(X,L)) y las restantes no se atacan. El caso base es
una configuración vacía.
Ahora generamos y comprobamos
Esto da solución al problema, pero no es muy eficiente, de hecho comprobamos en PROLOG
el tiempo de ejecución.
8. Entonces como hay muchas configuraciones que estamos generando sabemos q las reinas
siempre están en distintas filas entonces podemos descartar a priori modificando el predicado
genera/1.
Ahora medimos el tiempo en la misma máquina.
206 veces más rápido, 99.515% del tiempo anterior.
Calculamos la cantidad de soluciones que deberían ser 92 por lo antes mencionado con el
siguiente predicado cantidadSol/1.
9. Capítulo IV Código
Conclusiones
❏ El problema de las 8 Reinas es un problema NP-completo que se puede también ser para
una cantidad mayor de reinas N reinas a partir de N = 4 en un tablero de NxN.
❏ El problema puede ser resuelto con algoritmos de backtracking o vuelta atrás, de forma
que recorra el árbol en búsqueda en anchura.
❏ Se soluciona el algoritmo con el lenguaje de programación Prolog, usando la
programación lógica
Referencias Linkográficas
● http://psmheuristica.webnode.com.ve/ejemplos-didacticos/ocho-reinas/
● http://www.it.uc3m.es/jvillena/irc/practicas/06-07/06.pdf
● http://users.dsic.upv.es/~rparedes/teaching/t7eda.pdf
● http://dis.um.es/~domingo/apuntes/AlgProPar/0809/reinas.pdf
● http://iiuji.googlecode.com/hg/Prolog/Tema8.pdf