Una guía paso a paso para construir una IA de ajedrez simple

por Lauri Hartikka

Exploremos algunos conceptos básicos que nos ayudarán a crear una IA de ajedrez simple:

  • generación de movimientos
  • evaluación del tablero
  • minimax
  • y poda alfa beta.

En cada paso, mejoraremos nuestro algoritmo con una de estas técnicas de programación de ajedrez probadas por el tiempo. Demostraré cómo afecta cada uno al estilo de juego del algoritmo.

Puedes ver el algoritmo de IA final aquí en GitHub.

Paso 1: Generación de movimientos y visualización del tablero

Usaremos el ajedrez.biblioteca js para generación de movimientos y tablero de ajedrez.js para visualizar el tablero. La biblioteca de generación de movimientos básicamente implementa todas las reglas del ajedrez. Basándonos en esto, podemos calcular todos los movimientos legales para un estado de junta dado.

Una visualización de la mudanza de generación de función. La posición inicial se utiliza como entrada y la salida son todos los movimientos posibles desde esa posición.

El uso de estas bibliotecas nos ayudará a centrarnos solo en la tarea más interesante: crear el algoritmo que encuentre el mejor movimiento.

Comenzaremos creando una función que solo devuelve un movimiento aleatorio de todos los movimientos posibles:

Aunque este algoritmo no es un jugador de ajedrez muy sólido, es un buen punto de partida, ya que en realidad podemos jugar contra él:

Black juega movimientos aleatorios. Jugable en el https://jsfiddle.net/lhartikk/m14epfwb/4

Paso 2 : Evaluación de posición

Ahora intentemos entender qué lado es más fuerte en una posición determinada. La forma más sencilla de lograr esto es contar la fuerza relativa de las piezas en el tablero utilizando la siguiente tabla:

Con la función de evaluación, podemos crear un algoritmo que elige el movimiento que da la evaluación más alta:

La única mejora tangible es que nuestro algoritmo ahora capturará una pieza si puede.

El negro juega con la ayuda de la función de evaluación simple. Jugable en https://jsfiddle.net/lhartikk/m5q6fgtb/1/

Paso 3: Árbol de búsqueda usando Minimax

A continuación vamos a crear un árbol de búsqueda del que el algoritmo puede elegir el mejor movimiento. Esto se hace utilizando el algoritmo Minimax.

En este algoritmo, el árbol recursivo de todos los movimientos posibles se explora a una profundidad dada, y la posición se evalúa en las «hojas» finales del árbol.

Después de eso, devolvemos el valor más pequeño o más grande del hijo al nodo padre, dependiendo de si se trata de un nodo blanco o negro para mover. (Es decir, tratamos de minimizar o maximizar el resultado en cada nivel.)

Una visualización del algoritmo minimax en un artificial posición. El mejor movimiento para las blancas es b2-c3, porque podemos garantizar que podemos llegar a una posición donde la evaluación es -50

Con minimax en su lugar, nuestro algoritmo está empezando a comprender algunas tácticas básicas del ajedrez:

Minimax con nivel de profundidad 2. Jugable en: https://jsfiddle.net/k96eoq0q/1/

La efectividad del algoritmo minimax se basa en gran medida en la profundidad de búsqueda que podemos lograr. Esto es algo que mejoraremos en el siguiente paso.

Paso 4: Poda alfa-beta

La poda alfa-beta es un método de optimización del algoritmo minimax que nos permite ignorar algunas ramas en el árbol de búsqueda. Esto nos ayuda a evaluar el árbol de búsqueda minimax mucho más a fondo, mientras usamos los mismos recursos.

La poda alfa-beta se basa en la situación en la que podemos dejar de evaluar una parte del árbol de búsqueda si encontramos un movimiento que conduce a una situación peor que un movimiento descubierto anteriormente.

La poda alfa-beta no influye en el resultado del algoritmo minimax, solo lo hace más rápido.

El algoritmo alfa-beta también es más eficiente si visitamos primero los caminos que conducen a buenos movimientos.

Las posiciones que no necesitamos explorar si se usa la poda alfa-beta y el árbol se visita en el orden descrito.

Con alfa-beta, obtenemos un impulso significativo al algoritmo minimax, como se muestra en el siguiente ejemplo:

El número de posiciones que se requieren para evaluar si queremos realizar una búsqueda con profundidad de 4 y la posición» raíz » es la que se muestra.

Siga este enlace para probar la versión mejorada alfa-beta de la IA de ajedrez.

Paso 5: Función de evaluación mejorada

La función de evaluación inicial es bastante ingenua, ya que solo contamos el material que se encuentra en el tablero. Para mejorar esto, añadimos a la evaluación un factor que tiene en cuenta la posición de las piezas. Por ejemplo, un caballo en el centro del tablero es mejor (porque tiene más opciones y, por lo tanto, es más activo) que un caballo en el borde del tablero.

Usaremos una versión ligeramente ajustada de tablas cuadradas de piezas que se describen originalmente en el wiki de programación de ajedrez.

El visualizado de la pieza-mesas cuadradas visualizado. Podemos disminuir o aumentar la evaluación, dependiendo de la ubicación de la pieza.

Con la siguiente mejora, comenzamos a obtener un algoritmo que juega un ajedrez «decente», al menos desde el punto de vista de un jugador casual:

Evaluación mejorada y poda alfa-beta con una profundidad de búsqueda de 3. Jugable en el https://jsfiddle.net/q76uzxwe/1/

Conclusiones

La fuerza de una simple jugando al ajedrez-algoritmo es que no cometer errores estúpidos. Dicho esto, todavía le falta entendimiento estratégico.

Con los métodos que he introducido aquí, hemos sido capaces de programar un algoritmo de juego de ajedrez que puede jugar ajedrez básico. La «parte de IA» (excluida la generación de movimientos) del algoritmo final es de solo 200 líneas de código, lo que significa que los conceptos básicos son bastante simples de implementar. Puedes ver la versión final en GitHub.

Algunas mejoras adicionales que podríamos hacer al algoritmo serían, por ejemplo:

  • orden de movimientos
  • generación de movimientos más rápida
  • y evaluación específica al final del juego.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.