INTELIGENCIA EN REDES DE COMUNICACIÓN TRABAJO FIN DE

Anuncio
INTELIGENCIA EN REDES DE
COMUNICACIÓN
TRABAJO FIN DE CURSO
¨Las cuatro en raya ¨
Por
Javier Martín Manzano
Alejandro Bárcena Berzosa
INFORME TÉCNICO
El trabajo que se ha realizado, es un programa que consta de inteligencia
artificial, y cuya misión es vencer en el juego de las 4 en raya . La realización del
problema ha sido mediante un algoritmo de búsqueda en profundidad limitada, y
para decidir que opción era mejor se ha utilizado un heurístico.
La profundidad de búsqueda es de 6 niveles, es decir el ordenador
analizara los posibles movimientos en las seis próximas rondas, permitiéndole
tomas la opción que mas le aproxime a su meta, que es la victoria. Para saber que
opción es mejor utiliza el heurístico, que en el código es una función llamada
Evaluar(), esta función evalúa la situación, proporcionando 10 puntos por cada
trío de fichas que se encuentren en línea, y un punto por cada pareja que se hallen
en la misma disposición. Es un heurístico ya que en realidad es solo algo
intuitivo la bondad de la situación, quizá existiese otra situación mejor que una
que se valora mas positivamente. Además dicho heurístico penaliza de la misma
forma que puntúa por las situaciones semejantes que le suceden al contrario. De
forma que intuitivamente la función evaluar nos proporciona un factor, que va de
muy negativo a muy positivo, indicando la posición relativa con respecto a
nuestro oponente.
Por otra parte tenemos las funciones que realizan la búsqueda en
profundidad, la peculiaridad de dichas funciones radica en la expansión de un
árbol en el que se elegirá uno de los nodos de la primera ramificación en función
de la puntuaciones que se obtengan en la hojas del mismo. El computador puesto
que analiza hasta seis rondas, debe hacer de oponente, para ello supone que su
oponente es un jugador experto y que tomara las decisiones correctas en todo
momento, esas correctas decisiones hacen referencia a que supone que el jugador
realizara los movimientos que mejor le convengan, o dicho de otro modo que
mas alejen de nosotros la victoria, por lo tanto elegirá aquellos movimiento que
nos lleven a las situaciones que peor estén valoradas por nuestra función de
evaluación.
Además nosotros elegiremos aquellos movimientos que nos lleven a
situaciones de máxima puntuación. Por lo tanto la función se podría resumir de la
siguiente forma:
1- Se expande el árbol con profundidad seis.
2- Cada nivel corresponde a un jugador
3- Si un nivel (j+1) corresponde al jugador:
a. Observará los posibles movimientos, sus posibles evaluaciones
y elegirá aquella de menor valor, es decir mejor para el
b. Este es el resultado de uno de los posibles movimientos del
nivel anterior, asi pues si eran i posibilidades se le pasa al nivel j
las i respuestas para que el decida
4- Si un nivel (j) corresponde a la maquina:
a. Tomara las i posibilidades de evaluación que le brinda el nivel
j+1, y elegirá el movimiento que le de mayor puntuación, es
decir como cada una de esas i posibilidades corresponde a un
movimiento, elegirá el movimiento que le de mayor puntuación.
5- Se repetirá esto hasta llegar al primer nivel del árbol, donde se debe
tomar la decisión real, ya que la partida se encuentra en ese punto.
Hemos podido observar, que la inteligencia de nuestro sistema radica en dos
factores:
1-
Obviamente la profundidad del árbol de busque fija claramente
la cantidad de opciones analizadas y por lo tanto en buena
medida la inteligencia del juego, como contrapartida tenemos
que la velocidad disminuye de forma exponencial si
aumentamos la profundidad del arbol
2-
El segundo método radica en la bondad o mejor dicho fidelidad
del heurístico utilizado, es decir, el heurístico proporciona una
puntuación que relaciona la situación y los puntos, con relación
a lo cerca que se encuentra dicha situación de la victoria, según
su criterio, si el criterio es mas realista el programa será más
inteligente, y viceversa. La contrapartida se encuentra en la
complicación del algoritmo, y la velocidad de ejecución.
Si hablamos del código, podemos destacar en grandes rasgos:
1- El applet es un escuchador de eventos de ratón el mismo, con lo que
cuando se realiza un clic en él, se ejecuta un método que realiza la
inserción de una ficha en el tablero, en el caso de que quepa dicha
ficha, y se encarga de llamar a las funciones de la clase búsqueda, clase
que se encarga del mecanismo inteligente, para que le proporcione la
columna donde el computador desea insertar ficha.
2- Por otra parte, existe una peculiaridad interesante en la representación
lógica del tablero. Este se representa como un array unidimensional,
representando cada columna en una posición del mismo. Para
representar cada una de las filas de cada columna, se utilizan 2 bits del
entero que contiene cada posición del array. De forma que una
inserción en el tablero será un colocar el numero que corresponda, 0
vacío, 1 jugador y 2 computador, en la posición que corresponda, para
ello sumaremos dicho numero al entero correspondiente del array, pero
previamente desplazaremos el número tantos pares de bits como filas
hay bajo la ficha que vamos a colocar.
3- Esta peculiaridad son permite realizar varia funciones de forma fácil,
como por ejemplo para saber si una columna esta llena o no
simplemente debemos ver el caso en el que la columna este casi llena,
le sobre un sitio, y este llena por fichas cuyo valor le den al entero del
array el valor mas elevado, y dándonos cuenta de que en el caso de
estar lleno completamente y ocupado por fichas de mínimo valor el
entero tendrá un valor mayor. Con estas apreciaciones sabremos si
sobra sitio simplemente comparando el entero del array con un
numero, concretamente con 1023.
4- Otra facilidad que nos permite es saber que ficha ocupa un hueco, con
tan solo desplazar el entero del array, tantas parejas de bits como filas
bajo el halla, y después calcular el modulo argumental [4], del numero
que obtenemos, esto es así porque después del desplazamiento la parja
de bits que nos interesa esta en los bits de menor peso, y puesto que si
olvidamos esos bits el resto del entero es 4*potencias de 2, será
múltiplo de cuatro, y por lo tanto no influirá en el modulo argumental.
La realización de la practica ha sido conjunta por los integrantes del grupo
de forma que no ha habido dada que se haya hecho sin que alguno de los
integrantes no se encontrara presente.
Por ultimo decir que el código esta exhaustivamente comentado, por lo
que no se considera necesario alargar esta explicación mas. Se adjunta en papel
el código del programa más adelante.
Descargar