¿Cómo funciona exactamente una computadora de ajedrez?

¡POR EL PODER DE LAS MATEMÁTICAS!

Una computadora de ajedrez funciona exactamente como cualquier otra computadora, al reducir el problema a un montón de cálculos tontos. Porque para eso son buenas las computadoras. Por supuesto, los algoritmos modernos de ajedrez son bastante complicados, pero la esencia no es tan difícil de entender.

Paso 1: construir un árbol

Digamos que tienes un tablero de ajedrez configurado, con cada jugador con 16 piezas. Y es el turno de la computadora. Ahora, la computadora puede hacer 1 de 20 movimientos posibles (2 cada uno para los 8 peones, más 2 cada uno para los caballeros). Y, en respuesta a cualquiera de esos movimientos, el oponente puede hacer 20 movimientos posibles. Entonces, dos movimientos en el juego, tenemos 20 * 20 = 400 escenarios posibles.
Ahora la computadora tiene alrededor de 20 formas de responder a cada uno de estos 400 escenarios.
Y así este árbol sigue creciendo. En teoría, la computadora perfecta podría llegar al final de este árbol y observar todas las configuraciones posibles de la placa, aproximadamente 10 ^ 120. Luego vería cuáles son los caminos por este árbol que conducen a su victoria, y elegiría en consecuencia.

Paso 2: evaluación de los resultados

Pero hay un problema. 10 ^ 120 es un número enorme muy jodido. Contrasta el total de átomos estimados en el universo – 10 ^ 75, y obtienes una idea de cuán grande. Estaríamos sentados esperando que la maldita cosa se mueva hasta que el universo termine.

Entonces, lo que hacen las computadoras reales es construir este árbol con lo mejor de sus capacidades de hardware: 5, 10, 20 o lo que sea que se mueva hacia el futuro. Una vez que tienen este árbol limitado, evalúan cada posición utilizando una función de evaluación.

Para un ejemplo realmente simple, una función de evaluación podría ser
cantidad de piezas que tiene la computadora – cantidad de piezas que tiene el oponente.
Por ejemplo, a la computadora le quedan 10 piezas en el tablero, el oponente solo tiene 8. Luego, la computadora evaluaría dicho tablero a 10 – 8 = 2.
Por supuesto, esa no es una función de evaluación muy buena, pero se entiende la idea. Esto puede hacerse cada vez más complicado, teniendo en cuenta el valor de las piezas individuales, la posición del tablero, el control del centro, la vulnerabilidad del rey para verificar, la vulnerabilidad de la reina del oponente y toneladas de otros parámetros.
Cualquiera que sea la función, le permite a una computadora comparar las posiciones del tablero, para ver cuáles son los resultados deseables.

Paso 3: hacer un movimiento

Una vez realizado el análisis, es hora de tomar una decisión. Hagamos un árbol simplificado.

La computadora, que juega como blanco, tiene que decidir si se mueve. Construye el árbol de arriba y aplica lo que se llama el algoritmo Minimax.

Comienza desde el nivel inferior (3er), y elige el que tenga la puntuación máxima. Considere el cuadrado más a la izquierda en el segundo nivel. Tiene dos resultados posibles: 2 y 8. Dado que será el turno de la computadora en esa etapa, elige el mejor resultado, es decir, el que tiene la puntuación MÁX , que es 8, por lo que asigna 8 a ese nodo. Del mismo modo para todos los nodos en el 2do nivel.


Ahora, para el segundo nivel, el resultado lo decide el oponente, ya que en ese momento, será el turno de las negras. La computadora supone que el negro hará el movimiento que es mejor para el negro, y por lo tanto el peor para el blanco, por lo tanto, elige las configuraciones con puntaje MIN . Por ejemplo, para el nodo central en el primer nivel, hay tres posibilidades: 9, 5 y 9. La computadora asume que el negro tomará el que deja a la computadora más débil, y eso es 5. Entonces, los nodos del primer nivel son Todos los valores dados.


