Chess Engines Guide

Dr. Erhard Henkes
20.05.2024

Einführung

Vor dem Computerzeitalter gab es menschliche (betrügerische) Systeme wie den "Schachtürken" oder mechanische Systeme wie "El Ajedrecista". Mit dem Beginn des Computerzeitalters (ab ca. 1940) entstanden erste Algorithmen (Turing, Shannon) für Schach spielende Programme. Ausreichend leistungsfähige Hardware stand erst in den 70er Jahren zur Verfügung. Größere Bekanntheit erreichten Chess Engines erst in den 80er Jahren. 1983 erreichte "Belle" (Bell Labs) auf entsprechender Hardware ein USCF Rating von 2250. Damit waren Chess Engines in den Meisterbereich des Schachs vorgedrungen. Hegener und Glaser brachte 1980 das Modell "Mephisto I" auf den Markt. Das kleine schwarze Kästchen wurde unter dem Spitznahmen "Brikett" bekannt. Ich selbst bin damals beim Mephisto II eingestiegen. Man konnte sich nun endlich einen eigenen "Schachcomputer" gönnen. Später nannte ich einen Mephisto Exclusive (zunächst mit Modul II) mein eigen, den ich Ende der 80er mit dem Modul 5.1 nachrüstete. Diese Computer hatten ein eigenes edles Holzbrett mit Holzfiguren, und man konnte endlich ziehen anstatt tippen. Diesen besitze ich noch immer und habe ihn auch in meinem Twitch-Stream vorgeführt. Diese Hardware-Maschine spielt wohl im Bereich um 2000 ELO und ist heute noch ein interessanter Gegner für die Mehrzahl der Schachspieler. Man findet die alten Maschinen heute als reine Software mit UCI Standard in den unendlichen Weiten des Internets.

Der entscheidende Kampf Schachgroßmeister gegen Maschine fand zwischen Kasparov und Deep Blue (IBM) statt. Im Jahre 1996 konnte Kasparov diesen spektakulären Zweikampf noch mit 4:2 gewinnen. Der Mensch hat diesen Kampf im Mai 1997 knapp (2,5 : 3,5) verloren, und heute (2024) ist er chancenlos gegen Engines, die auf einem Smartphone laufen können. Stockfish 16.1 gilt zurzeit als stärkste Engine mit einer ELO-Zahl über 3600. Engines werden heute als interessantes Analysewerkzeug eingesetzt. Man kann teilweise auch Level einstellen, sodass man gegen abgeschwächte Engines antreten und diese besiegen kann.

Die Zahl der verfügbaren Chess Engines ist nur schwierig zu überschauen. daher versuche ich mich hier an einem Chess Engine Guide. 

 

Wie sieht es heute aus?

Man kann inzwischen auf online-Plattformen wie lichess.org oder chess.com gegen Bots antreten. Auf dem eigenen PC, Laptop, Notebook oder Tablet kann man Graphical User Interfaces (GUI), Engines oder kombinierte Systeme (GUI plus Engines) aufspielen. Wer Engines sucht, findet in der CCRL 40/15 Liste passende Gegner. Es gibt die Kategorien commercial, free, open source und private. Das zurzeit (2024) stärkste Programm Stockfish 16 steht kostenlos als opensource Code (zum eigenständigen Kompilieren/Linken) oder als binäre Releases zur Verfügung. Es folgt die (noch) private Engine "Torch" (chess.com) und die käuflich erwerbbare Engine Dragon by Komodo. Bei der Hardware sollte man AVX2 und mehrere CPU zur Verfügung haben, was moderne Rechner bieten. Durch die Entwicklung von NNUE benötigt man keine GPU.Eine nVidia Grafikkarte wird noch von Leela Chess Zero eingesetzt, ideal mit einer nVidia RTX 20xx Grafikkarte und CUDA. Diese Software kann es dann tatsächlich mit Stockfish aufnehmen.

 

Wie kann man einen Engine Guide strukturieren?

