Créer une IA d'échecs simple: 5 étapes faciles



Nous avons traduit pour vous un article de Lauri Hartikka sur la création de l'IA la plus simple pour les échecs. Il a été rédigé en 2017, mais les principes de base sont restés les mêmes. Tous les fichiers utilisés par Lori sont également disponibles.

Une intelligence artificielle simple qui peut jouer aux échecs peut être créée sur la base de quatre concepts:

  1. 1. Déménagement;
  2. 2. Évaluation du conseil d'administration;
  3. 3. Minimax ;
  4. 4. Détourage alpha bêta . À chaque étape de l'utilisation de l'algorithme, l'un d'eux sera utilisé, ce qui améliorera progressivement les capacités de jeu de l'IA.

Skillbox recommande: Le cours en ligne appliqué Python Data Analyst .

Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».

Le code source prêt à l'emploi peut être trouvé sur GitHub .


Étape 1. Visualisation d'un échiquier avec génération de mouvements


À ce stade, nous utiliserons les bibliothèques chess.js pour générer des mouvements et chessboard.js pour rendre l'échiquier. La bibliothèque, qui est responsable de la génération des mouvements, vous permet d'appliquer toutes les règles d'échecs, afin que nous puissions calculer chaque action pour un arrangement spécifique de pièces.


Lorsque vous cliquez sur l'image, elle s'ouvrira en pleine résolution.

Travailler avec ces bibliothèques vous permet de vous concentrer sur la tâche principale - rechercher et créer un algorithme qui vous permet de trouver le mouvement optimal. Nous commençons le travail en écrivant une fonction qui renvoie un mouvement aléatoire à partir d'une liste de toutes les fonctions possibles.

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)]; }; 

Malgré le fait que l'algorithme n'est pas un joueur d'échecs idéal, cela suffira largement à la plupart des joueurs de son niveau.


Les noirs se déplacent au hasard. ( source et jeu en ligne )

Étape 2. Évaluation du poste


Voyons maintenant quel côté a l'avantage dans telle ou telle position. Le moyen le plus simple est de calculer la force relative des pièces sur la planche, cela peut être fait en utilisant le tableau.



En utilisant la fonction d'évaluation, nous avons la possibilité de créer un algorithme qui sélectionne le mouvement avec la note maximale.

 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 principe, le niveau est le même, mais l'algorithme peut déjà prendre la figure de quelqu'un d'autre quand une telle opportunité existe.


Les noirs ont eu l'occasion de prendre des pièces blanches. (Les sources et le jeu sont ici ).

Étape 3. Arbre de recherche avec minimax


Après cela, nous créons un arbre de recherche. Maintenant, le programme peut choisir le meilleur mouvement. Cela se fait en utilisant l'algorithme minimax.

Ici, un arbre récursif avec l'affichage de tous les mouvements possibles est analysé à une profondeur donnée. La position est estimée par les feuilles de notre arbre.

Ensuite, nous renvoyons la valeur minimale ou maximale de l'enfant au nœud parent. Tout dépend de quel côté est actuellement mal calculé. En d'autres termes, le résultat est maximisé ou minimisé à chaque niveau.


Ici, b2-c3 est le meilleur coup pour les blancs, car il s'assure que le joueur arrive à la position avec un score 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; } }; 

Avec l'algorithme minimax, notre IA a déjà commencé à comprendre les tactiques de base des échecs.

Minimax avec une profondeur de 2 (Sources et jeu ici )

Il convient de noter que l'efficacité de l'algorithme minimax augmente avec la profondeur de la recherche. La prochaine étape en est responsable.

Étape 4. Alpha Beta Clipping


Il s'agit d'une méthode d'optimisation de l'algorithme minimax qui permet d'ignorer certaines branches de l'arbre de recherche. Et cela vous permet d'augmenter la profondeur de recherche, en dépensant la même quantité de ressources.

L'écrêtage alpha bêta est basé sur une situation où nous pouvons arrêter d'évaluer une certaine branche s'il s'avère qu'un nouveau mouvement conduira à une situation pire que celle que nous avons vue lors de l'évaluation de la précédente.

L'optimisation n'affecte pas le résultat de minimax, mais tout commence à fonctionner plus rapidement.

Cet algorithme est beaucoup plus efficace si vous vérifiez d'abord les chemins menant à de bons mouvements.


L'image montre des mouvements qui deviennent inutiles lors de l'utilisation de l'écrêtage alpha bêta.

Comme vous pouvez le voir, avec l'écrêtage alpha-bêta, minimax est optimisé, et de manière très significative.


Le nombre de positions que vous souhaitez évaluer dans le cas d'une recherche avec une profondeur de 4 et la position de départ, indiquée ci-dessus. (la source et le jeu sont disponibles ici )

Étape 5. Fonction d'évaluation améliorée


La fonction d'évaluation initiale est assez simple, car elle compte simplement les points des pièces sur le plateau. Pour l'optimiser, vous pouvez prendre en compte la position des figures. Par exemple, si vous placez le cheval au centre de la planche, cela devient plus cher - la gamme de mouvements disponibles pour cette pièce s'élargira.

À ce stade, nous travaillerons avec une version légèrement modifiée des tables carrées décrites à l'origine dans le wiki Chess Programming .



Et maintenant, notre algorithme fonctionne déjà assez bien, bien sûr, par rapport au joueur moyen.


Les sources et le jeu sont disponibles ici.

Conclusion


L'avantage de l'algorithme proposé est qu'il ne fait pas d'erreurs très stupides. Bien sûr, la stratégie ici ne peut guère être qualifiée de parfaite, mais néanmoins.

L'implémentation de notre algorithme ne comprend que 200 lignes de code, donc les principes de base sont assez simples. La version finale du programme peut être <a href= target github.com/lhartikk/simple-chess-ai'> vue sur GitHub.

D'autres modules peuvent être ajoutés à l'algorithme, notamment:



Plus d'informations sur les algorithmes d'échecs peuvent être trouvées sur le wiki de programmation d'échecs .

Skillbox recommande:

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


All Articles