Instituto Tecnológico de Nuevo Laredo Ingeniería en Sistemas Computacionales Inteligencia Artificial Ing. Bruno López Takeyas Unidad III Algoritmo Alfa - Beta Sergio Alfredo Santos Ramírez Gerson Antonio García Carrasco Renato García Jiménez Isidro Gómez Rodríguez Gilberto Antonio Anwar Peña Nuño 01100304 01100208 01100209 01100219 01100275 Nuevo Laredo Tamaulipas a 20 de Octubre del 2005 Historia de Juegos Los juegos provocan una inexplicable fascinación y, la idea de que las computadoras puedan jugar existe desde que existen las computadoras: • Siglo XIX, Babbage, arquitecto de computadoras, pensó en programar su máquina analítica para que jugara al ajedrez. • '50, Shannon describió los mecanismos que podían usarse en un programa jugara al ajedrez • '50, Turing describió un programa para jugar al ajedrez pero no lo construyó • '60, Samuel construyó el primer programa de juegos importante y operativo, el cual jugaba a las damas y podía aprender de sus errores para mejorar su comportamiento Los juegos proporcionan una tarea estructurada en la que es muy fácil medir el éxito o el fracaso. En comparación con otras aplicaciones de inteligencia artificial, por ejemplo comprensión del lenguaje, los juegos no necesitan grandes cantidades de conocimiento. En un primer momento se pensó que se podrían resolver por búsqueda exhaustiva en el árbol del juego, es decir, un árbol que contenga todos los movimientos posibles de ambos jugadores. Considerando por ejemplo el juego de ajedrez, en una partida cada jugador realiza una media de 50 movimientos, con un factor de ramificación medio de 35 posibilidades, por lo tanto para examinar el árbol de juego completamente se tendrían que examinar 35100 posibilidades. Resulta evidente que una simple búsqueda directa no es posible de realizar en la práctica, y por lo tanto es necesario algún tipo de procedimiento de búsqueda heurística. Todos los procedimientos de búsqueda pueden verse como procedimientos de generación y prueba, en donde la comprobación se realiza después de distintas cantidades de trabajo del generador. En un extremo el generador proporciona una solución completa a evaluar por el comprobador; en el otro extremo, el generador genera movimientos individuales cada uno de los cuales se evalúa por el comprobador. Algoritmo Alpha Beta La poda Alpha Beta es una técnica para reducir el número de nodos evaluados por el algoritmo minimax para juegos de 2 contrincantes. Poda partes del árbol de búsqueda que son tan buenas para un jugador que el oponente nunca permitirá que lo alcance. Donald Knuth y Ronald Moore (1975) fueron los primeros en analizar a fondo la eficiencia de la poda alfa-beta, en su libro “An analysis of alphabeta pruning”. Es posible calcular en un determinado juego una decisión correcta sin tener que explorar todos los nodos de un árbol de búsqueda. A la técnica que consideramos en particular se le conoce como poda alfa-beta. Aplicada a un árbol minimax estándar, produce la misma jugada que se obtendría con minimax, pero elimina todas las ramas que posiblemente no influirán en la decisión final. La eficiencia de alfa-beta dependerá del orden como se exploren los sucesores dentro de un árbol, es mejor primero explorar aquellos sucesores que aparentemente tienen más posibilidades de ser los mejores. Para mejorar el rendimiento desde el punto de vista del tiempo invertido en realizar una jugada se introduce el concepto de poda de aquellas ramas que con seguridad nos conducirán a un fracaso conocido sin recorrerlas. El principio general en el que se basa la poda es el siguiente: considérese un nodo n del árbol, tal que exista la posibilidad de que el jugador pueda ir a ese nodo. Si el jugador tuviera una mejor opción m ya sea en el nodo padre de n, o en cualquier punto de elección posterior, en un juego real nunca se alcanzará n. Es decir, una vez que se cuenta con suficiente información sobre n (mediante la exploración de algunos de sus descendientes) que permita llegar a esta conclusión se procede a podar. Características Poda Alfa-Beta • Mejora del Algoritmo Minimax; aplicado en juegos de adversarios por turnos • Se aplica en espacios de estados demasiado grandes como para analizar todos los nodos • La información es imperfecta; es decir, no se conoce el estado del contrincante. P. ejem. En juegos donde no se ve el tablero del adversario Produce la misma jugada que se obtendría con MiniMax, pero elimina todas las ramas que posiblemente no influirán en la decisión final. Alfa: valor de la mejor opción encontrada hasta entonces en un punto de elección a través de la ruta de MAX; Beta: el valor de la mejor (valor más bajo) opción encontrada hasta entonces en un punto de opción a lo largo de la ruta MIN. Conforme se efectúa la búsqueda Alfa-Beta se van actualizando los valores de alfa y beta y se poda Omitir la expansión de nodos que por sus valores no pueden ser los mejores (peores). Interrumpe la búsqueda en algún nivel y aplica evaluaciones heurísticas a las hojas (profundidad limitada) Alfa-Beta permite búsqueda dos veces más profunda. Ordenamiento de los operadores, resultante del conocimiento o experiencia. Únicamente importa el orden y no los valores exactos. La poda no afecta al resultado final. Poda Alfa-Beta Para mejorar el rendimiento desde el punto de vista del tiempo invertido en realizar una jugada se introduce el concepto de poda de aquellas ramas que con seguridad nos conducirán a un fracaso conocido sin recorrerlas. El principio general en el que se basa la poda es el siguiente: considérese un nodo n del árbol, tal que exista la posibilidad de que el jugador pueda ir a ese nodo. Si el jugador tuviera una mejor opción m ya sea en el nodo padre de n, o en cualquier punto de elección posterior, en un juego real nunca se alcanzará n. Es decir, una vez que se cuenta con suficiente información sobre n (mediante la exploración de algunos de sus descendientes) que permita llegar a esta conclusión se procede a podar. En el ejemplo anterior tendríamos el siguiente árbol modificado: Árbol podado Si examinamos el árbol en la capa MIN central se ha seleccionado el valor 3 para el primer nodo (izquierda) que es el menor que se puede conseguir en esa rama, a continuación se mira el segundo nodo de la capa central y se desciende por su hijo de más a la izquierda que le proporciona un valor de 2, cómo ese valor proporcionado es menor que el valor proporcionado por el primer nodo examinado de la capa MIN central (3), sabemos que nunca será escogido por el padre de ese grupo de nodos de la capa intermedia, si el resto de hijos del nodo de la capa central proporcionan números más altos que 2 nunca serán seleccionados a ese nivel y si proporcionan un número menor que 2 el padre de dicho nodo de la capa central tampoco lo seleccionará por que su hermano de la capa central situado a su izquierda proporciona un 3, por tanto los hijos que quedan por visitar del nodo central de la capa central pueden ser podados. En general, la modificación sobre MINIMAX consiste en realizar una comparación previa a la evaluación de un nodo en una capa determinada en función de los resultados obtenidos para los nodos hermanos ya evaluados en dicha capa. Si la capa es MIN entonces no debo seguir evaluando si lo que me sale en un nodo es menor que lo que ya tenía de los anteriores. Si la capa es MAX entonces no debo seguir evaluando si lo que me sale en un nodo es mayor que lo que ya tenía de los anteriores. La poda Alfa-Beta se basa en la idea de disponer de dos valores que conforman una ventana a la cual deben pertenecer los valores de fev(n) para que sean considerados. En los nodos n MAX, según el algoritmo minimax, se debe maximizar el valor de los nodos sucesores. En estos nodos, se utiliza el parámetro α (n) que determina el máximo de los valores de los nodos sucesores encontrado hasta el momento. Así mismo, como los nodos n MIN tratan de minimizar el valor de los nodos, utilizan el parámetro β (n) que va a ser, en cada momento, el mínimo de los valores encontrados de los nodos sucesores de ese nodo. Existen dos formas de podar, dependiendo del nodo en el que se está estudiando. En los nodos MAX, la condición de poda es: α p >= β p-1 es decir, si el α de un nodo MAX de profundidad p es mayor o igual que el β del nodo MIN padre (profundidad p-1) se pueden podar los sucesores del nodo MAX no estudiados todavía. Esto es debido a que, como valor inferior, el nodo MAX va a devolver ese valor de α (α p). Ya que el nodo superior trata de minimizar, va a calcular: con lo que siempre va a elegir el β p-1. Por lo tanto, los nodos no estudiados todavía en el nodo MAX no es necesario estudiarlos, porque no cambian el valor β del nodo padre. Simétricamente, la condición de poda en los nodos MIN es: β p <= α p-1. La explicación es análoga al caso anterior. Procedimiento Alfa-Beta (Situación Alfa-Beta Profundidad) Si situación está considerada como empate, devolver 0 Si Situación es ganadora, devolver mayor-número Si Situación es perdedora, devolver menor-número Si profundidad = profundidad-máxima, devolver evaluación (Situación) Si nivel-max-p Para todo ai sucesor de situación y Alfa < Beta Alfa-Beta=Alfa-Beta (a i, Alfa, Beta, profundidad + 1) Alfa = max(Alfa, Alfa-Beta) Devolver Alfa Si no Para todo a i sucesor de situación y Beta > Alfa Alfa-Beta=Alfa-Beta (a i, Alfa, Beta, profundidad + 1) Beta = min(Beta, Alfa-Beta) Devolver Beta Ejemplo: Con el árbol de la figura, va a realizarse una búsqueda minimax con la poda alfa-beta. En este árbol los nodos círculo son nodos del nivel MAX, y, por tanto, se les denomina nodos MAX, y los nodos cuadrado pertenecen a niveles MIN, y por tanto, se les denomina nodos MIN. Dentro de cada nodo aparecen su identificador y debajo de los nodos hoja aparece el valor que devolvería la función de evaluación si se evaluara dicho nodo. El algoritmo se inicia con el nodo inicial y los valores para α y β siguientes, teniendo en cuenta que no se puede representar el ∞ en las computadoras: α = menor número posible (m); β = mayor número posible (M) Los valores de m y M dependen del lenguaje de programación, y de la computadora utilizada, normalmente. Como se puede observar en la siguiente figura, se produce una poda en el nodo 6 ya que el α en ese nodo (6) es mayor que el valor de β (5) en el nodo padre. Después puede observarse cómo se produce una poda para el nodo 3 debido a que el valor de β (4) es igual al de α (4) del nivel superior, con lo que, por mucho que se estudien los hijos del nodo 3 no se va a cambiar el valor del nodo 1. Por último vuelve a producirse una poda debido a que, en el nodo 11 el valor de α (10) es mayor que el valor de β (8) en el nodo padre. La técnica Alfa-Beta es completamente general, pudiendo utilizarse tanto para árboles de cualquier profundidad finita, como para árboles de profundidad irregular. Las interrupciones que se producen en los nodos conjuntivos se llaman "alfa-interrupciones", diciéndose también que existe un "alfa-atajo" en tanto que las interrupciones que se producen en los nodos disyuntivos se llaman "betas-interrupciones", o también se dice que existe un "beta-atajo". EJEMPLO DE PODA ALFA-BETA El algoritmo efectúa una búsqueda en profundidad. Si durante la misma se produce que es mejor que n para un jugador, entonces nunca se llegará a n en el juego Ejemplo: tres en raya (idea intuitiva de la poda alfa-beta) Algoritmo Alfa Beta (N,ALFA,BETA) K=PROFUNDIDAD ALFA_BETA ALFA=-INF BETA+INF N ES UN NODO SOLUCION? V DEVUELVE VALOR DE LA SOLUCION SI EXISTE UNA MAYOR O MENOR….. REEMPLAZA ALFA_BETA(J,ALFA,BETA) ALFA=MAX (N(J)) ES J UN NODO MAX? ALFA MENOR QUE BETA ALFA F ES J UN NODO MIN? BETA MENOR QUE ALFA ALFA_BETA(J,ALFA,BETA) BETA=MIN (N(J)) BETA Ejemplo de recorrido Alfa Beta Juegos Los juegos proporcionan una tarea estructurada en la que es muy fácil medir el éxito o el fracaso. En comparación con otras aplicaciones de inteligencia artificial, por ejemplo comprensión del lenguaje, los juegos no necesitan grandes cantidades de conocimiento. En un primer momento se pensó que se podrían resolver por búsqueda exhaustiva en el árbol del juego, es decir, un árbol que contenga todos los movimientos posibles de ambos jugadores. Considerando por ejemplo el juego de ajedrez, en una partida cada jugador realiza una media de 50 movimientos, con un factor de ramificación medio de 35 posibilidades, por lo tanto para examinar el árbol de juego completamente se tendrían que examinar 35100 posibilidades. Resulta evidente que una simple búsqueda directa no es posible de realizar en la práctica, y por lo tanto es necesario algún tipo de procedimiento de búsqueda heurística. Los Juegos como problemas de búsqueda Los juegos han ocupado la atención de las facultades intelectuales del ser humano, en ocasiones en grado alarmante. Juegos de tablero, como el ajedrez y el Go, en parte son interesantes debido a que en ellos se libra una lucha pura, abstracta, sin tener que pasar los trabajos y penas que implica organizar dos ejércitos y, con ellos, librar batallas. Esta característica de abstracción es lo que hace atractivos a los juegos para la IA. Es fácil representar el estado del juego, los agentes generalmente están restringidos a una cantidad bastante reducida de acciones bien definidas. De esta forma, los juegos constituyen una idealización de mundos en los que los agentes hostiles actúan de manera que logren disminuir nuestro bienestar. Por otra parte, los juegos son uno de los campos de trabajo más antiguos de la I.A. En 1950, casi, en cuanto fue posible programar las computadoras, Claude Shannon, inventor de la teoría de la información, y Alan Turing elaboraron los primeros programas de ajedrez. Desde entonces, se han realizando continuos avances en el juego, al grado de que los sistemas actuales son capaces de desafían a campeones mundiales humanos sin temor de que puedan hacer el ridículo. Los primeros investigadores eligieron para su trabajo al ajedrez por varias razones. Una computadora capaz de jugar ajedrez seria la prueba viviente de una máquina que podía realizar algo para la que se consideraba era necesario tener inteligencia. Además, la sencillez de las reglas, y el hecho de que el programa pueda acceder totalmente al estado del mundo significa que es fácil representará Juego como una búsqueda a través de un espacio de posibles posiciones de juego. De hecho, la representación en computadora del juego es correcta, en todos sus detalles, a diferencia de la representación del problema de librar una batalla, por ejemplo. Dado que por lo general hay un limite de tiempo, los juegos también penalizan con severidad la ineficiencia. En tanto que la implantación de una búsqueda A*, que es 10% menos eficiente, el costo de su terminación sólo implicará un valor un poco mayor, en el caso de un programa de ajedrez con 10% menos de efectividad en el uso del tiempo disponible posiblemente resulte derrotado, considerando que los demás factores son los mismos. Por ello, la investigación en los juegos ha generado una gran cantidad de interesantes ideas sobre cómo utilizar de la mejor manera el tiempo para obtener buenas decisiones, cuando la obtención de las óptimas es imposible. La poda nos servirá para ignorar partes del árbol de búsqueda que son irrelevantes para la decisión final; las funciones de evaluación heurística nos permitirán darnos 'una idea de la verdadera utilidad de un estado sin necesidad de realizar una búsqueda completa. Poda ALFA-BETA Supongamos que se ha logrado implantar una búsqueda minimax que cuenta con una función de evaluación razonable para el ajedrez y una razonable prueba de suspensión con una búsqueda de reposo Contando con un programa bien elaborado, y una computadora normal, probablemente se podrán buscar 1000 posiciones por segundo. ¿Qué tan bien jugará el programa? En los torneos de ajedrez, se dispone de unos 150 segundos para cada jugada, por lo que hay tiempo para explorar 150,000 posiciones. En el caso del ajedrez, el factor de ramificación es de aproximadamente 35, es decir, el programa sólo podrá explorar tres o cuatro capas y su juego tendrá el nivel de ¡novato! Incluso los jugadores humanos promedio pueden anticipar sus jugadas seis u ocho capas: nuestro programa perdería sin mayor dificultad. Afortunadamente es posible calcular la decisión minimax correcta sin tener que explorar todo los nodos del árbol de búsqueda. Al proceso para evitar la exploración de una de las ramas del árbol de búsqueda se le conoce como poda del árbol de búsqueda. A la técnica que consideraremos en particular se le conoce como poda alfa-beta. Aplicada a un árbol minimax estándar, produce la mismo jugada que se obtendría con minimax, pero elimina todas las ramas que posiblemente no influirán en la decisión final. Eficiencia De La Poda Alfa-Beta La eficiencia de alfa-beta dependerá del orden como se exploren los sucesores. Lo anterior parece indicar que es mejor primero explorar aquellos sucesores que aparentemente tienen más posibilidades de ser los mejores. Knuth y Moore (1975) fueron los primeros en analizar a fondo la eficiencia de la poda alfa-beta. Así como el mejor de los casos explicado en el párrafo anterior, analizaron también el caso en que los sucesores se ordenan aleatoriamente. La complejidad asintótica es 0((b/\og b)d ), al parecer desconsoladora puesto que el factor de ramificación efectivo b/logb no es significativamente menor que b mismo. Por otra parte, la fórmula asintótica es exacta sólo cuando b > 1 000, aproximadamente; es decir, no todos los juegos pueden desarrollarse razonablemente bien al utilizar estas técnicas. En el caso de una b razonable, la cantidad total de nodos explorados será aproximadamente de 0(b3d/4). En la práctica, mediante una función de ordenamiento muy sencilla (como sería el probar primero la captura, luego la amenaza, luego las jugadas de avance y las de retroceso) es posible aproximarse bastante al re-sultado del mejor caso, en vez del resultado aleatorio. 5.5 juegos EN LOS QUE INTERVIENE UN ELEMENTO ALEATORIO En la vida real, contrariamente a lo que sucede en el ajedrez, diversos elementos extremos impredecibles nos llevan a situaciones imprevistas. Algunos juegos reflejan esta impredecibilidad al incluir un elemento aleatorio como es el lanzamiento de dados. Por ello, nos aproximan un poco más a las condiciones prevalecientes en la realidad, por lo que valdría la pena examinar de qué manera tales elementos afectan un proceso de toma de decisiones. El backgammón es el prototipo del juego que une suerte y destreza. Los dados se lanzan al inicio del turno de uno de los jugadores y se define así una combinación de jugadas permitidas a este juego. Un árbol de juego en el backgammon deberá incluir nodos aleatorios, además de los nodos max y min. En la figura 5.10 se indica a los nodos aleatorios mediante círculos. Cada una de las ramas que sale de un nodo aleatorio denota el posible resultado del lanzamiento de un dado, a cada uno de ellos lo acompaña dicho resultado y la posibilidad de que ocurra. Las posibles posiciones ya no tienen un valor minimax definido (que en el caso de los juegos deterministas era la utilidad de la hoja a la que se llegaba por la mejor jugada). Lo único que se puede calcular es un promedio o valor esperado, calculado como un promedio de los posibles resultados del lanzamiento de los dados. El cálculo de los valores esperados de los nodos es directo. Para los nodos terminales se utiliza la función de utilidad, como en el caso de los juegos deterministas Avanzando un paso en el árbol de búsqueda se llega a un nodo aleatorio. En la figura 5.10 los nodos aleatorios son circuios; fijémonos en el que está identificado como C. Sea d¡ el pasible resultado del lanzamiento de un dado y P (di) la posibilidad o probabilidad de que se obtenga tal resultado. Se calcula la utilidad de la mejor jugada para min correspondiente a cada lanzamiento de dados y se añaden las utilidades, ponderadas con la probabilidad de obtención de un determinado lanzamiento de dados. Si S (C, d,) denota el conjunto de posiciones generadas por la aplicación de jugadas permitidas al lanzamiento de dados P (d,) a la posición de C, se podrá calcular el denominado valor esperado max de C, mediante la fórmula: LO ÚLTIMO EN PROGRAMAS DE JUEGOS Ajedrez El ajedrez es el juego que ha recibido con creces buena parte del interés por los juegos. Si bien no han logrado cumplir lo anunciado por Shanon en 1957 en el sentido de que 10 años después las computadoras serían capaces de derrotar a quien fuese el campeón humano de ajedrez, si se encuentran muy cerca de lograrlo. En el ajedrez de velocidad, las computadoras derrotaron al campeón mundial, Gary Kasparov, tanto en los juegos con duración de cinco minutos como en los de 25 minutos; hasta el momento de escribir estas líneas, en los torneos de juegos de duración completa, las computadoras sólo han logrado ocupar un lugar entre los cien mejores jugadores del mundo. En la figura 5.12 se muestra el puntaje obtenido a través del tiempo por humanos y computadoras campeones. Algunos programas de principios de los años 70 eran demasiado complicados, contaban con diversos trucos para eliminar algunas ramas de búsqueda, para generar jugadas posibles, etc.; pero en los programas que ganaron los Campeonatos de Ajedrez por Computadora de Estados Unidos de la ACM (iniciados en 1970) se favorecía el uso de la búsqueda alfa-beta directa, complementada por la consulta en libros de aperturas e infalibles algoritmos de fin de juego. El primer avance notable en eficiencia se debió no a mejores algoritmos o funciones de evaluación, sino al hardware. Belle, la primera computadora especialmente diseñada para jugar ajedrez (Condón y Thompson, 1982) utilizó circuitos integrados para implantar la generación de jugadas y la evaluación de posiciones, lo que permitía la exploración de varios millones de posiciones antes de hacer una sola jugada. El sistema hitech, también una computadora especialmente para esta aplicación, su objetivo era el rápido cálculo de complejas funciones de evaluación. Capaz de generar aproximadamente diez millones de posiciones por jugada y utilizando probablemente la más precisa evaluación de posiciones diseñada hasta ese entonces. El mejor sistema actualmente es Deep Thought 2, donde se utiliza una sencilla función de evaluación, explora casi 5,000 millones de posiciones por jugada, con lo que logra alcanzar profundidades de 10 u 11 y cuenta con una función que le permite seguir la línea de jugadas forzadas aun más lejos (en una ocasión encontró un jaque mate de 37 jugadas). Donde compitió contra el equipo olímpico danés y le ganó 3-1, derrotó a uno de los grandes maestros y con el otro empató. En la siguiente versión del sistema, Deep Blue, se utiliza un arreglo en paralelo de 1,024 chips, lo cual le permite explorar el equivalente de 10,000 posiciones por segundo (de 1 a 2 billones por cada jugada) y alcanzar profundidades de 14. Juegos De Fichas O Damas Arthur Samuel de la IBM, durante sus ratos libres desarrolló un programa para jugar a las damas capaz de obtener por si mismo su función de evaluación mediante lo aprendido a través de miles de juegos ejecutados por el programa mismo. El programa de Samuel empezó con nivel de novato, pero luego de algunos días de jugar consigo mismo, logró competir al mismo nivel en duros torneos con contendientes humanos. Si se toma en cuenta que el equipo de cómputo con el que trabajaba Samuel (una IBN' 704) contaba con 10 000 palabras de memoria principal, cinta magnética para almacenamiento de largo plazo y un ciclo de tiempo de casi un milisegundo, se podrá apreciar por qué se le considera como uno de los grandes logros de la IA. Othello Othello, también conocido como Reversi, posiblemente sea un juego más popular en su versión de computadora que en la de tablero. Su espacio de búsqueda es más reducido que el del ajedrez, por lo general sólo tiene de 5 a 15 jugadas aceptadas, sin embargo la experiencia para la evaluación tiene que obtenerse a partir de cero. Con todo, los programas de Othello en las computadoras normales son mucho mejores que los humanos, quienes por lo general se rehúsan a librar contiendas directas en los torneos. Backgammon El elemento de incertidumbre que introduce el lanzamiento de dados en el juego del backgammon hace de la búsqueda un lujo muy costoso. El primer programa que tuvo repercusión, BK.G, utilizaba sólo búsqueda de una capa, aunque la función de evaluación era bastante compleja. Más recientemente, Gerry Tesauro combinó el método de aprendizaje de Samuel con las técnicas de las redes neurales para crear una nueva función de evaluación. Su programa está considerado sin lugar a dudas entre los tres mejores jugadores del mundo. Go Go es el juego de mesa más popular en Japón, y sus profesionales necesitan de tanta disciplina como en el caso del ajedrez. El factor de ramificación se aproxima a 360, por lo que los métodos normales de búsqueda no sirven de nada. Los que ofrecen ciertas posibilidades son los sistemas basados en completas bases de conocimiento de reglas que propongan aquellas jugadas que pudieran ofrecer alguna posibilidad, aunque la calidad de los juegos así realizados todavía es bastante mala. En especial considerando el premio de dos millones de dólares al programa que logre derrotar a uno de los mejores jugadores, Go es un área con posibilidades de obtener los beneficios de profundas investigaciones utilizando métodos de razonamiento más complejos.