Sunfish ist ein einfacher, aber starker Schachmotor, geschrieben in Python. Mit seiner einfachen UCI -Schnittstelle und dem Entfernen von Kommentaren und Whitespace nimmt es nur 131 Codezeilen ein! ( build/clean.sh sunfish.py | wc -l ). Dennoch spielt es bei Lichess bei Bewertungen über 2000.
Da Sonnenfische klein ist und sich bemüht, einfach zu sein, bietet der Code eine großartige Plattform zum Experimentieren. Die Menschen haben es verwendet, um parallele Suchalgorithmen zu testen, mit Bewertungsfunktionen zu experimentieren und Deep -Learning -Schachprogramme zu entwickeln. Gib es noch heute und sehen Sie, was Sie tun können!
Der einfachste Weg, Sufish zu laufen, ist die "ausgefallene" Terminalschnittstelle:
$ tools/Fancy.py -cmd ./sunfish.py
Gegen Sunfish spielen 2023.
Willst du weiß oder schwarz sein? Schwarz
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖ ♖ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜ ♜
hgfedcba
Punktzahl: 23, Knoten: 11752, NPS: 13812, Zeit: 0,9
Mein Schritt: D4
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖ ♖ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4 ♙
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜ ♜
hgfedcba
Ihr Umzug (zB C6 oder G8H6): NF6
Die terminale Schnittstelle verwendet eine algebraische Notation zum Eingabegetrieb. Hier ist ein kurzer Überblick darüber, wie es funktioniert: Aus der Sicht von White sind die Spalten von links nach rechts gekennzeichnet und die Zeilen von unten nach oben mit 1-8 gekennzeichnet. Jedes Quadrat wird mit seinem jeweiligen Buchstaben als Zahl (z. B. A2, C3, H8) benannt. Ein Schritt wird durch den ersten Buchstaben des sich bewegenden Stücks gefolgt vom Zielplatz (der P für Pfandbewegungen wird weggelassen und N für Ritter verwendet). Wenn mehr als eines der gleichen Stück zu einem Quadrat wechseln kann, geben Sie die Datei des sich bewegenden Stücks an. Wenn das noch mehrdeutig ist, geben Sie die Spalte an.
Um die Terminalschnittstelle zu verwenden, muss die verwendete Notation von einem bestimmten Format aussehen, andernfalls wird die eingegebene Bewegung nicht korrekt gelesen. Ein "X" wird manchmal verwendet, um eine Einfassung zu bezeichnen, muss aber weggelassen werden (z. B. BD4 nicht BXD4). Verwenden Sie keine "+", um einen Scheck zu bezeichnen (zB BF7 nicht BF7+). Verwenden Sie keine "=", um eine Pfandförderung zu bezeichnen (z. B. e8q, nicht e8 = q), um eine Pfandförderung zu bezeichnen. Die erforderliche Notation ist die Startdatei, gefolgt vom Endquadrat (z. B. GF4, nicht GF). Castling muss mit Kleinbuchstaben von 'O (zB OO und OOO) bezeichnet werden. Das Angeben einer Datei oder eines Columms muss nach der Angabe des Stücks bestehen (zB RAE1 nicht sind 1). Bei der Notierung von en passant sollte das Zielquadrat das Quadrat sein, auf dem der Bauern landet, nicht der Quare des Bauern, der gefangen genommen wurde (z. B. EF6, nicht EF5).
Die Terminalschnittstelle unterstützt auch eine explizite Notation. Hier wird das Quellplatz angegeben, gefolgt vom Zielplatz (z. B. E2E4).
Beachten Sie, dass dies das Python-Chess-Paket erfordert. Für eine echte minimalistische Erfahrung können wir zuerst Sonnenfische in eine komprimierte ausführbare Datei "packen" (weniger als 3 KB!) Und sie direkt ausführen:
$ Build/pack.sh sunfish.py packed.sh Gesamtlänge: 2953 $ ./packed.sh Go Wtime 1000 Bime 1000 Winc 1000 Binc 1000 Info -Tiefe 1 Punktzahl CP 0 PV D2D4 BEBMOVE D2D4
(Weitere Befehle finden Sie in der UCI -Spezifikation.)
Es ist auch möglich, Sonnenfische mit einer grafischen Schnittstelle wie Pychess oder Arena zu betreiben.
Schließlich können Sie jetzt Sonnenfische auf Lichin spielen oder gegen Recurssings Rust -Hafen spielen, ebenfalls auf Lichin, die etwa 100 Elo stärker ist.
Es gibt eine experimentelle Version mit einem effizienten aktualisierbaren neuronalen Netzwerk. Sie können es mit der Fancy Terminal Interface wie oben testen:
$ tools/Fancy.py -cmd "./sunfish_nnue.py nnue/models/tanh.pickle" ...
Im Gegensatz zu dem großen Nnue in Stockfish ist dieses Netzwerk nur 1207 Bytes! Das stellt sicher, dass Sunfish Nnue immer noch in weniger als 4 KB verpackt werden kann. Mit NNUE wird Sunfish besser positionisch, aber taktisch besser spielen, da die Implementierung immer noch nicht schnell genug ist.
Sunfish unterstützt alle Schachregeln, mit Ausnahme der 50 Moves Draw -Regel.
Es gibt viele Möglichkeiten, wie Sie versuchen können, Sonnenfische stärker zu machen. Zuerst können Sie von einer Board -Darstellung zu einem veränderlichen Array wechseln und einen schnellen Weg hinzufügen, um Teile aufzuzählen. Anschließend können Sie dedizierte Capture -Generierung implementieren, die Erkennung überprüfen und Ausweiche überprüfen. Sie können auch alles in Bitboards verschieben, Teile des Codes in C implementieren oder mit paralleler Suche experimentieren!
Die andere Möglichkeit, Sonnenfische stärker zu machen, besteht darin, ihm mehr Kenntnisse über Schach zu vermitteln. Die aktuelle Bewertungsfunktion verwendet nur Stück quadratische Tabellen - sie unterscheidet nicht einmal zwischen Midgame und Endgame. Sie können auch mit mehr Beschneidungen experimentieren - derzeit ist nur Nullbewegungen durchgeführt - und Erweiterungen - derzeit werden keine verwendet. Schließlich könnte Sunfish von einer fortgeschritteneren Bewegung profitieren, MVV/LVA und vielleicht sehen?
Ein einfacher Weg, um einen starken Sonnenfisch zu bekommen, besteht darin, mit der Pypy-Just-in-Time-Mitarbeit zu laufen. Insbesondere die Python2.7 -Version von PYPY gibt einen 250 Elo -Boost im Vergleich zu den Intprepretern der CPython (2 oder 3) bei schnellen Zeitkontrollen:
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%
Der Name Sunfish bezieht sich tatsächlich auf den Pygmy Sunfish, der zu den wenigen Fischen gehört, die mit den Buchstaben "Py" beginnen. Die Verwendung eines Fisches ist im Geiste großer Motoren wie Lagerfische, Zappa und Rybka.
In Bezug auf das Erbe leiht sich Sunfish viel mehr von Micro-Max von Geert Muller und Pychess.
GNU GPL V3