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.