Zunächst schauen wir allgemein, an welchen Stellen man heute (2024) nach Engines stöbern kann. Da fallen mir sofort folgende Plattformen (und Menüpunkte) ein:

lichess.org: Gemeinschaft - Spieler - Bots

chess.com: Spielen - Computer

Computerchess Rangliste

Smartphone: Nach Schach oder chess suchen ...

 

Beginnen wir mit den Bots bei lichess.org:



Beginnen wir mit den drei maia-Bots. Die Idee ist hier, Engines mit menschlichem neuronalem Netzwerk zu schaffen. Die Version maia1 wurde mit über 10 Millionen Spielen auf lichess im Wertungsbereich 1100 trainiert. Interessant sind hier die Chess Insights. Wie oft bestraft maia1 Patzer des Gegners? Die Werte erinnern mich an meine eigenen. 100% wäre teuflisch maschinell. maia1 zeigt hier 75% in der Eröffnung und 68% in Mittel- und Endspiel. Das erscheint mir für 1100 schon recht hoch. Bei maia5 und maia9 sind diese Werte ähnlich.
maia1 entspricht 1100, maia5 1500, maia9 1900 (lichess Wertung). Wo liegen erkennbare Unterschiede?
Wir betrachten die Genauigkeit der Züge Eröffnung/Mittelspiel/Endspiel bei Blitz + Schnellschach + Klassisch (Stand Mai 2024):
maia1: 82,5% / 61,3% / 69,5%
maia5: 85,8% / 67,3% / 71,6%
maia9: 88,0% / 64,0% / 66,7%

Ich vergleiche das mit meinen eigenen Werten: 86,0% / 69,0% / 70,8%
Vielleicht sind maia5 und maia9 geeignete Gegner für mich? Da hilft nur Ausprobieren.
Ich habe im April 2022 im 20+0 hier gegen maia9 gewonnen.

Wem das zu schwach ist, der sollte den Lynx_Bot (>2400 lichess Wertung) testen. Dafür braucht es allerdings bereits meisterliche Fähigkeiten. Lynx lässt leider keine Chess Insights zu.
Hier habe ich im Endspiel durch einen Patzer gegen Lynx verloren. Beachten Sie seine 98% Genauigkeit mit 0/0/0 in der Computeranalyse von lichess. Solche Gegner sucht man normalerweise nicht zweimal auf, es sei denn man möchte selbst Meister werden. 

Ein raffinierter Gegenspieler ist Boris-Trapsky (>2150 lichess Wertung im Schnellschach). Hier existieren sogar zwei Spiele von mir. Es steht 1,5 - 0,5 für den Bot. Mit einer Patzer-Bestrafungs-Rate von >85% hat man hier einen wirklich harten Gegner vor sich. 

Ich empfehle zeekat (>1950 lichess Wertung im Schnellschach). Hier habe ich eine leichtsinnig gespielte Partie gruselig gegen diesen Bot verloren.

Wer etwas Besonderes erleben möchte, sollte gegen TurtleBot (1320? lichess Wertung im Schnellschach) antreten. Dieser Bot wurde so programmiert, dass er die dritte Reihe von sich aus gesehen nicht überschreitet. Damit entsteht eine witzige Schach-Variante. Ein echtes Vergnügen, diesen Verteidigungs-Künstler zu knacken. Man kann gegen diesen Bot herrlich Angriff und breite Phalanxen üben. Zurzeit (Mai 2024) ist er mal wieder aktiv. Unbedingt nutzen. Momentan steht es 6:1 (zwei Remis) für mich. Hier finden Sie eine typische Partie.


Bots bei chess.com:

Die Bots bei chess.com beruhen wohl auf der Engine Komodo, die man mittels Parameter personalisieren kann. 

