APLICACIÓN DE LA BÚSQUEDA ENTRE ADVERSARIOS: TRES EN RAYA Leissi Castañeda-León1 Nils Murrugarra-Llerena leissi.lcl@gmail.com 1, 2 nineil.cs@gmail.com 1 Renzo Berrú-Ancajima renzoberru@gmail.com 1Universidad Nacional de Trujillo – Perú 2 Sociedad de Estudiantes de Ciencia de la Computación RESUMEN El presente trabajo propone la realización de una aplicación en una de las áreas temáticas muy estudiadas de la Inteligencia Artificial como lo es la Búsqueda entre Adversarios, muy a menudo conocido como juegos; comenzando en la definición de un movimiento óptimo y un algoritmo para encontrarlo. En este caso se utilizó el algoritmo: “MINIMAX”, con funciones de evaluación “HEURÍSTICA”, los mismos que fueron implementados, en un juego muy bien conocido: el Tres en Raya. juego, hasta tal punto que las máquinas han superado a la gente en las damas y en Otelo, han derrotado a campeones humanos (aunque no siempre) en ajedrez y backgammon, y son competitivos en muchos otros juegos [1]. Continuaremos con una introducción a las Decisiones óptimas en juegos, Estrategia y Poda AlfaBeta (sección 2), el algoritmo Mínimax más la heurística utilizado en la implementación de nuestro trabajo (sección 3), Experimentos y Resultados obtenidos, y a la vez discusión de los mismos (sección 4), nuestras conclusiones (sección 5) y por último presentamos nuestras referencias. Palabras Claves: Inteligencia Artificial, Minimax, Heurística, Búsqueda, Agente, Poda. 1. INTRODUCCIÓN Una de las áreas temáticas muy bien estudiadas a sus inicios de la Inteligencia Artificial fue el de juegos, o también conocidos dentro de la misma como entornos competitivos. En este caso el entorno competitivo es una entorno determinista, por está ligada por dos jugadores cada uno con un turno respectivo y un conjunto de acciones posibles. Por 1950, casi tan prontito corno los computadores se hicieron programables, el ajedrez fue abordado por Konrad Zuse (el inventor del primer computador programable y del primer lenguaje de programación), por Claude Shannon (el inventor de la teoría de la información), por Norbert Wiener (el creador de la teoría de control moderna), y por Alan Turing. Desde entonces, hubo un progreso continuo en el nivel de 2. BÚSQUEDA ENTRE ADVERSARIOS: DECISIONES ÓPTIMAS EN JUEGOS En el desarrollo de los juegos de dos jugadores, a uno se le denominará MAX y al otro MIN, cada uno con su turno correspondiente, donde MAX viene a ser quien da inicio a la jugada, luego continúa el del siguiente turno y así sucesivamente hasta llegar al estado final de una jugada, donde se obtiene el ganador respectivo con cierto valor de utilidad obtenido en la búsqueda de la jugada a realizar. Esta búsqueda realizada se puede definir en base a: un Estado Inicial, Movimientos Posible o Legales (Sucesores), un Estado Final, Valor o Función de Utilidad; los mismos que a su vez vienen a definir un árbol de juego y donde se desarrollará primero una búsqueda en profundidad. 2.1. Estrategia Óptima Usualmente se puede decir en una Búsqueda cualquiera, la estrategia óptima se logra alcanzar cuando tras un conjunto de movimientos posibles se llega a la meta u objetivo que viene a ser el estado ganador; sin embargo, la estrategia óptima que aquí hablamos no va por ese camino, sino mas bien consideramos que tras la realización de una jugada MAX, viene una jugada MIN y tras la misma viene otra MAX y así sucesivamente hasta llegar al objetivo, obteniendo resultados buenos ya que con esta estrategia estamos considerando al contrincante como infalible, muy bueno. Esta estrategia óptima, puede ser vista en el árbol de juego, evaluando la función del Valor Mínimax en cada nodo, a través de: Utilidad(n) Si n es terminal Valor Mínimax(n) = Max(Valor Mínimax) Si n es estado max Min(Valor Mínimax) Si n es estado min Veamos esta definición mediante el siguiente ejemplo: Fig. 1. Ejemplo de un árbol Mínimax [1] Donde según la Fig. 1. los nodos terminales se encuentran etiquetados por sus valores de utilidad. En el caso del primer nodo (B) tiene tres sucesores con valores 3, 12 y 8, donde según su estado actual, el Valor Mínimax es 3. En este ejemplo el nodo raíz tiene estado de Max, y tiene como sucesores a los valores: 3, 2 y 2, siendo para este caso el Valor Mínimax 3. Es así que se va dando la decisión más óptima. 2.2. Poda Alfa Beta Existe un problema en el Algoritmo Mínimax, el cual tiene que ver con la complejidad del mismo, ya que el número de estados a examinar o evaluar es exponencial en el número de movimientos. Sin embargo aunque este exponente no se pueda eliminar, existe una posibilidad de reducirlo a la mitad, y esto mediante la realización de una Poda al árbol mínimax. Veamos entonces la realización de la decisión óptima, con la poda aplicada al ejemplo anterior (mostrado en la Fig, 1), mediante los pasos mostrados en la siguiente figura: de usar heurística para cada posible movimiento. Los pasos generales implementados son: Se genera un árbol de profundidad 3 (definida por nosotros) para cada jugada. Se aplica la función heurística para cada terminal. En forma recursiva se avanza hacia las hojas del árbol, y de acuerdo a lo que toca, bien se minimiza o bien se maximiza en los nodos hojas, y los valores escogidos pasan hacia sus nodos padres, y así sucesivamente hasta llegar al nodo raíz. Al valor final que resulta llegando a la raíz se lo conoce como “minimax”. Fig. 2. Ejemplo de pasos de la realización de la Poda Alfa-Beta [1] En la Fig. 2 lo que vimos, fueron los pasos para una decisión óptima, junto con la realización de una poda, a la cual la denominan: Poda Alfa-Beta y a la vez mostrando en cada nodo un rango de posibilidades. En (a) Como la primera hoja debajo de B tiene valor 3, y siendo B un Nodo MIN, entonces éste tiene como valor máximo al 3. (b) La segunda hoja de B tiene valor 12, entonces MIN evitará este movimiento. (c) El último nodo hoja tiene valor de 8, entonces el valor de B queda en 3 y éste mismo sería para el nodo raíz hasta el momento. (d) La primera hoja debajo de C es de valor 2, se dice entonces ya que C es un nodo MIN con el máximo valor de 2, y B vale 3, el nodo raíz MAX nunca elegiría a C, entonces no es necesario el mirar a sus otros sucesores. (e) La primera hoja de D es 14, y como éste es más alto que el de B, entonces existe la necesidad de seguir viendo el resto de nodos hojas. (f) Siguiendo con los sucesores de D, llegamos hasta el nodo de valor 2, que viene a ser el valor de D. Finalmente el nodo raíz tomará la decisión de moverse hacia el nodo B, dando un valor de 3. Se puede decir que una de las ventajas que tenemos con la poda Alfa-Beta, según [1], es que ésta se puede aplicar a árboles de cualquier profundidad. 3. ALGORITMO MÍNIMAX + HEURÍSTICA Este algoritmo de por sí es un algoritmo que aplica búsqueda en profundidad. Nuestro algoritmo MINIMAX, desarrollado tiene además, la particularidad Ahora veámoslo desde un punto de vista más detallado los algoritmos para determinar la heurística y el minimax (recordando que nuestro trabajo está bajo el concepto de Programación Lógica y Recursividad): Entradas: - T, Tablero (lista de listas) - NP, Nro de Pc (entero) Salidas: - H, Valor Heurístico (entero) H1, N1←Determinar Heurística1 (T, NP) H2←Determinar Heurística2 (T, NP) H3←Determinar Heurística3 (T, NP) H4=H1+H2+H3 NPC=Cambiar Numero de Pc (NP) H5, N2←Determinar Heurística1 (T, NPC) H6←Determinar Heurística2 (T, NPC) H7←Determinar Heurística3 (T, NPC) H8=H4 – (H5+H6+H7) H9←Determinar Heurística4 (N1, N2) H=H8+H9 Algoritmo 1. Determinar Heurística Cada determinar Heurística (1, 2, 3 y 4) mencionado en el Algoritmo 1, tiene una función de evaluación y un valor de Heurística respectivo, de acuerdo al estado actual del árbol minimax y éstos valores heurísticos pueden ser de: (véase Fig. 3, 4, 5 y 6): Fig. 3. Caso de valor heurística igual a 3 (para Determinar Heurística1) Fig. 4. Caso de valor heurística igual a 5 (para Determinar Heurística2) Fig. 5. Caso de valor heurística igual a 100 (para Determinar Heurística3) Fig. 6. Caso de valor heurística igual a 10 (para Determinar Heurística4) Ahora presentaremos el Algoritmo Minimax: Entradas: - T, Tablero (Lista de listas) - P, Profundidad (entero =0) - Tu,Turno (entero) - NP, Nro de Pc (entero) Salidas: - H, Valor Heurístico (entero) - TN, Nuevo Tablero (Lista de listas) H←Determinar Heurística1 (T, NP) Corte (!). Algoritmo 2. Calcular Minimax sólo para Determinar Heurística, siendo la profundidad igual a 0. Entradas: - T, Tablero (Lista de listas) - P, Profundidad (entero =0) - Tu,Turno (entero) - NP, Nro de Pc (entero) Salidas: - H, Valor Heurístico (entero) - TN, Nuevo Tablero (Lista de listas) Verificar si es Nodo Terminal (T) H←Determinar Heurística1 (T, NP) Corte (!). Algoritmo 3. Calcular Minimax si es nodo terminal. Ahora veremos el Algoritmo Minimax, para el caso de Maximizar: Entradas: - T, Tablero (Lista de listas) - P, Profundidad (entero =0) - Tu,Turno (entero) - NP, Nro de Pc (entero) Salidas: - H, Valor Heurístico (entero) - TN, Nuevo Tablero (Lista de listas) Verificar si P diferente de 0 Ver si Tu es 1 Determinar los posibles tableros (lista de tableros). PN←Disminuir la profundidad (P) TuN←Cambiar Turno (Tu) Calcular el Minimax de los nodos de los posibles tableros (de la lista de tableros) H←Calcular el máximo TN←Determinar el nodo correspondiente al H máximo Corte (!). Algoritmo 4. Calcular Minimax para maximizar. 4. EXPERIMENTOS Y RESULTADOS Presentaremos un ejemplo de cómo trabaja nuestra implementación del minimax con la heurística en el tres en raya. Por ejemplo para determinar la heurística del tablero maximizando (véase Fig. 7): Fig. 7. del Valor de Heurística, maximizando. 6. CONCLUSIONES Podemos decir que es un trabajo orientado a que la máquina o PC “piense” un movimiento óptimo. Es posible añadir PODA: Alfa-Beta Es posible aumentar o disminuir la profundidad para la obtención de mejores resultados, por parte del programa. REFERENCIAS [1] Stuart J. Russell, Peter Norvig - Inteligencia Artificial, Un Enfoque Moderno - Prentice Hall, capítulo 6: Búsqueda entre Adversarios, pág. 207.