Sunfish est un moteur d'échecs simple mais fort, écrit en python. Avec sa simple interface UCI, et la suppression des commentaires et des espaces blancs, il ne reprend que 131 lignes de code! ( build/clean.sh sunfish.py | wc -l ). Pourtant, il joue à des cotes supérieures à 2000 chez Licheess.
Parce que Sunfish est petit et s'efforce d'être simple, le code fournit une excellente plate-forme pour expérimenter. Les gens l'ont utilisé pour tester des algorithmes de recherche parallèles, expérimenter les fonctions d'évaluation et développer des programmes d'échecs d'apprentissage en profondeur. Fourkz-le aujourd'hui et voyez ce que vous pouvez faire!
La façon la plus simple de faire fonctionner SUFISH est à travers l'interface terminale "fantaisie":
$ tools / sancy.py -cmd ./sunfish.py
Jouant contre Sunfish 2023.
Voulez-vous être blanc ou noir? noir
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♞ ♜
hgfedcba
Score: 23, nœuds: 11752, NPS: 13812, temps: 0,9
Mon déménagement: D4
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4 ♙
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♞ ♜
hgfedcba
Votre déménagement (par exemple C6 ou G8H6): NF6
L'interface terminale utilise une notation algébrique pour saisir les mouvements. Voici un bref aperçu de son fonctionnement: du point de vue de White, les colonnes sont étiquetées AH de gauche à droite et les lignes sont étiquetées 1-8 du bas en haut. Chaque carré est nommé avec sa lettre respective que le nombre (par exemple A2, C3, H8). Un mouvement est communiqué par la première lettre de la pièce mobile suivie par le carré de destination (le P pour les mouvements de pion est omis et N est utilisé pour les chevaliers). Si plusieurs des mêmes pièces peuvent se déplacer vers un carré, spécifiez le fichier de la pièce en mouvement. Si cela est toujours ambigu, spécifiez la colonne.
Afin d'utiliser l'interface terminale, la notation utilisée doit être d'un format spécifique, sinon le mouvement entré ne sera pas lu correctement. Un "x" est parfois utilisé pour désigner une capture, mais doit être omis (par exemple BD4 pas BXD4). N'utilisez pas un "+" pour désigner un chèque (par exemple BF7 pas BF7 +). N'utilisez pas de "=" pour désigner la promotion du pion (par exemple, e8q et non e8 = q) pour désigner une capture de pion La notation requise est le fichier de démarrage suivi du carré de fin (par exemple gf4 pas gf). Le château doit être indiqué avec les Os minuscules (par exemple, oo et ooo). La spécification d'un fichier ou d'un Colummm doit être après avoir énoncé la pièce (par exemple RAE1 et non 1). Lorsqu'il notait en passant, le carré de destination doit être le carré sur lequel le pion se termine, et non le quare du pion qui a été capturé (par exemple EF6 pas ef5).
L'interface terminale prend également en charge la notation explicite. C'est là que le carré source est indiqué suivi par le carré de destination (par exemple E2E4).
Remarque Cela nécessite le package Python-Chess. Pour une véritable expérience minimaliste, nous pouvons d'abord "emballer" le poisson-soleil dans un exécutable compressé (moins de 3 Ko!) Et l'exécuter directement:
$ build / pack.sh sunfish.py packed.sh Longueur totale: 2953 $ ./packed.sh Go wtime 1000 btime 1000 winc 1000 binc 1000 Info Depth 1 Score CP 0 PV D2D4 bestmove d2d4
(Voir la spécification UCI pour l'ensemble complet des commandes.)
Il est également possible de faire fonctionner le poisson-soleil avec une interface graphique, comme Pychess ou Arena.
Enfin, vous pouvez jouer à Sunfish maintenant sur licheess ou jouer contre le port de Rust de Recursing, également sur Lichess, qui est environ 100 Elo plus fort.
Il existe une version expérimentale utilisant un réseau neuronal efficace à jour. Vous pouvez le tester en utilisant l'interface de terminal fantaisie comme ci-dessus:
$ Tools / Fancy.py -cmd "./sunfish_nnue.py nnue / modèles / tanh.pickle" ...
Contrairement à la grande NNUE dans Disons, Stockfish, ce réseau n'est que de 1207 octets! Cela s'assure que le NNUE de Sunfish peut toujours être emballé en moins de 4 Ko. En utilisant NNUE, Sunfish jouera mieux de manière positive, mais pire tactiquement, car la mise en œuvre n'est toujours pas assez rapide.
Sunfish soutient toutes les règles d'échecs, à l'exception de la règle des 50 mouvements.
Il existe de nombreuses façons dont vous pouvez essayer de rendre le poisson-soleil plus fort. Vous pouvez d'abord passer d'une représentation de la carte à un tableau mutable et ajouter un moyen rapide pour énumérer les pièces. Ensuite, vous pouvez implémenter la génération de capture dédiée, vérifier la détection et vérifier les évasions. Vous pouvez également tout déplacer vers les bitboards, implémenter des parties du code en C ou expérimenter avec une recherche parallèle!
L'autre façon de rendre le poisson-soleil plus fort est de lui donner plus de connaissance des échecs. La fonction d'évaluation actuelle n'utilise que des tables carrées - elle ne fait même pas la distinction entre le milieu du jeu et le jeu. Vous pouvez également expérimenter avec plus d'élagage - actuellement seul le mouvement nul est effectué - et des extensions - actuellement aucune n'est utilisée. Enfin, Sunfish pourrait bénéficier d'une commande de déménagement plus avancée, MVV / LVA et voir peut-être?
Un moyen facile d'obtenir un poisson-soleil fort est de courir avec l'Intepreter juste à temps. En particulier, la version Python2.7 de PyPy donne un boost ELO 250 par rapport aux interpreters CPYTHON (2 ou 3) aux commandes de temps rapide:
Rank Name Elo +/- Games Score Draws
1 pypy2.7 (7.1) 166 38 300 72.2% 19.7%
2 pypy3.6 (7.1) 47 35 300 56.7% 21.3%
3 python3.7 -97 36 300 36.3% 20.7%
4 python2.7 -109 35 300 34.8% 24.3%
Le nom Sunfish fait référence au poisson-soleil pygmée, qui est parmi les très rares poissons pour commencer par les lettres «py». L'utilisation d'un poisson est dans l'esprit de grands moteurs tels que Stockfish, Zappa et Rybka.
En termes de patrimoine, Sunfish emprunte beaucoup plus de Micro-Max par Geert Muller et Pychess.
GNU GPL V3