Wir würden gerne zumindest die Partien aller Schachweltmeister einer Analyse unterziehen. Wir beginnen unser Unterfangen mit den 1179 Partien des ersten Weltmeisters Wilhelm Steinitz, die in unserer Datenbank gespeichert sind. Spätestens jetzt taucht die Frage nach der Gesamt-Laufzeit und damit der Machbarkeit unseres Vorhabens insgesamt auf.
Nachdem wir das Programm gestartet haben, beginnen kurz darauf die CPU-Lüfter merklich laut zu rauschen – ein gutes Zeichen, dass wir die Performance optimal getuned haben. Der Rechner scheint die Dauerlast gut auszuhalten und so werfen wir nach etlichen Stunden einen Blick auf die Zwischenergebnisse.
Wir schauen in unsere Logdatei und sehen, dass unser Analyseprogramm bisher ca. 13,5 Stunden lief.

Danach prüfen wir den Umfang der soweit erzielten Ergebnisse in der Datenbank, nämlich die Anzahl der vollständig analysierten Partien.
select
g.id,count(*)
from
game g
join player pw on
g.white_player_id = pw.id
join player pb on
g.black_player_id = pb.id
join position p on
(g.id = p.game_id)
join position_analysis pa on
(p.id = pa.position_id)
where
pw.id = 4375261
or pb.id = 4375261
group by g.id;

Damit können wir die Gesamtlaufzeit für alle zu analysierenden Partien abschätzen (13,5 / 125 * 1179). Dies entspricht einer Laufzeit von ca. 5,3 Tagen!

Das mag gerade noch akzeptabel erscheinen, aber wenn man berücksichtigt, dass die meisten Groß- und Weltmeister der jüngeren Vergangenheit z.T. über 4000 Partien vorzuweisen haben, wird schnell klar, dass eine umfassende Analyse dieser Spieler mit der aktuellen Konstellation mehrere Monate oder gar Jahre in Anspruch nehmen würde.
Diesen Aufwand können und wollen wir derzeit nicht leisten und fragen uns stattdessen, ob nicht etwa eine repräsentative Stichprobe für unsere Zwecke genügen könnte. Wenn wir beispielsweise pro Schachweltmeister über dessen gesamte Schaffensperiode hinweg zufällig jeweils 350 Partien analysieren, würde sich der zeitliche Analyseaufwand pro Spieler auf ca. 2 Tage drastisch verkürzen. Die Zahl 350 wird hier bewusst gewählt, da sie der kleinsten Anzahl Partien entspricht, die für einen (wenn auch inoffiziellen) Weltmeister, in diesem Fall Paul Morphy, in unserer Datenbank aufgezeichnet sind.
Technisch ist diese Anforderung leicht zu realisieren. Dazu modifizieren wir die bestehende SQL-Abfrage für die Ermittlung der zu analysierenden Partien, indem wir pro Zeile einen Zufallswert generieren, diese Liste danach (zufällig) sortieren und davon die ersten 350 Partien verwenden. Damit die Wiederaufsetzbarkeit unseres Programms gewährleistet bleibt, verwenden wir für die rand()-Funktion von MariaDB, die diesen Zufallswert generiert, einen sogenannten SEED, der dafür sorgt, dass die erzeugten Zufallszahlen bei Wiederholung des Programms mit dem selben SEED exakt reproduziert werden. Als konkreten Wert für SEED nehmen wir die jeweilige Player ID. Wir könnten stattdessen auch eine beliebige Zahlenkonstante verwenden.

Wir löschen alle bisherigen Analyse-Ergebniss aus der Datenbank und starten unser Programm erneut.

Nach ziemlich genau 2 Tagen ist das Programm beendet und wir können das Ergebnis prüfen.

Was ist da passiert? Wir überprüfen unser Logfile auf Fehlermeldungen. Tatsächlich finden wir zwei ERROR-Meldungen.
...
2025-11-18 14:43:45 ERROR Error analyzing game 9867365: 'pv'
...
2025-11-18 17:16:56 ERROR Error analyzing game 9523001: 'pv'
...
Der Fehlertext ‚pv‘ ist allerdings nicht sehr erhellend. Zum Glück können wir die betreffenden Partien anhand ihrer ID in der Datenbank rasch finden und überprüfen.
Auf den ersten Blick sind beide Partien valide und alle Züge nachspielbar. Bei näherer Betrachtung fällt allerdings auf, dass beide Partien mit Mattsetzung enden. Da wir sämtliche Züge bzw. die daraus resultierenden Positionen einer Partie und damit auch eventuell entstehende Mattpositionen wie hier analysieren, ergibt sich für die chess engine ein Problem: hier gibt es nichts mehr zu analysieren! Das Gleiche gilt für Patt-Stellungen – es existieren per Definition keine legalen Züge mehr. Das Schachprogramm beschwert sich zu Recht.
Und wie nicht anders zu erwarten bietet die python-chess Bibliothek genau die Funktionalität, um diese Situationen zu erkennen. Damit korrigieren wir in unser Programm, um die Analyse solcher Stellungen zu unterdrücken.