Es gibt eine große Auswahl, die sich gezielt an Anfänger (250 - 850), Fortgeschrittene (1000 -1400), Turnierspieler (1500 - 2100) und Meister (2200 - 2450) wendet. Daneben gibt es Top-Spieler (Ben Finegold bis Magnus Carlsen). Dies ist der Versuch, personalisierte Engines zu erstellen. Letztendlich kann man auch "unpersönlich" direkt gegen die Engine Komodo antreten.
Hierbei finden sich folgende Level: 1 bis 5 für Anfänger (250 - 850), 6 bis 11 für Fortgeschrittene ( 1000 - 1500), 12 bis 15 für Turnierspieler (1600 - 1900), 16 bis 19 für Experten (2000 - 2300), 20 bis 21 für Meister  (2400 - 2500), 22 bis 23 für Grandmaster (2600 - 2700) und 24 für Super Grandmaster (2900). Zum Schluss gibt es 25 "Maximal" (3200).

Mein Lieblings-Computergegner ist "Olga" (1900). Sie spielt eher im Cafehaus-Stil, also ungewohnte Eröffnungen und taktisch gefährlich. Hier findet man eine Partie von mir mit Weiß gegen "Olga".

 

Bots aus der CCRL Rating List:

Diese Liste ist sortiert nach ELO. Durch farbliche Kennzeichung findet man sich leicht zurecht zwischen Commercial, Free, Open source und Private. Lediglich Torch ist rein privat. Man kann es nicht kaufen oder den Code einsehen. Lediglich mittels Analyse auf chess.com kann man diese Engine bisher selbst nutzen. Infos über Torch findet man hier. Partien von GM Hikaru Nakamura gegen Torch kann hier anschauen. Torch ist die Nummer zwei in der Rangliste hinter Stockfish.

Stockfish ist schlicht und einfach ein geniales Schachprogramm. Es ist der beste "Schachspieler". Es ist kostenlos, und der Sourcecode steht unter der GNU General Public License (ab Version 3) zur Verfügung. Die ausführbare exe von Stockfish 16.1 benötigt inzwischen zwei neuronale Netze (ein großes und ein kleines) und kann ohne GUI in einem Terminal bedient werden. Die Schnittstelle zur Stockfish Engine spricht UCI.

Hier ein kleines Beispiel (meine Eingaben sind gelb hinterlegt):

Stockfish 16.1 by the Stockfish developers (see AUTHORS file)
uci
id name Stockfish 16.1
id author the Stockfish developers (see AUTHORS file)

option name Debug Log File type string default
option name Threads type spin default 1 min 1 max 1024
option name Hash type spin default 16 min 1 max 33554432
option name Clear Hash type button
option name Ponder type check default false
option name MultiPV type spin default 1 min 1 max 256
option name Skill Level type spin default 20 min 0 max 20
option name Move Overhead type spin default 10 min 0 max 5000
option name nodestime type spin default 0 min 0 max 10000
option name UCI_Chess960 type check default false
option name UCI_LimitStrength type check default false
option name UCI_Elo type spin default 1320 min 1320 max 3190
option name UCI_ShowWDL type check default false
option name SyzygyPath type string default <empty>
option name SyzygyProbeDepth type spin default 1 min 1 max 100
option name Syzygy50MoveRule type check default true
option name SyzygyProbeLimit type spin default 7 min 0 max 7
option name EvalFile type string default nn-b1a57edbea57.nnue
option name EvalFileSmall type string default nn-baff1ede1f90.nnue
uciok
isready
readyok
setoption name Threads value 15
setoption name Hash value 1600
ucinewgame
position startpos moves g1f3
go depth 35
info string NNUE evaluation using nn-baff1ede1f90.nnue
info string NNUE evaluation using nn-b1a57edbea57.nnue
info depth 1 seldepth 2 multipv 1 score cp -24 nodes 315 nps 45000 hashfull 0 tbhits 0 time 7 pv g8f6
info depth 2 seldepth 3 multipv 1 score cp -24 nodes 3306 nps 413250 hashfull 0 tbhits 0 time 8 pv g8f6
info depth 3 seldepth 4 multipv 1 score cp -12 nodes 6811 nps 851375 hashfull 0 tbhits 0 time 8 pv d7d5 d2d4
info depth 4 seldepth 6 multipv 1 score cp 7 nodes 9994 nps 1110444 hashfull 0 tbhits 0 time 9 pv d7d5 d2d4
info depth 5 seldepth 7 multipv 1 score cp -10 nodes 20438 nps 2043800 hashfull 0 tbhits 0 time 10 pv d7d5 d2d4 c8f5 c1f4 e7e6 e2e3
info depth 6 seldepth 10 multipv 1 score cp -10 nodes 29303 nps 2663909 hashfull 0 tbhits 0 time 11 pv d7d5 d2d4 g8f6 c1f4 c7c5 c2c3
info depth 7 seldepth 11 multipv 1 score cp -19 nodes 113947 nps 5179409 hashfull 0 tbhits 0 time 22 pv d7d5 c2c4 d5c4 b1a3
...
info depth 35 seldepth 48 multipv 1 score cp -21 nodes 192288851 nps 8182852 hashfull 599 tbhits 0 time 23499 pv d7d5 d2d4 g8f6 c2c4 e7e6 b1c3 c7c5 c4d5 c5d4 d1d4 e6d5 e2e4 b8c6 f1b5 d5e4 d4d8 e8d8 f3g5 c8e6 e1g1 f8b4 c3e4 f6e4 g5e4 d8e7 c1e3 h8d8 a2a3 c6d4 b5a6 b7a6 a3b4 e6c4 f1d1 d4b3 e3c5 b3c5 d1d8 a8d8

