/*
* BOOK.C
* Tom Kerrigan's Simple Chess Program (TSCP)
*
* Copyright 1997 Tom Kerrigan
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "defs.h"
#include "data.h"
#include "protos.h"
/* the opening book file, declared here so we don't have to include stdio.h in
a header file */
FILE *book_file;
/* open_book() opens the opening book file and initializes the random number
generator so we play random book moves. */
void open_book()
{
srand(time(NULL));
book_file = fopen("book.txt", "r");
if (!book_file)
printf("Opening book missing.\n");
}
/* close_book() closes the book file. This is called when the program exits. */
void close_book()
{
if (book_file)
fclose(book_file);
book_file = NULL;
}
/* book_move() returns a book move (in integer format) or -1 if there is no
book move. */
int book_move()
{
char line[256];
char book_line[256];
int i, j, m;
int move[50]; /* the possible book moves */
int count[50]; /* the number of occurrences of each move */
int moves = 0;
int total_count = 0;
if (!book_file || hply > 25)
return -1;
/* line is a string with the current line, e.g., "e2e4 e7e5 g1f3 " */
line[0] = '\0';
j = 0;
for (i = 0; i < hply; ++i)
j += sprintf(line + j, "%s ", move_str(hist_dat.m.b));
/* compare line to each line in the opening book */
fseek(book_file, 0, SEEK_SET);
while (fgets(book_line, 256, book_file)) {
if (book_match(line, book_line)) {
/* parse the book move that continues the line */
m = parse_move(&book_line[strlen(line)]);
if (m == -1)
continue;
m = gen_dat[m].m.u;
/* add the book move to the move list, or update the move's
count */
for (j = 0; j < moves; ++j)
if (move[j] == m) {
++count[j];
break;
}
if (j == moves) {
move[moves] = m;
count[moves] = 1;
++moves;
}
++total_count;
}
}
/* no book moves? */
if (moves == 0)
return -1;
/* Think of total_count as the set of matching book lines.
Randomly pick one of those lines (j) and figure out which
move j "corresponds" to. */
j = rand() % total_count;
for (i = 0; i < moves; ++i) {
j -= count;
if (j < 0)
return move;
}
return -1; /* shouldn't get here */
}
/* book_match() returns TRUE if the first part of s2 matches s1. */
BOOL book_match(char *s1, char *s2)
{
int i;
for (i = 0; i < (signed int)strlen(s1); ++i)
if (s2 == '\0' || s2 != s1)
return FALSE;
return TRUE;
}
Eröffnungs-Bücher für Engines verfolgen verschiedene Zwecke:
1. Ganz ohne Buch, um auch die Fähigkeiten der Engines in der Eröffnungsphase, nicht außen vorzulassen.
BTW Lc0 spielt ohne Buch auch sehr gut. Das Netz wird von dem Beginn an ohne Buchhilfe trainiert.
2. Mit einem kurzen Buch, z.B. bis zum 3. bis 5. Doppelzug. Damit wird die Breite der Eröffnungsvarianten beeinflusst.
3. Kurze oder längere Bücher, die ausgeglichen oder nicht (ganz) ausgeglichen sind.
Damit wird geprüft, ob eine Engine mit schwierigen Eröffnungspositionen gut oder weniger gut zurecht kommt.
4. Anti-Remis-Bücher, wie z.B. HERT, um die Remishäufigkeit einzugrenzen.
5. Vorgenerierte Bücher für Stockfish und/oder Lc0, wie z.B. Cerebellum.
Sie decken das optimierte Zugverhalten einer Engine bis ins späte Mittelspiel ab.
6. Spezielle Bücher für eine bestimmte Engine mit einem bestimmten Netz/NNUE. Dazu wird eine große Menge an Testpartien benötigt.
7. Positionelle Bücher, die halb- und/oder geschlossene Varianten bevorzugen.
8. GUI-Bücher, die mit der GUI erworben werden, z.B. Fritz, Sdredder oder Hiarcs.
9. Umfangreiche Eröffnungsbibliotheken oder -Datenbanken für das Training oder zum Recherchieren.
10. FRC-Eröffnungen, deren Partien nicht auf das theoretische Eröffnungswissen basieren.
Immer geht es um die Frage, will man Testen, eine Rangliste erstellen oder mit der Engine an einem Turnier teilnehmen.
By Lothar Jung
Date 2022-04-07 14:31
Edited 2022-04-07 15:21
Upvotes 1
Hallo Lothar,
es gibt noch eine nette Idee:
Muss bei den Büchern wirklich unterscheiden zwischen:
1. Spezielles Engines-Buch
2. Buch für Testzwecke z. B. für die Ermittlung von Ratings
Kurz zu Punkt 2:
Schilderte kürzlich, dass die Zugumstellungen ein wirkliches Problem sind und auch unerheblich für den Test von Engines.
Je mehr Zugumstellungen im Buch sind, desto höher die Wahrscheinlichkeit doppelter Partien bzw. werden durch viele Zugumstellungen verschiedene ECO Codes zu oft ausgespielt und dies läßt sich in einem Buch mit vorhandenen Ausspielwahrscheinlichkeiten nicht mehr händeln.
Bei FEOBOS 2, also bei meinem kommenden Projekt, werde ich anders vorgehen.
Die bekannten Linien die zu den 500 ECO Codes führen sind sehr übersichtlich in den 5 Mamutwerken vom Informator Verlag aufgeführt.
Im Grunde ja jetzt 6 weil kürzlich der B00-B99 in zwei Werken unterteilt wurde.
Ich erfasse die kompletten Hauptlinie von Hand in einem neuen Buch.
Allerdings nicht direkt in einem Buch sondern Linie für Linie in einzelnen PGN Files.
Derartige Arbeiten gibt es aber meist nur oberflächlich bis zum Beginn der ECO-Code Bildung.
Das wird sehr lange dauern aber ich kann verschiedene ehemalige Arbeiten besser dabei überprüfen bzw. habe hier schon sehr viel editiert.
Nun der daraus resultierende Vorteil:
Ich schneide pro Partie die kompletten ersten Zügen weg, da diese ja nach der erwähnten Arbeit im Buch sind bzw. ich alle Hauptvarianten als PGN habe.
Vorteil: Es sind keine Zugumstellungen mehr drin, immer nur die Hauptvarianten!
Dann füge ich x Züge nach ECO-Code Bildung, die um die ersten Züge abgeschnittenen Partien hinzu.
Die werden natürlich wieder von x Engines auf Fehler geprüft.
Also, wenn z. B.
E68 sich nach Zug 9. Dc2 bildet, schneide ich aus der Datenbank der E68 Partien die Züge 1-8 weg.
Wenn ich sage:
Buchtiefe = 5 Züge nach ECO-Code Bildung
habe ich in den E68 Daten also nur die Varianten von Zugnummer 9-13.
Bei dieser Vorgehensweise können im Vorfeld viele Problemkonstellationen umgangen werden.
Es entsteht ein Buch ohne Zugumstellungen deren Zugfolen immer getreue der Hauptlinie gehen.
Mithin lassen sich Buchprioritäten nach Beliebtheit der Varianten recht einfach setzen.
Viele Grüße
Frank
Problematisch ist nur:
Es macht keinen Sinn sich an GUI ECO-Code Informationen zu halten weil die oft falsch sind.
Egal welche GUI, fast alle sind betroffen und der Grund sind leider die Zugumstellungen.