Ich kann nicht für den Algorithmus sprechen, der für Deep Blue verwendet wird, aber ich werde versuchen, die Verbesserungen in der Schachprogrammierung zu erklären. Geschwindigkeit ist die größte Verbesserung. Deep Blue verwendete dedizierte Multiprozessor-Computer, so dass ein Vergleich nicht wirklich möglich ist.
https://chessprogramming.wikispaces.com/ ist eine großartige Quelle, aber schwer zu navigieren.
Es gibt 3 Hauptfunktionen, die optimiert wurden, um eine Schachengine zu verbessern: die Auswertungs-, Zuggenerierungs- und Suchfunktionen.
Die Evaluierung ist am schwierigsten zu programmieren, da es viele Ausnahmen von den Regeln gibt. Da der Festplattenspeicher immer billiger wird, können mit der Auswertungsfunktion mehr Ausnahmen ausgewertet werden.
Die Generierung von Zügen sowie das Durchführen und Aufheben von Zügen verbrauchen viel Speicher, da sie so oft durchgeführt werden müssen. Die gebräuchlichsten Generierungsfunktionen sind Mailbox, Bitboard, 0x88, 8x8, erweiterte Boards (10x10, 10x12) und ein vorbestimmtes Verschiebungsarray / eine vorgegebene Verschiebungstabelle (* Ich verwende eine indizierte Verschiebungstabelle). Derzeit ist die Meinung, dass Bitboards die schnelleren sind, und die Verwendung von Magic Bitboards beschleunigt dies um bis zu 30%. Dr. Robert Hyatt, Professor und Erfinder der Cratfy-Schach-Engine, behauptet, keine signifikante Geschwindigkeitssteigerung zu haben.
Die frühe Suchfunktion war die primitive Min-Max-Funktion. Grundsätzlich sollten Sie versuchen, die Punktzahl der Seite zu maximieren, um sich zu bewegen und die Punktzahl des Gegners zu minimieren. Alpha-Beta war die erste Verbesserung. Sie reduzierten die Anzahl der Züge, die anhand von Transpositionstabellen, Grenzwerten, Aspirationsfenstern und Verlaufsheuristiken durchsucht wurden. Dies sind Tiefensuchen. Es gibt auch die interne iterative Vertiefungssuche, bei der versucht wird, die "besten" Züge zu suchen, in der Hoffnung, dass sich die Suche nach anderen Zügen als erfolglos erweisen wird.
HINWEIS: Meine Indextabelle. GNUChess und Jester verwenden beide ein Index-Array, um ihre Bewegungen zu generieren. Sie initialisieren den Motor, indem sie das Array mit möglichen Bewegungen füllen. Nehmen Sie die sechs Teile und berechnen Sie die erlaubten Züge, die von jedem Feld verfügbar sind. Also hatte jedes Stück ein [64] [8] Array. Ich nahm diese Idee und komprimierte sie in zwei Indizes und eine Tabelle. Die Tabelle enthält einen Wert, der angibt, ob die 16 Bewegungen möglich sind, ein Index enthält den Versatz der Bewegung und der andere enthält die Maske.
Offset [] = {-8, -1, 1, 8, -9, -7, 7, 9, -17, -15, -10, -6, 6, 10, 15, 17};
Maske [] = {1, 2, 4, 8, 16, 32, 64, 128, 256, ...};
Dann ist die Erzeugung einer Gleitbewegung so einfach wie das Nachschlagen der Gültigkeit der Maske in den zulässigen Offsets gegenüber dem Bewegungstisch.