bestmove d7d5 ponder d2d4

 Ich habe 1.Sf3 eingegeben, und Stockfish möchte mit 1. ... d5 antworten. Als Gegenzug erwartet die Engine 2.d4.

 Diese Information gehen über den Ausgabestream des Programms an das Graphical User Interface (GUI). Das GUI wiederum gibt seine Kommandos über den Eingabestream ein.

Hier im Terminal spiele ich die Rolle des GUI, um die Kommunikation zwischen Engine und GUI zu demonstrieren. Wichtige Abkürzungen sind cp (centipawn), nps (nodes per second), hashfull (Ausnutzung des Hash-Speichers in Promille) und pv (principal variation).

 Stockfish ist in C++ verfasst. Der Code in der main.cpp lautet:

int main(int argc, char* argv[])
{
  std::cout << engine_info() << std::endl;
  Bitboards::init();
  Position::init();
  UCIEngine uci(argc, argv);
  Tune::init(uci.engine_options());
  uci.loop();
  return 0;
}

In uci.loop findet die Kommunikation zwischen Engine und GUI statt:

void UCIEngine::loop() {

std::string token, cmd;

for (int i = 1; i < cli.argc; ++i)
cmd += std::string(cli.argv[i]) + " ";

do
{
if (cli.argc == 1
&& !getline(std::cin, cmd)) // Wait for an input or an end-of-file (EOF) indication
cmd = "quit";

std::istringstream is(cmd);

token.clear(); // Avoid a stale if getline() returns nothing or a blank line
is >> std::skipws >> token;

if (token == "quit" || token == "stop")
engine.stop();

// The GUI sends 'ponderhit' to tell that the user has played the expected move.
// So, 'ponderhit' is sent if pondering was done on the same move that the user
// has played. The search should continue, but should also switch from pondering
// to the normal search.
else if (token == "ponderhit")
engine.set_ponderhit(false);

else if (token == "uci")
sync_cout << "id name " << engine_info(true) << "\n"
<< engine.get_options() << "\nuciok" << sync_endl;

else if (token == "setoption")
setoption(is);
else if (token == "go")
go(is);
else if (token == "position")
position(is);
else if (token == "ucinewgame")
engine.search_clear();
else if (token == "isready")
sync_cout << "readyok" << sync_endl;

// Add custom non-UCI commands, mainly for debugging purposes.
// These commands must not be used during a search!
else if (token == "flip")
engine.flip();
else if (token == "bench")
bench(is);
else if (token == "d")
sync_cout << engine.visualize() << sync_endl;
else if (token == "eval")
engine.trace_eval();
else if (token == "compiler")
sync_cout << compiler_info() << sync_endl;
else if (token == "export_net")
{
std::pair<std::optional<std::string>, std::string> files[2];

if (is >> std::skipws >> files[0].second)
files[0].first = files[0].second;

if (is >> std::skipws >> files[1].second)
files[1].first = files[1].second;

engine.save_network(files);
}
else if (token == "--help" || token == "help" || token == "--license" || token == "license")
sync_cout
<< "\nStockfish is a powerful chess engine for playing and analyzing."
"\nIt is released as free software licensed under the GNU GPLv3 License."
"\nStockfish is normally used with a graphical user interface (GUI) and implements"
"\nthe Universal Chess Interface (UCI) protocol to communicate with a GUI, an API, etc."
"\nFor any further information, visit https://github.com/official-stockfish/Stockfish#readme"
"\nor read the corresponding README.md and Copying.txt files distributed along with this program.\n"
<< sync_endl;
else if (!token.empty() && token[0] != '#')
sync_cout << "Unknown command: '" << cmd << "'. Type help for more information."
<< sync_endl;

} while (token != "quit" && cli.argc == 1); // The command-line arguments are one-shot
}      


