8reinas-140701221105-phpappjkhjh02

14
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 INFORMÁTICA 2014-I Trujillo – Perú

description

khhk

Transcript of 8reinas-140701221105-phpappjkhjh02

Page 1: 8reinas-140701221105-phpappjkhjh02

ESCUELA DE INGENIERÍA INFORMÁTICA

INFORMEDEL 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

E S C U E L A D E I N F O R M Á T I C A

2014-I

Trujillo – Perú

Page 2: 8reinas-140701221105-phpappjkhjh02

Í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

Page 3: 8reinas-140701221105-phpappjkhjh02

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.

Page 4: 8reinas-140701221105-phpappjkhjh02

INTRODUCCION

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.

En pocas palabras, este problema trata sobre cómo se deberían ubicar 8 reinas en un tablero de ajedrez de dimensión 8 de 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 lenguajes de programación en los que se ha implementado este problema 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".

I. Capítulo 1: Marco Teórico

Page 5: 8reinas-140701221105-phpappjkhjh02

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

1.2. Backtracking:

1.2.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.

1.3. Búsqueda en Profundidad (Depth First Search).

1.3.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 camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado.

Page 6: 8reinas-140701221105-phpappjkhjh02

1.4. Problema de las 8 reinas.

1.4.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.

1.4.2. HistoriaEl 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.

1.4.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 + lj – l == i – k ó j – l = k – i

Teniendo en cuenta estas consideraciones, podemos aplicar un esquema retroactivo para implementar las ocho reinas de una manera realmente

Page 7: 8reinas-140701221105-phpappjkhjh02

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

Page 8: 8reinas-140701221105-phpappjkhjh02

Solución única 7 Solución única 8 Solución única 9

Solución única 10 Solución única 11 Solución única 12

1.4.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 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

Page 9: 8reinas-140701221105-phpappjkhjh02

ú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.

1.5. Programa en Prolog.

%X/Y-reglon/columnaelemento(X,[X|R]). % Busca el elemento en una listaelemento(X,[Y|R]):-elemento(X,R).

% plantilla de columnas y renglonesplantilla([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 reinasolucion([]).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).

Conclusiones

Figura 02. Esquema reducido del árbol de soluciones.

Page 10: 8reinas-140701221105-phpappjkhjh02

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.

Referencias.

Page 11: 8reinas-140701221105-phpappjkhjh02

Bibliografía.

[1] Russell, Stuart J., Norvig, Peter., Inteligencia Artificial: Un enfoque moderno 2da Edición, Prentice Hall, 2004.[2] Nilsson, Nils J., Artificial Intelligence: A New Synthesis, Morgan Kaufmann, 1998.[3] Simon, Herbert A., Las ciencias de lo artificial, Comares, 2006.[4] Colaboradores de Wikipedia. Inteligencia artificial [en línea]. Wikipedia, La en

ciclopedia libre, 2009 [fecha de consulta: 2 de enero del 2009]. Disponible en <http://es.wikipedia.org/w/index.php?title=Inteligencia_artificial&oldid=22986524>.