POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
8 reinas
1. ESCUELA DE INGENIERÍA INFORMÁTICA
INFORME
DEL PROYECTO DE:
PROGRAMACION LOGICA
PROYECTO ACADÉMICO:
“Problema del juego de las 8 Reinas e Implementación en Swi Prolog”.
Estudiante(s):
Zuñiga Joaquin, Cesar
Docente:
Ing. Arturo Díaz Pulido
Ciclo Académico:
VII ciclo
ESCUELA DE I NFORMÁTI CA
2014-I
Trujillo – Perú
2. Índice
Dedicatoria ................................................................................................................................. 3
Introducción ............................................................................................................................... 4
1. Capítulo I: Marco Teórico ............................................................................................... 5
1.1 Realidad Problemática.............................................................................................. 5
2. Capítulo II: Conceptos..................................................................................................... 5
2.1 Backtracking.............................................................................................................. 5
2.2 Búsqueda en Profundidad ........................................................................................ 6
2.2.1 Definición................................................................................................... 6
2.3 Problema de las 8 reinas............................................................................................. 7
2.3.1 Definición................................................................................................... 7
2.3.2 Historia....................................................................................................... 8
2.3.3 Planteamiento del Problema ..................................................................... 8
2.3.4 Algoritmo ................................................................................................... 9
2.4 Programa en Prolog .................................................................................................. 9
Conclusiones............................................................................................................................. 10
Referencias............................................................................................................................... 11
3. Ha Dios, quien ha permitido que la sabiduría dirija y guíe nuestros pasos.
Ha sido Dios, quien ha iluminado mi sendero cuando más oscuro ha estado, Ha sido el
creador de todas las cosas, el que me ha dado fortaleza para continuar cuando a punto de
caer he estado; por ello, con toda la humildad que de nuestro corazón puede emanar,
dedicamos en primer lugar este trabajo a Dios.
De igual manera, a nuestros padres, quienes han sabido formarnos con buenos
sentimientos, hábitos y valores, los cuales nos han ayudado a salir adelante buscando
siempre el mejor camino.
4. INTRODUCCION
El problemafue originalmente propuesto en 1848 por el ajedrecista Max Bezzel, y durante los años,
muchosmatemáticos,incluyendoaGaussy a Georg Cantor,han trabajadoeneste 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
propusoun métodopara hallar las soluciones usando determinantes, y J.W.L. Glaisher redefinió su
aproximación.
En pocas palabras, este problema trata sobre cómo se deberían ubicar 8 reinas en un tablero de
ajedrezde dimensión8de tal forma que ninguna amenace a la otra. Un requisito simple al ser leído
pero que hizo pensar a muchos matemáticos de aquella época como Gauss y Georg Cantor.
Los lenguajesde programaciónenlosque se haimplementadoesteproblema son distintos, pero en
esta monografía nos centraremos en el lenguaje Prolog (Programación Lógica), que con sus
conceptos de unificación y backtracking (vuelta atrás) hacen de la implementación de este
problema, algo mucho más sencillo.
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".
5. I. Capítulo 1: Marco Teórico
1.1. Realidad Problemática
El problema de las ocho reinas es un pasatiempo en el que se colocan ocho
reinas sin que se amenacen. En el juego del ajedrez la reina amenaza a aquellas
piezas que se encuentren en su misma fila, columna o diagonal. El juego de las 8
reinas consiste en colocar sobre un tablero de ajedrez ocho reinas sin que estas
se amenacen entre ellas.
Trataremos de mostrar con un ejemplo de forma general la importancia actual
que este tipo de paradigmas tiene. En concreto, el paradigma declarativo lógico y,
por supuesto, el lenguaje Prolog.
Prolog se puede utilizar para resolver, básicamente, cualquier tipo de problema.
Principalmente es útil en la gestión de Juegos, en Inteligencia Artificial y Sistemas
Expertos, como lenguaje especialmente pensado para construir bases de
conocimientos basados en la lógica que forman parte importante de cualquier
agente inteligente, en la construcción de Compiladores e Intérpretes, en el
Reconocimiento del Lenguaje Natural, etc.
II. Capítulo 2: Conceptos
2.1. Backtracking:
2.1.1. Definición:
También llamada búsqueda atrás, es una técnica de programación para hacer
búsqueda sistemática a través de todas las configuraciones posibles dentro
de un espacio de búsqueda.
Para lograr esto, los algoritmos de tipo backtracking construyen posibles
soluciones candidatas de manera sistemática. En general, dado una solución
candidata s:
a) Verifican si s es solución. Si lo es, se procesa esta solución
(dependiendo del problema).
b) Construyen todas las posibles extensiones de s, e invocan
recursivamente al algoritmo con todas ellas.
2.2. Búsqueda en Profundidad (Depth First Search).
2.2.1. Definición:
Una búsqueda en profundidad o Depth First Search en inglés es un algoritmo
que permite recorrer todos los nodos de un grafo o árbol de manera
ordenada pero no uniforme. Su funcionamiento consiste en ir expandiendo
todos y cada uno de los nodos que va localizando, de forma recurrente, en un
camino concreto. Cuando ya no quedan más nodos que visitar en dicho
6. camino, regresa (Backtracking), de modo que repite el mismo proceso con
cada uno de los hermanos del nodo ya procesado.
2.3. Problema de las 8 reinas.
2.3.1. Definición:
El problema de las ocho reinas es un pasatiempo propuesto por el ajedrecista
alemán Max Bezzel en 1848. En el juego de ajedrez la reina amenaza a
aquellas piezas que se encuentren en su misma fila, columna o diagonal.
El juego de las ocho reinas consiste en colocar sobre un tablero de ajedrez
ocho reinas sin que estas se amenacen entre ellas.
Para resolver este problema se necesita emplear el paradigma de
backtracking.
2.3.2. Historia
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.
2.3.3. Planteamiento del Problema
Como cada reina puede amenazar a todas las reinas que estén en la misma fila,
cada una ha de situarse en una fila diferente. 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.
Por ejemplo el vector (3, 1, 6, 2, 8, 6, 4, 7) significa que la reina 1 está en la
columna 3, fila1; la reina 2 en la columna 1, fila 2; la reina 3 en la columna 6,
fila 3; la reina 4 en la columna 2, fila 4; etc... Como se puede apreciar esta
solución es incorrecta ya que estarían la reina 3 y la 6 en la misma columna.
Por tanto el vector correspondería a una permutación de los ocho primeros
números enteros.
Un asunto importante que tenemos que tener en cuenta es cómo saber si dos
damas no se comen entre ellas diagonalmente. Para las posiciones sobre una
misma diagonal descendente se cumple que tienen el mismo valor (fila –
columna), mientras que para las posiciones en la misma diagonal ascendente
se cumple que tienen el mismo valor (fila + columna). Entonces, si tenemos
dos reinas colocadas en las posiciones (i, j) y (k, l) entonces están en la misma
diagonal si y sólo si cumple:
i – j == k – l ó i + j == k + l
j – l == i – k ó j – l = k – i
7. Teniendo en cuenta estas consideraciones, podemos aplicar un esquema
retroactivo para implementar las ocho reinas de una manera realmente
eficiente. Para ello, reformulamos el problema como un problema de
búsqueda en un árbol. Decimos que en un vector V1…k de enteros entre 1 y 8
es k-prometedor, para 0 <= k <= 8, si ninguna de las k reinas colocadas en las
posiciones (1, V1), (2, v2),…, (k, Vk) amenaza a ninguna de las otras. Las
soluciones a nuestro problema se corresponden con aquellos vectores que son
8-prometedores.
El problema de las ocho reinas tiene 92 soluciones, de las cuales 12
son esencialmente distintas, es decir las 92 soluciones existentes se pueden
obtener a partir de simetrías, rotaciones y traslaciones de las 12 soluciones
únicas, que se muestran a continuación:
Solución única 1 Solución única 2
Solución única 3
Solución única 4 Solución única 5
Solución única 6
8. Solución única 7 Solución única 8 Solución única 9
Solución única 10 Solución única 11 Solución única 12
2.3.4. Algoritmo.
Sea N el conjunto de vectores de k-prometedores, 0 <= k <= 8, sea G = (N, A) el
grafo dirigido tal que (U, V) pertenece a A si y sólo si existe un entero k, con 0
<= k <= 8 tal que:
- U es k-prometedor
- V es (k+1) prometedor
- Ui = Vi para todo i que pertenece a {1, …, k}
Este grafo es un árbol. Su raíz es el vector vacío correspondiente a k = 0 sus
hojas son o bien soluciones (k = 8), o posiciones sin salida (k < 8). Las
soluciones del problema de las ocho reinas se pueden obtener explorando
este árbol. Sin embargo no generamos explícitamente el árbol para explorarlo
9. después. Los nodos se van generando y abandonando en el transcurso de la
exploración mediante un recorrido en profundidad.
Hay que decidir si un vector es k-prometedor, sabiendo que es una extensión
de un vector (k – 1 )-prometedor, únicamente necesitamos comprobar la
última reina que haya que añadir. Este se puede acelerar si asociamos a cada
nodo prometedor el conjunto de columnas, el de diagonales positivas y el de
diagonales negativas controlados por las reinas que ya están puestas.
2.4. Programa en Prolog.
%X/Y-reglon/columna
elemento(X,[X|R]). % Busca el elemento en una lista
elemento(X,[Y|R]):-elemento(X,R).
% plantilla de columnas y renglones
plantilla([1/S1,2/S2,3/S3,4/S4,5/S5,6/S6,7/S7,8/S8]).
% caso base la lista esta vacía, cuando no existe ninguna reina
solucion([]).
solucion([A/B|R]):-solucion(R),elemento(B,[1,2,3,4,5,6,7,8]),
no_ataca(A/B,R).
no_ataca(_,[]).
no_ataca(X/Y,[A/B|R]):-X==A,Y==B,
A-X==B-Y,
% que los renglones y columnas sean diferentes para que no se coman
X-A==B-Y,
% Busca que no se encuentren en la misma lista o renglón
no_ataca(X/Y,R).
Figura 02. Esquema reducido del árbol de soluciones.
10. Conclusiones
El problema de las 8 reinas es un juego de habilidades en el cual desarrollaremos
nuestras capacidades de lograr una mejor manera de ver las diferentes propuestas que
podemos dar a una incógnita como esta.
El mundo real es más complejo de lo que se formula en los problemas para solucionar
por computadora, sin embargo asumimos que los seres humanos para encontrar
soluciones tampoco requieren de mucha información, o al menos no requiere conocer
todo el universo para encontrar soluciones buenas.
En síntesis, las estrategia de búsqueda nos da una idea de cómo los investigadores en IA
proponen diferentes formas de solución para los problemas; estas técnicas son clásicas y
es por ello que deben ser conocidas por todos aquellos que están relacionados con
programación de soluciones por computadora. Existen otros métodos que requieren de
mayor complejidad de programación para encontrar mejores soluciones en un tiempo
razonable, como son el método de ascenso de la colina, algoritmos genéticos, las redes
neuronales. Todos ellos requieren de una mayor complejidad de computación y mayor
conocimiento e información del problema.
11. Referencias.
Bibliografía.
[1] Russell,StuartJ.,Norvig,Peter.,InteligenciaArtificial:Unenfoque moderno
2da Edición,Prentice Hall,2004.
[2] Nilsson,NilsJ.,ArtificialIntelligence:A New Synthesis,MorganKaufmann, 1998.
[3] Simon,HerbertA.,Lascienciasde loartificial,Comares,2006.
[4] Colaboradoresde Wikipedia.Inteligenciaartificial [enlínea].Wikipedia,La en
ciclopedialibre,2009 [fechade consulta:2 de enerodel 2009]. Disponible en
<http://es.wikipedia.org/w/index.php?title=Inteligencia_artificial&oldid=2298
6524>.