Dieser Code ist die beste Quelle, um zu verstehen, welche Kommandos die Engine umsetzt und was sie daraufhin unternimmt.

Stockfish ist absolut darauf getrimmt die Nr. 1 zu sein und zu bleiben. Hier wird um jeden ELO-Punkt gekämpft. Die Entwickler und den Support findet man in Discord auf dem Stockfish Server, eine überaus lebendige Community. Fertige binäre Programme findet man hier. Der größte Sprung in der Spielstärke um etwa 100 ELO-Punkte fand ab Version 12 statt, als man ein neuronales Netzwerk zusätzlich zur klassischen Bewertung einbaute. In Version 16 wurde die klassische Bewertung entfernt. Man setzt nun rein auf die Optimierung der Spielstärke mittels NNUE.

Damit ist Stockfish die jeweils aktuelle Referenz für "korrektes" Schach geworden, ein echter Hyper-Grandmaster, der Menschen im Schach weit hinter sich gelassen hat.

Auf Platz drei findet sich das kommerzielle Programm Dragon by Komodo 3.3. Der große Vorteil sind die "Personalities", sodass man menschliche Verhaltensweisen einstellen kann. Übrigens gibt es diesen Parameter auch bereits beim kostenlosen Komodo 14.  

 

All diese Engines benötigen eine kompatible GUI, die UCI beherrscht.

 

GUI plus Engine:

Es gibt natürlich komplette Systeme, die sowohl die Benutzeroberfläche als auch die Engine oder mehrere Engines beinhalten. Ein klassisches Beispiel ist der "Fritz". In den 90er Jahren löste er die elektronischen Systeme als Schach-Software für den heimischen PC ab. Diese generelle Entwicklung hat sich fortgesetzt. Inzwischen kann man sehr starke Chess Software auf dem Smartphone verwenden.

"Fritz" hat seine führende Rolle inzwischen verloren. Man kann in seiner GUI weitere Engines konfigurieren, parametrisieren und verwenden. Ohne Stockfish geht heute nichts mehr, wenn man auf höchstem Niveau analysieren will. 

Interessant ist das Komplettsystem Shredder. Zurzeit gibt es den Shredder Classic 5, Shredder 13 Windows und Deep Shredder 13 Windows käuflich zu erwerben. Eine kostenlose 30-Tage-Demo-Version des Shredder Classic 4 existiert zum Download (Stand Nov. 2009).

Der Vorteil dieser kompletten Systeme besteht darin, dass sich die Spielstärke der Engine adaptiv verhält, d.h. verliert man, so wird die Spielstärke verringert. Man erhält eine Wertungszahl, sodass man die eigene Entwicklung verfolgen kann.