Il s'agit d'un bot d'échecs que j'ai programmé par moi même en utilisant des conseils et techniques figurant sur le site chessprogramming et le server discord Engine Programming
Il en est à la troisième itération, la première version étant en Python et la seconde aussi en C++.
Sachant qu'il s'agit de l'un de mes premiers projets (plus ou moins) aboutis en C++, certaines bonnes pratiques ne sont pas respectées (comme l'absences de fichiers headers par exemple).
Voici les techniques que j'ai (j'espère correctement) implémentées :
-
L'algorithme MinMax avec Alpha-Beta Pruning + Principal Variation Search
-
Utilisation de magic bitBoards et bitscans pour la génération des coups
-
Une Table de transposition contenant les coups précédemment cherchés, stocké grace à un extrait du Hash Zobrist du noeud
-
Le tri des coups avec l'évaluation statique des noeuds (sera changé), mais aussi avec Table de transposition
-
Le Null Move Pruning permettant d'éviter de chercher les noeuds "trop bons"
-
Les Late Move Reductions réduisant les recherches sur les coups les plus mauvais
-
La Quiescence Search limitant l'effet d'horizon de la recherche
-
Une Fonction d'évaluation statique basée sur sur un réseau neuronal / NNUE entrainée avec mon trainer sur une base de données lichess
- Architecture : Input 2×786 -> 128 -> 30 Output buckets
-
De l'Approfondissement Itératif prenant en compte les recherches précédentes pour les accélérer
-
Un mode UCI bancal sans option de pondération (toujours activée), ni te taille de hash
Sur mon ordinateur, avec un processeur assez ancien (Intel Core i7-6700HQ 2.60GHz), la recherche prend 6s-14s avec une profondeur maximale entre 13 et 20 plis, dépendant de la complexité de la position.
Quant au niveau atteint par ce bot, il pourrait se situer entre 2300 et 2400 elo, en se basant sur les bots chess.com qu'il peut battre, mais je ne l'ai pas encore rigoureusement testé.
- Implémenter de nouvelles techniques comme l'aspiration window
- Améliorer les constantes de recherche (LMR, NMP, ...) peut-être avec l'algorithme SPSA ?
- Utiliser des collisions constructives pour réduire la taille des tables d'attaques ?
- Améliorer le tri des coups avec l'algorithme MVV-LVA, un historique des coups, etc.
- Améliorer le réseau neuronal ?
Objectif : battre le bot chess.com de Magnus Carlsen !
Sur windows, ustilisez de préférence la toolchain msys avec mingw64.
-
SDL - La librairie graphique pour la gestion de la fenêtre.
pacman -S mingw-w64-x86_64-SDL2 -
SDL_ttf - La librairie de rendu de texte et de gestion de police d'écriture.
pacman -S mingw-w64-x86_64-SDL2_ttf -
SDL_gfx - La librairie étendant les fonctions graphiques de SDL.
pacman -S mingw-w64-x86_64-SDL2_gfx
Pour compiler le projet, après l'installation des librairies, choisissez des lignes de comandes situées dans les fichiers en .sh.
Notez que pour l'instant, seul Windows est supporté.
Il s'agit d'un plateau de jeu sur lequel vous pouvez déplacer les pièces et faire jouer le bot.
-
Pour faire jouer le bot d'un coup appuyez sur la touche
B. -
Vous pouvez activer/désactiver la prévision des coups par le bot en appuyant sur
P. La Variation Principale est affichée à l'aide de flèches -
Vous pouvez annuler un coup en appuyant sur
U -
Dans le menu paramètres vous pouvez afficher/cacher le nombre de noeuds recherchés lors du dernier coup. (Ce menu est plutôt vide mais d'autres actions y seront ajoutées)
-
Pour changer autre chose il faut malheureusement modifier le code
- Pour changer la profondeur de base, modifiez
NORMAL_DEPTHdansbotConstants.cpp - Pour changer le temps moyen donné au bot par coup, modifiez
TARGET_BOT_TIMEdansbotConstants.cpp, etMAX_BOT_TIMEpour le temps maximum
- Pour changer la profondeur de base, modifiez
-
Arguments de la ligne de commande
- --help : Affiche les arguments disponibles
- --white : Le bot joue pour les blancs à chaque tour automatiquement
- --black : Le bot joue pour les noirs à chaque tour automatiquement
- -fen "<FEN string>" : Charge une position d'après une notation FEN