Crea una IA de ajedrez simple: 5 sencillos pasos



Tradujimos para usted un artículo de Lauri Hartikka sobre la creación de la IA más simple para el ajedrez. Fue escrito en 2017, pero los principios básicos siguieron siendo los mismos. Todos los archivos que usó Lori también están disponibles.

La inteligencia artificial simple que puede jugar al ajedrez se puede crear sobre la base de cuatro conceptos:

  1. 1. mudanza;
  2. 2. Evaluación de la junta;
  3. 3. Minimax ;
  4. 4. Recorte alfa beta . En cada etapa de trabajo con el algoritmo, se utilizará uno de ellos, esto mejorará gradualmente las capacidades de juego de la IA.

Skillbox recomienda: El curso en línea aplicado de Python Data Analyst .

Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el código de promoción "Habr".

El código fuente listo para usar se puede encontrar en GitHub .


Etapa 1. Visualización de un tablero de ajedrez con la generación de movimientos.


En este punto, utilizaremos las bibliotecas chess.js para generar movimientos y chessboard.js para representar el tablero de ajedrez. La biblioteca, que es responsable de la generación de movimientos, le permite aplicar todas las reglas de ajedrez, para que podamos calcular cada acción para un arreglo específico de piezas.


Cuando haces clic en la imagen, se abrirá en resolución completa.

Trabajar con estas bibliotecas le permite concentrarse en la tarea principal: buscar y crear un algoritmo que le permita encontrar el movimiento óptimo. Comenzamos el trabajo escribiendo una función que devuelve un movimiento aleatorio de una lista de todos los posibles.

var calculateBestMove =function(game) { //generate all the moves for a given position var newGameMoves = game.ugly_moves(); return newGameMoves[Math.floor(Math.random() * newGameMoves.length)]; }; 

A pesar de que el algoritmo no es un jugador de ajedrez ideal, esto será suficiente para la mayoría de los jugadores de su nivel.


El negro se mueve al azar. ( fuente y juego en línea )

Etapa 2. Evaluación de posición


Ahora descubramos qué lado tiene la ventaja en esta o aquella posición. La forma más fácil es calcular la fuerza relativa de las piezas en el tablero, esto se puede hacer usando la tabla.



Usando la función de evaluación, tenemos la oportunidad de crear un algoritmo que selecciona el movimiento con la calificación máxima.

 var calculateBestMove = function (game) { var newGameMoves = game.ugly_moves(); var bestMove = null; //use any negative large number var bestValue = -9999; for (var i = 0; i < newGameMoves.length; i++) { var newGameMove = newGameMoves[i]; game.ugly_move(newGameMove); //take the negative as AI plays as black var boardValue = -evaluateBoard(game.board()) game.undo(); if (boardValue > bestValue) { bestValue = boardValue; bestMove = newGameMove } } return bestMove; }; 

En principio, el nivel es el mismo, pero el algoritmo ya puede tomar la figura de otra persona cuando existe tal oportunidad.


Las negras tuvieron la oportunidad de tomar piezas blancas. (Las fuentes y el juego están aquí ).

Etapa 3. Árbol de búsqueda con minimax


Después de eso creamos un árbol de búsqueda. Ahora el programa puede elegir el mejor movimiento. Esto se hace usando el algoritmo minimax.

Aquí se analiza un árbol recursivo con la visualización de todos los movimientos posibles a una profundidad dada. La posición es estimada por las hojas de nuestro árbol.

A continuación, devolvemos el valor mínimo o máximo del elemento secundario al nodo primario. Todo depende de qué lado está calculando mal actualmente. En otras palabras, el resultado se maximiza o minimiza en cada nivel.


Aquí, b2-c3 es el mejor movimiento para las blancas, ya que se asegura de que el jugador llegue a la posición con un puntaje de -50.

 var minimax = function (depth, game, isMaximisingPlayer) { if (depth === 0) { return -evaluateBoard(game.board()); } var newGameMoves = game.ugly_moves(); if (isMaximisingPlayer) { var bestMove = -9999; for (var i = 0; i < newGameMoves.length; i++) { game.ugly_move(newGameMoves[i]); bestMove = Math.max(bestMove, minimax(depth - 1, game, !isMaximisingPlayer)); game.undo(); } return bestMove; } else { var bestMove = 9999; for (var i = 0; i < newGameMoves.length; i++) { game.ugly_move(newGameMoves[i]); bestMove = Math.min(bestMove, minimax(depth - 1, game, !isMaximisingPlayer)); game.undo(); } return bestMove; } }; 

Con el algoritmo minimax, nuestra IA ya ha comenzado a comprender las tácticas básicas del ajedrez.

Minimax con una profundidad de 2 (Fuentes y el juego aquí )

Vale la pena señalar que la eficiencia del algoritmo minimax aumenta con la profundidad de la búsqueda. El siguiente paso es responsable de esto.

Etapa 4. Recorte Alfa Beta


Este es un método de optimización del algoritmo minimax que permite ignorar algunas ramas en el árbol de búsqueda. Y esto le permite aumentar la profundidad de búsqueda, gastando la misma cantidad de recursos.

El recorte alfa beta se basa en una situación en la que podemos dejar de evaluar una rama en particular si se descubre que un nuevo movimiento conducirá a una situación peor que la que vimos al evaluar la anterior.

La optimización no afecta el resultado de minimax, pero todo comienza a funcionar más rápido.

Este algoritmo es mucho más eficiente si primero verifica los caminos que conducen a buenos movimientos.


La imagen muestra movimientos que se vuelven innecesarios cuando se utiliza el recorte alfa beta.

Como puede ver, con el recorte alfa-beta, minimax está optimizado y de manera muy significativa.


El número de posiciones que desea evaluar en el caso de una búsqueda con una profundidad de 4 y la posición inicial, que se muestra arriba. (fuente y juego están disponibles aquí )

Paso 5. Función de evaluación mejorada


La función de evaluación inicial es bastante simple, porque simplemente cuenta los puntos de las piezas en el tablero. Para optimizarlo, puede tener en cuenta la posición de las figuras. Por ejemplo, si coloca el caballo en el centro del tablero, entonces se vuelve más costoso: el rango de movimientos disponibles para esta pieza se expandirá.

En este punto, trabajaremos con una versión ligeramente modificada de las tablas cuadradas descritas originalmente en la wiki de Programación de ajedrez .



Y ahora nuestro algoritmo ya está jugando bastante bien, por supuesto, en comparación con el jugador promedio.


Las fuentes y el juego están disponibles aquí.

Conclusión


La ventaja del algoritmo propuesto es que no comete errores muy estúpidos. Por supuesto, la estrategia aquí difícilmente se puede llamar perfecta, pero no obstante.

La implementación de nuestro algoritmo es de solo 200 líneas de código, por lo que los principios básicos son bastante simples. La versión final del programa puede ser <a href= target github.com/lhartikk/simple-chess-ai'> vista en GitHub.

Se pueden agregar otros módulos al algoritmo, que incluyen:



Puede encontrar más información sobre algoritmos de ajedrez en la Wiki de programación de ajedrez .

Skillbox recomienda:

Source: https://habr.com/ru/post/437524/


All Articles