Finalmente, el primer nivel es el turno de la computadora, por lo que toma la decisión con el puntaje MAX , es decir, 7.

Por lo tanto, la computadora trepa al árbol, alternativamente, elige puntajes mínimos y máximos (por lo tanto, el nombre MINIMAX), y toma la decisión que lo deja mejor al final. Cuanto mejor sea el hardware, más profunda será la profundidad del árbol que pueda analizar y, por lo tanto, mayores serán sus posibilidades de ganar. Es por eso que las computadoras generalmente no podían vencer a los humanos en la década de 1950-60, pero ahora son capaces de golpear a los Grandes Maestros. (Partidas de ajedrez humano-computadora)


Paso de bonificación: ¡pero hay más!

El procedimiento que describí es una versión extremadamente simplificada de lo que realmente sucede. En la práctica, la computadora hoy en día usa muchos trucos para reducir sus esfuerzos, trata de evitar ir por caminos que claramente no tienen remedio. La poda alfa-beta, la base de la mesa de Endgame, la heurística de Killer, etc., etc. Es algo bastante complicado. En serio, podrías hacer un doctorado en CS estudiando estas cosas.

Pero espero que mi respuesta al menos te dé una idea general de lo que está sucediendo en las neuronas de silicio de la computadora.

La lógica subyacente de un juego de computadora de Ajedrez es en realidad bastante simple: cuando la computadora decide un movimiento, la computadora optimiza su movimiento al adivinar qué movimiento jugará el jugador humano en respuesta al movimiento de la computadora. Para adivinar el movimiento del jugador humano, la computadora adivina qué adivinará el jugador humano en el próximo movimiento de la computadora … y así sucesivamente.

En otras palabras, un juego de computadora de Ajedrez decide sus movimientos mirando hacia adelante, al igual que los humanos. El nivel (nivel Fácil, Medio, Difícil) está determinado por la cantidad de movimientos que el juego de ajedrez anticipa.

La única diferencia es que los humanos, tanto maestros como principiantes, miran alrededor de cuarenta a cincuenta posiciones antes de decidir qué movimiento jugar, mientras que las computadoras miran exhaustivamente millones de posiciones. Esto se debe al hecho de que los humanos usan habilidades de reconocimiento de patrones construidas a partir de la experiencia, mientras que un juego de computadora de Ajedrez realiza principalmente una búsqueda de fuerza bruta. Por esta razón, algunos dicen que los juegos de computadora de ajedrez no son inteligentes aunque venzan a los humanos.

Mirando hacia adelante en tres en raya:

Más información sobre cómo programar un bot de ajedrez de computadora: http: //chessprogramming.wikispac

Otros enlaces interesantes:

El ajedrez como problema de búsqueda

Puedes pensar en el ajedrez como un árbol de decisión. En cada turno tienes un conjunto de posibles movimientos legales (en promedio tienes 35 movimientos legales a tu disposición).

Cada rama del árbol representa un movimiento (por ejemplo, mover Peón de c2 a c4 ). Cada nodo representa un estado del tablero de ajedrez. Una vez que decidas bajar una rama, es hora de que tu oponente juegue. En promedio, un juego de ajedrez tiene alrededor de 80 turnos.

Ganar un juego de ajedrez significa navegar hacia abajo en este árbol de decisión de modo que llegues a un nodo donde el jaque mate a tu oponente (o él abandona).

El problema es que este árbol de decisión es increíblemente grande. ¿Cuan grande?

En promedio, el árbol tiene un factor de ramificación de 35 (este es el número promedio de movimientos legales disponibles para un jugador) y una altura de 80 (número de turnos en un juego).

