INTELIGENCIA ARTIFICIAL TEORÍA DE JUEGOS AJEDREZ Enrique Sánchez 30 de Marzo de 2012 http://www.alfilchess.es Índice 1. Ancedecentes 1. Primeras ideas • • • 2. 3. Torres Quevedo Shannon Turing Trabajos posteriores Actualidad • Kasparov – DeepBlue 2. Representación del juego (Bitboards) 3. Generación de movimientos 4. La función de evaluación 5. Heurística – – – – – – Minimax Alpha – Beta Ordenación Killer moves El efecto horizonte El movimiento nulo 6. Otros avances – – – – Aperturas Tablas de transposición (Zobrist) Tablas de finales (Nalimov) Uso eficiente del tiempo Antecedentes 1. Primeras ideas • • • Torres Quevedo Shannon Turing 2. Trabajos posteriores 3. Actualidad • Kasparov – DeepBlue El turco (1769 - 1839) Charles Babbage “The life of a Philosopher”: Konrad Suze Describió un generador de movimientos en su libro “Calculo plano”, pero sin evaluación ni “En la primera parte de mi estudio, pronto llegué a la conclusión de que cualquier juego de inteligencia es susceptible de ser practicado por un autómata” Estimó para el siglo XIX que existiría ya un sistema de búsqueda analítica para el ajedrez LEONARDO TORRES Y QUEVEDO El ajedrecista hizo su debut durante la Feria de París de 1914. Hubo una extensa primera mención en la Scientific American como "Torres and His Remarkable Automatic Device“. Jugaba automáticamente el final rey y torre contra rey desde cualquier posición sin ninguna intervención humana. Alan Turing En 1952 Turing escribió un programa de ajedrez. TUROCHAMP. Primera partida, Turochamp vs Machiavelli (Donald Michie). Trató de implementar TuroChamp en la computadora Ferranti Mark 1 pero no lo completo. A falta de una computadora lo suficientemente potente como para ejecutarlo, él simulaba el funcionamiento de la computadora, tardando más de hora y media en efectuar un movimiento. “Uno no puede programar una máquina para que juegue mejor de lo que uno juega” Claude Shannon “Programing of a computer for Playing Chess” Consideraciones de Shannon: Ventaja Material Estructura de peones Peones Aislados y retrasados. Control relativo del centro. Peones en color opuesto al alfil propio. Peones pasados Posición de las piezas. Caballos avanzados, protegidos o atacados. Torres en columnas abiertas o semiabiertas. Torres en séptima fila. Torres dobladas. Posibilidades de ataque. Piezas que protegen a otras piezas. Ataques sobre otras piezas. Ataques sobre casillas adyacentes al rey enemigo. Clavadas. Movilidad, medida por el número de movimientos legales posibles. El número de Shannon 120 10 Estimación de la complejidad del ajedrez: Número de posiciones legales entre 1043 y 1050 Número de átomos en el universo: 4*1078 y 6*1079. Determinó las búsquedas de Tipo A y Tipo B que veremos mas adelante: Trabajos posteriores El programa del laboratorio científico de los álamos (Proyecto Manhattan), en una computadora MANIAC El programa Berstein (IBM 704) Programas soviéticos (Kurochkin) El programa NSS (Newel, Shaw y Simon) (Universidad Carnegie Mellon) El programa Kotok (Instituto de tecnología de Massachusset) y McCarthy (profesor del MIT) (1961) Estrategia de búsqueda de tipo B. Perdió el match contra el programa ITEP ruso, pero incentivo el estudio del ajedrez por computadora. La apuesta de Levy En 1968, el MI David Levy realizó una famosa apuesta, en la cual afirmaba que ninguna computadora de ajedrez sería capaz de derrotarle en diez años, bajo condiciones de torneo. Ganó la apuesta en 1978, venciendo por 3'5-1'5 Hacen su aparición CRAYBLITZ (Rober Hyatt) y DEEPTHOUGHT. En 1989 Levy perdió la apuesta 4-0 con DEEPTHOUGHT Kasparov - DeepBlue Feng-hsiung Hsu y Murray Campbell desarrollaron un chip dedicado al cálculo de jugadas llamado ChipTest. Escrito en C, era capaz de evaluar 200 millones de posiciones por segundo. Kasparov - DeepBlue Deep blue vs Kasparov 1996 1997 Un video y seguimos http://youtu.be/7XUKVj328z0 1. Antecedentes 2. Representación del juego (Bitboards) 3. Generación de movimientos 4. La función de evaluación Representación del juego (Bitboards) La propuesta de Shannon: Cada casilla puede tomar 13 valores distintos. Bitboards Algunos de los bitboard que la mayoría de las computadoras utilizan son : 64 mapas los cuales representan las casillas atacadas por cualquier pieza (si hay alguna) que ocupa una casilla en particular. 64 mapas que representan, inversamente al anterior, las casillas desde las cuales hay piezas atacando una casilla en particular. 2 mapas que representan las casillas atacadas por cada bando (blancas y negras). 12 mapas cada uno de los cuales representa las casillas ocupadas por cada tipo de pieza de cada bando (por ejemplo, Caballos blancos). ¿Bitboard?-> Velocidad La forma básica de cómo generar movimientos con mapas de bits se describe a continuación: Utilizar el mapa de bits para todas las piezas por color. Si encontramos que una pieza de ese color está ubicada en la casilla correspondiente sus movimientos deben ser generados. Si no, ir al siguiente bit. Determinar si la pieza en cuestión es un peón. Esto se realiza mediante la operación lógica AND entre el bitmap de la posición actual y el de la ubicación de los peones. Determinar las casillas a las cuales la pieza en cuestión puede mover legalmente. Si es un peón el programa inicia la operación con el bitmap de destinos de peones y casillas de captura, sino inicia con el bitmap de casillas atacadas desde la casilla considerada. El bitmap para ubicaciones de piezas de igual color es complementado o invertido con tal de entregar un mapa de las casillas no ocupadas por piezas del mismo color. La intersección de este bitmap con el de los destinos de peones o de ataque entrega el bitmap de casillas a las cuales la pieza puede mover. Bitboard PAWN_ATTACKS= ((WP << 7) & ~RANK_A) & ((WP <<9) & ~RANK_H) for (int i=0; i<56; i++) { if (board[i]= WHITE_PAWN) { if ((i+1) % 8 != 0) pawnAttacks[i+9]= true; if ((i+1) % 8 != 1) pawnAttacks[i+7]= true; } } Generación de movimientos Generación Selectiva : (Shannon) Examinar el tablero y obtener una serie de movimientos "buenos" descartando el resto. Generación Incremental : Generar algunos movimientos, esperando que alguno de ellos será lo suficientemente bueno o malo tal que la búsqueda a lo largo de esa línea de juego pueda ser terminada antes de generar las otras. Generación Completa : Generar todos los posibles movimientos, esperando que la tabla de transposición contendrá información suficientemente relevante para hacer la búsqueda lo más eficiente posible. Hardware: DEEP THOUGHT La función de evaluación Las puntuaciones generalmente asignadas a cada pieza son relativos al valor del peón, con los valores: Caballo 3 peones Alfil 3 peones Torre 5 peones Dama 9 peones El Rey en algunos programas no tiene un valor asignado si bien en otros se asigna un valor infinito con tal de cambiar drásticamente la evaluación material en caso de su captura. El valor de un peón es un valor arbitrario que generalmente va entre 50 y 100 puntos. Evaluación posicional: Pieza sin defensa Movilidad Estructura de Peones Puntuaciones asignadas a cada pieza. Puntuaciones asignadas en el final de partida Un video y seguimos http://youtu.be/K0sdsJz5QeY 1. 2. 3. 4. 5. Ancedecentes Representación del juego (Bitboards) Generación de movimientos La función de evaluación Heurística • • • • • • Minimax Alpha – Beta Ordenación Killer moves El efecto horizonte El movimiento nulo Minimax • Objetivo: búsqueda de la mejor jugada • Nos centraremos en un juego genérico. – Dos jugadores, jugando por turnos. – Cada jugador está perfectamente informado de las reglas del juego y conoce en todo momento la configuración de cada jugada (no hay azar). – De estos dos jugadores cada uno intenta ganar para sí. Si decimos que un jugador gana, el otro pierde y viceversa. Puede existir un estado de empate. – Etiquetamos a los jugadores con MAX y MIN. Por norma siempre empezará a jugar MAX y vamos a querer que gane dicho jugador. Minimax • Estado(N): configuración del juego en un momento dado. • Árbol de juego. Cada arista de ese árbol indica un posible movimiento. Una rama completa contempla una posible jugada. • En cada nivel se van alternando los jugadores. • Factor de ramificación: número de posibles movimientos que se pueden realizar. Minimax Minimax • Imposible generar todo el árbol de búsqueda – Generar hasta un determinado nivel de profundidad. – Aplicar alguna función de evaluación f(N). • Devuelve un valor numérico cómo de bueno es un estado. • MAX maximizará esta función y MIN minimizará dicha función. • En algunos casos la función nos puede devolver valores como PIERDE, GANA o EMPATA, siempre referidos a MAX. • Objetivo del análisis del árbol: determinar valor del nodo raíz (inicio de la jugada). A este valor se le denomina valor MiniMax. Minimax Minimax Minimax Minimax Minimax • Representación de todas las posibles situaciones que se pueden dar en el juego, a partir de un estado dado • Cada nivel corresponde a un jugador (el primero para MAX). • El problema de decidir el movimiento adecuado. • En su turno, la máquina debe decidir que movimiento hacer. • Idea: – En cada turno, construir el árbol de juego completo cuyo nodo raíz sea la situación actual, desarrollándolo hasta los estados finales. – Valorar los finales según la función de utilidad. – Propagar hacia arriba los valores de la función. – Elegir el movimiento que lleve al estado sucesor del actual con mejor valoración. Minimax • La propagación de valores se hace según el principio minimax: – MAX siempre escogerá lo mejor para MAX y MIN lo peor para MAX. – Un nodo de MAX toma el valor del sucesor con mayor valor. – Un nodo de MIN toma el valor del sucesor con menor valor Minimax Minimax Minimax • Función de evaluación estática: – Dado un estado del juego y un turno, es una estimación de la bondad de tal situación respecto de MAX – En los estados finales, deberá coincidir con la de utilidad – Esta función heurística codifica todo el conocimiento que poseemos acerca del juego – Cuanto mayor el valor, mejor el estado para MAX – Lo importante es la comparación del valor entre los estados • Calidad de la f.e.: – En estados terminales f.e.=f.u. – ¡Su cálculo no debe ser muy lento!. Compromiso precisión-costo en tiempo. – La f.e. debe reflejar con precisión las posibilidades reales de ganar. Minimax • Implementación: – En lo que sigue, asumiremos que en lugar de una función f-utilidad(estado, turno), disponemos de una función f-e-estatica(estado, turno), definida sobre todos los estados – También necesitaremos dos variables: *máximovalor* y *mínimo-valor* almacenando, respectivamente, cotas para el mayor y el menor valor que puede tomar la función de evaluación estática Minimax Minimax Minimax • Complejidad: – Sea r es el factor de ramificación y m el nivel de profundidad. – Complejidad en tiempo: O(rm). – Complejidad en espacio: O(rm). • Aún es ineficiente en la práctica: – En el ajedrez, con 150 segundos por turno, solo sería posible analizar 150000 nodos, luego sólo se podría generar un árbol de profundidad menor que 4 – Por tanto, la calidad del juego de la máquina será muy baja (un jugador humano medio puede planificar al menos 6 jugadas por adelantado) • La poda alfa-beta mejora : – En algunos casos, es posible podar el árbol sin que afecte a la decisión que se toma finalmente PODA ALFA-BETA Poda Alfa - Beta Poda Alfa - Beta Poda Alfa - Beta • Idea: • Cada nodo se analiza teniendo en cuenta el valor que por el momento tiene y el valor que por el momento tiene su padre • Esto determina en cada momento un intervalo de posibles valores que podría tomar el nodo • Significado intuitivo de en cada momento: • Nodos MAX: es el valor actual del nodo (que tendría eso o más) y es el valor actual del padre (que tendría eso o menos) • Nodos MIN: es el valor actual del nodo (que tendría eso o menos) y es el valor actual del padre (que tendría eso o más) • La poda se produce si en algún momento : • Y no hace falta analizar los restantes sucesores del nodo • En nodos MIN, se denomina poda y en los nodos MAX, poda Poda Alfa - Beta Poda Alfa - Beta Poda Alfa - Beta • Complejidad: – Sea r es el factor de ramificación y m el nivel de profundidad. – Complejidad en tiempo: O(r3m/4). – Complejidad en espacio: O(rm). – En la práctica, si los sucesores se exploran en orden de valor minimax (creciente o decreciente dependiendo de si es un nodo MIN o MAX, resp.), se produce la máxima poda, y en ese caso la complejidad temporal es O(rm/2) Poda Alfa - Beta • Esto hace que en el mismo tiempo se puedan considerar el doble de jugadas por adelantado (haciendo a la máquina más competitiva) • Métodos (aproximados) para generar los sucesores en orden: – Usar el valor de la función de evaluación estática para ordenar – Usar búsqueda en profundidad iterativa y guardar los valores minimax calculados en cada iteración • • • • Ordenación Killer moves El efecto horizonte El movimiento nulo Ordenación La eficiencia en la búsqueda bajo Minimax depende del orden de los movimientos en que se realiza esta operación. Desafortunadamente, ordenar los movimientos de la mejor forma implica encontrar los mejores y buscar primero sobre estos, lo cual es una tarea bastante difícil de lograr. Capturas Coronaciones Jaques Killer-moves El resto Por ejemplo, el orden podría iniciarse con capturas, coronaciones de peón (las cuales cambian dramáticamente el balance de material) o jaques (los cuales a menudo permiten pocas respuestas legales), siguiendo con movimientos que causaron recientes cortes en otras variantes a la misma profundidad (denominadas jugadas-asesinas, killer-moves) y entonces observar el resto de los movimientos. Killer moves • Varias estrategias existen para guardar los movimientos asesinos. Lo más simple es mantener una lista bastante corta de a lo más dos movimientos de profundidad. • Ejemplo: La figura ilustra el funcionamiento de esta heurística. Si es el turno de mover de las blancas éstas intentarían el movimiento 1.Cxh6 debido a que captura la torre. Luego de examinar las réplicas del negro encontrará que este movimiento es refutado por la respuesta 1... Ta1 mate. Entonces, cuando el programa examine nuevos movimientos para el blanco el primer movimiento negro que tomará como respuesta sera 1... Ta1 debido a que es un movimiento legal que genero un corte en una variante anterior El efecto horizonte • Uno de los mayores dolores de cabeza de los programadores de máquinas de ajedrez en relación a la búsqueda es el llamado "efecto horizonte", descrito en principio por Hans Berliner. • Numerosas técnicas se han desarrollado para evitar el efecto horizonte: búsqueda de "Posiciones Estables" y las "Extensiones Singulares" desarrolladas en Deep Blue son algunas de las más populares. El efecto horizonte Por ejemplo: El efecto horizonte puede entenderse con este ejemplo: supongamos un hombre y una máquina que se encuentran en la ventana de un rascacielos, digamos en el piso 46. Una persona, podría considerar el tirarse por dicha ventana. Sus cálculos serían muy simples: al principio caería a la altura del piso 45. Eso no sería grave. Pero a partir de ahí, dada la altura a la que se encuentra, y la presumible aceleración, el resultado apunta a que sería muy doloroso. El ordenador iría más lejos en sus cálculos. Consideraría la situación de caída, a la altura del piso 45. No le parecería preocupante. Luego vería que se llegaría a la altura del piso 44. Y luego al 43. En principio, calcularía la velocidad creciente de caída, pero no detectaría ningún peligro. El ordenador podría continuar sus cálculos hasta llegar al piso 20, o al piso 10 y ahí detener sus cálculos. Su conclusión final sería: una sensación muy fresca, del viento en la cara. Y saltaría. El movimiento nulo Null-move forward prunning permite a un programa de ajedrez reducir de forma drástica el factor de ramificación con un cierto riesgo de perder información importante. Chrilly Donniger, 1993. La idea es dar al oponente una jugada de ventaja, y si tu posición sigue siendo buena, (alfa mayor que beta), se asume que el alfa real seguirá siendo mayor que beta y por tanto podamos esa rama y seguimos examinando otros nodos. No se suelen permitir dos movimientos nulos seguidos. Inestabilidad en la búsqueda. Los valores de beta pueden cambiar. Ya acabamos… 1. 2. 3. 4. 5. 6. Ancedecentes Representación del juego (Bitboards) Generación de movimientos La función de evaluación Heurística Otros avances • • • • Aperturas Tablas de transposición (Zobrish) Tablas de finales (Nalimov) Uso eficiente del tiempo Aperturas • El ajedrez aleatorio de Fischer es una variante del ajedrez propuesta por Bobby Fischer en la que la posición de salida de las piezas se determina aleatoriamente, aunque con ciertas restricciones. Fue anunciado el 19 de junio de 1996, en el Pasaje Dardo Rocha de la ciudad de La Plata, Argentina. También se lo nombra por sus denominaciones en inglés: Fischer Random Chess, Chess960, Fischerandom chess, FR chess, o FRC. Tablas de transposición El método de ZOBRIST Tablas de finales En 1977 Thompson se presentó en el Campeonato Mundial de Computadoras de Toronto con una base de datos que jugaba en forma perfecta el final de R+D v/s R+T Fueron la clave contra Kasparov Nalimov: Las tablas de Nalimov son ”casi” perfectas porque toman en cuenta la captura en paso. El tiempo de reflexión • ¿Cuanto tiempo asignar al análisis de la posición? Posiciones de fácil determinación requieren un menor tiempo que aquellas que son de difícil decisión o cálculo. Por supuesto, decidir qué es una posición de "fácil determinación" y una de "difícil determinación" es un problema. • Robert Hyatt describe como CRAY BLITZ administra su tiempo en su documento publicado en 1984. ¿QUÉ MAS PODEMOS ESPERAR?