Ich gehe davon aus, dass Sie bereits über das Konzept von Min-Max, Bäumen und Beschneiden, Heuristik und anderen Grundlagen Bescheid wissen. Was ich hier schreibe, sind nur einige Details, die möglicherweise unterschätzt wurden.
Ich habe mit Begleitung eines Freundes vor einiger Zeit unsere eigene Schachengine geschrieben. Ich teile einige Probleme und Ideen, die wir hatten, und ich hoffe, Sie finden sie nützlich.
Da wir beide Java-Programmierer waren, wurde unsere Sprache zu Java und wir begannen mit einem objektorientierten Ansatz. Stücke waren Objekte, Tafel war Objekt, Akten und Ränge (Zeilen und Spalten in der Schachliteratur) waren Objekte. Und das war falsch. Der Overhead war enorm und das Programm hatte Mühe, mehr als 2 Züge (4 Lagen) im Suchbaum zu machen.
Bei einigen Suchanfragen kam uns eine brillante Idee (allerdings nicht unsere!): Teile und Board als lange Ganzzahlen (64 Bit) darstellen. Dies ist sinnvoll, da ein Schachbrett 64 Felder hat. Der Rest war etwas weiser (läuft sehr nahe an der CPU = extrem schnell). Stellen Sie sich zum Beispiel eine binäre 64-Bit-Ganzzahl vor, in der die Quadrate auf dem Brett angezeigt werden, die Ihre Figur angreifen kann. Wenn Sie nun ein logisches "UND" zwischen zwei Zahlen wie folgt ausführen, besagt ein Ergebnis ungleich Null, dass Sie ein Quadrat mit Angreifern haben. Es gibt verschiedene Möglichkeiten, das Schachbrett und die Figuren zu präsentieren:
1 - Entscheiden Sie über Ihre Board-Präsentation
Dann brauchst du und öffnest die Datenbank. Die Eröffnung des Schachs ist irgendwie gelöst und es wird dringend empfohlen, ein Eröffnungsbuch zu haben. In diesem Fall haben Sie viel zusätzliche Zeit in Blitzspielen.
2 - Finden Sie sich ein Eröffnungsbuch.
Wir haben das gemacht, aber wir waren noch lange nicht gut:
3 - Eine gute Schachengine sollte 6 Züge (12 Lagen) vor sich haben.
Also haben wir damals die Totzeit genutzt (wenn es sich um eine Mensch-gegen-Computer-Engine handelt).
4 - Nutze die Zeit, in der der Gegner nachdenkt, um einige Ebenen deines Baumes zu erstellen.
Und trotzdem waren wir weit weg von 12 Lagen. Durch mehr Studium entdecken wir einige Tricks! Zum Beispiel wurde vorgeschlagen, eine Lage des Baumes zu überspringen und von der nächsten Lage zu beginnen (als gäbe es keinen Gegner). Die Idee ist, dass, wenn ein Zug extrem idiotisch ist, warum man die Zeit verschwendet und sieht, wie der Gegner auf diesen Zug reagiert. Ein guter Motor sollte jedoch in der Lage sein, zwischen einem idiotischen Zug und einem genialen Königinopfer zu unterscheiden.
5 - Erlernen Sie die Programmiertricks für dieses spezielle Problem (Schach).
In diesem Zustand waren ich und mein Freund immer noch schlecht: / Wir konnten - und wir haben es teilweise getan - die berechneten Positionen speichern. Wenn Sie eine Position berechnen, speichern Sie diese für die Zukunft! Gleiches gilt für Schleifen im Suchbaum. Der Punkt war das effiziente Speichern / Abrufen von:
6 - Speichern Sie die von Ihnen generierten Daten ... Effizient!
und schlussendlich:
7 - Code mit maximaler Optimierung.
Dieses Problem ist sowohl in der CPU-Zeit als auch im Speicher extrem teuer. Es ist sehr wichtig, dass Sie Ihren Code sehr effizient schreiben. Denken Sie daran, dass es sich um den Verzweigungsfaktor 35 handelt. Dies bedeutet, dass ein nutzloses "Wenn" irgendwo in Ihrer Heuristik zu 3.3792205e+18
nutzlos werden kann, wenn es irgendwo tief in Ihrem Suchbaum liegt.
Schachprogrammierung ist eine sehr, sehr interessante Herausforderung und es ist an der Zeit, Ihre Programmierfähigkeiten auf eine harte Probe zu stellen. Es gibt einige weitere Punkte, die ich vorschlagen kann, aber ich bin sicher, Sie werden sie selbst entdecken. Es gibt viele weitere Punkte, die ich nicht kenne, aber Sie können sie im Internet finden!
Viel Glück und hab Spaß!
ps Ich kenne Javascript nicht sehr gut, aber irgendetwas sagt mir, dass die Schwierigkeit des Problems ausschlaggebend ist. Wenn man bedenkt, was C ++ alles zu bieten hat, ist es vielleicht besser, Javascript zu löschen und es in C ++ zu tun.