Un árbol con tales características tendrá [math] 35 ^ {80} [/ math] (aproximadamente [math] 10 ^ {123} [/ math]) nodos de hoja. Ese es un número muy, muy grande. Esto hace que la búsqueda de fuerza bruta sea intratable (se estima que hay aproximadamente [matemáticas] 10 ^ {82} [/ matemáticas] átomos en el universo observable).

Incluso hoy, no hay ningún programa que pueda predecir perfectamente el resultado de un juego de ajedrez dado el estado del tablero (suponiendo que ambos jugadores jueguen perfectamente). Esto significa que, a diferencia de las damas o el tic tac toe, el ajedrez sigue siendo un juego “sin resolver”.

¿Cómo decide realmente una computadora qué movimiento hacer?

Lo que hace una computadora es buscar exhaustivamente rutas por este árbol de búsqueda hasta que encuentre una que parezca prometedora (o se acabe el tiempo). Para que el problema sea manejable, las computadoras utilizan técnicas como la poda Alfa-Beta para reducir el tamaño del árbol que tienen que buscar.

Eche un vistazo a “El desarrollo histórico del ajedrez informático y su impacto en la inteligencia artificial” (este es un enlace a la versión anotada de este documento, debería ser más fácil de entender). Es un documento maravilloso, relativamente corto, que le da una buena apariencia. Descripción general del desarrollo del ajedrez informático hasta 1997 (justo antes de que Garry Kasparov fuera derrotado por el azul profundo).


Editar: Nota sobre MiniMax y poda alfa-beta

Decidí agregar una nota rápida sobre los conceptos de poda MiniMax y Alpha-beta, ya que estos son conceptos bastante importantes para el ajedrez informático porque te permiten reducir el tamaño del árbol de decisión.

MiniMax

MiniMax es una regla de decisión utilizada en la teoría de la decisión y la teoría del juego para minimizar la posible pérdida en el peor de los casos.

Ejemplo:

Digamos que estás en medio de un juego, donde tienes 2 movimientos posibles. Supongamos también que tiene alguna forma de evaluar qué tan favorable es para usted el estado del juego en cualquier momento. Tal algoritmo toma un estado del juego y genera un número del 1 al 10 (10 significa que ganas, 1 significa que tu oponente gana).

Aquí está el árbol del juego para dicho juego:

En dicho árbol, el valor de MiniMax es [math] 3 [/ math]. Dado que tu oponente juega perfectamente, eso es lo mejor que puedes hacer. Tal vez le gustaría llegar al nodo con [matemáticas] 8 [/ matemáticas], pero si decide ir al subárbol derecho, en el siguiente movimiento, su oponente elegirá ir a la izquierda (porque quiere obtener ese número ser lo más bajo posible) y terminarás con [math] 2 [/ math].

Ahora que conoce el valor de MiniMax, sabe qué movimiento jugar.

Poda alfa-beta

Alpha-beta es un algoritmo que busca disminuir la cantidad de nodos que debe evaluar al ejecutar el algoritmo MiniMax en un árbol de búsqueda.

Por ejemplo, en el ejemplo anterior evaluamos 4 nodos de hoja. Sin embargo, realmente no tuvimos que evaluar el nodo hoja completamente a la derecha. Tan pronto como vimos que el valor del tercer nodo era [matemática] 2 [/ matemática], supimos que estaríamos mejor yendo a la izquierda y, por lo tanto, ni siquiera necesitamos mirar ese último nodo.

Para un ser humano, el juego de ajedrez implica una gran cantidad de pensamiento abstracto de alto nivel : coincidencia de patrones visuales para recordar posiciones del tablero, reglas y pautas, pensamiento consciente e incluso psicología.

Las computadoras no hacen nada de esto.

Para la explicación completa y detallada con infografía, sugeriré la publicación aquí :

algoritmos de ajedrez http://www.techteacup.com

El jugador blanco elige uno de esos 20 movimientos y lo hace.

Para el jugador negro, las opciones son las mismas: 20 movimientos posibles. Entonces el negro elige un movimiento.

