Du betrachtest gerade 10) die Analyse – Umfang und Laufzeiten

10) die Analyse – Umfang und Laufzeiten

  • Beitrags-Autor:Peter Kühn
  • Beitrags-Kategorie:Allgemein
  • Beitrags-Kommentare:0 Kommentare

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.

Auszug aus Logdatei

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;
125 analysierte Partien

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!

Laufzeitberechnung

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. 1,5 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.

geänderte Funktion get_games in chessdb.py

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

Schreibe einen Kommentar