Ahora las blancas pueden moverse nuevamente. Este próximo movimiento depende del primer movimiento que el blanco eligió hacer, pero hay alrededor de 20 movimientos que el blanco puede hacer dada la posición actual del tablero, y luego el negro tiene 20 movimientos que puede hacer, y así sucesivamente.

Así es como una computadora mira el ajedrez. Lo piensa en un mundo de “todos los movimientos posibles”, y hace un gran árbol para todos esos movimientos, así:

En este árbol, hay 20 movimientos posibles para las blancas. Hay 20 * 20 = 400 movimientos posibles para el negro, dependiendo de lo que haga el blanco. Entonces hay 400 * 20 = 8,000 para el blanco. Luego hay 8,000 * 20 = 160,000 para negro, y así sucesivamente. Si desarrollaras completamente el árbol completo para todos los movimientos de ajedrez posibles, el número total de posiciones en el tablero es de aproximadamente 1,000,000,000,000,000,000,000,000,

000,000,000,000,000,000,000,000,000,000,000,000,000,000,

000,000,000,000,000,000,000,000,000,000,000,000,000,000,

000,000,000,000

El ajedrez es un juego muy complejo con un factor de ramificación muy alto, es decir, los posibles movimientos después de cada movimiento son muy grandes, por lo que los métodos populares como Minimax no se pueden usar para hacer que la IA sea “más fuerte” después de cierto punto, a pesar de usar Alpha -Beta poda, lo que le permite ser más rápido. Además, limita la “profundidad”, es decir. el número de movimientos antes de lanzar, antes de elegir uno óptimo.

Está bien si quieres vencer a tu hermano pequeño (a menos que sea Magnus Carlsen)
Sin embargo, para los jugadores con una comprensión profunda del juego, que pueden trazar muchos movimientos en el juego, el algoritmo falla.

En cambio, se utiliza un enfoque diferente.

Aprendizaje , es decir. haciendo que el programa aprenda a jugar mejor, en lugar de decirle explícitamente qué movimiento hacer en función de alguna heurística, deja que la computadora decida la heurística y realice un movimiento. Si es un éxito, genial, de lo contrario la computadora mejoraría la heurística por sí sola.
Básicamente, los pesos de cada pieza en el ajedrez varían en función de la colocación de todas las otras piezas (en lugar de ser constantes como en el algoritmo Minimax). Esta función es difícil de escribir explícitamente, por lo que permite que la computadora juegue usando un ‘Libro’, es decir, movimientos tomados de juegos de alto nivel, contra otros buenos jugadores de ajedrez (Aprendizaje no supervisado), diciéndole qué hacer en cierta situación ( Aprendizaje supervisado) y otros métodos relacionados, como el aprendizaje reforzado. Se implementa utilizando redes neuronales (que están especializadas en reconocer patrones) y los pesos se almacenan contra un valor hash para el tablero.

Luego, el objetivo del programa es pasar de una configuración de tablero a otro con un cambio mínimo en la configuración del tablero, pero con mejores posibilidades de pasar a una mejor configuración en movimientos mínimos (recocido simulado). Esto define el ataque, así como la naturaleza arriesgada de la IA.

Este método generalmente se complementa con Algoritmos genéticos para mezclar la mejor de las 2 configuraciones de placa posibles con una mejor. Dado que cada juego tiene que tener movimientos malos, limitarlos es igualmente importante, lo cual se hace fácilmente (no tan fácilmente) por este método.

Entre los mejores, encontré una discusión que ofrece una descripción detallada de los diversos algoritmos para combatir el ajedrez en línea.
Algoritmos de ajedrez informático. Espero que esto ayude.

¿Quieres hacer tu propia computadora de ajedrez?

Echa un vistazo a mi respuesta aquí: la respuesta de Michael Jørgensen a ¿Cómo empiezo con mi propio motor de ajedrez?