Ich habe in den letzten Monaten eine einfache Schach-Engine in c # erstellt und einige schöne Fortschritte gemacht. Es verwendet einen einfachen Alpha-Beta-Algorithmus.
Um den Horizon-Effekt zu korrigieren, habe ich versucht, die Quieszenzsuche zu implementieren (und mehrere Male gescheitert, bevor es funktionierte). Die Kraft des Motors scheint sich davon etwas verbessert zu haben, ist aber furchtbar langsam!
Vorher konnte ich in etwa 160 Sekunden (irgendwo in einem Midgame-Zustand) eine 6-fache Tiefe suchen, bei der Ruhesuche braucht der Computer etwa 80 Sekunden, um in Suchtiefe 3 zu kommen!
Der Brute-Force-Knoten-Zähler befindet sich bei ungefähr 20000 Knoten in Tiefe 3, während der Zähler für den ruhenden Knoten bis zu 20 Millionen beträgt!
Da dies meine erste Schach-Engine ist, weiß ich nicht, ob diese Zahlen normal sind oder ob ich einen Fehler in meinem Quieszenz-Algorithmus gemacht haben könnte. Ich würde mich freuen, wenn jemand Erfahrener mir sagen könnte, was das übliche Verhältnis von BF Knoten / Quiescent Knoten ist.
Übrigens, nur um zu sehen: (Diese Methode wird von der BF-Struktur aufgerufen, wenn die Suchtiefe 0 ist)
%Vor% Ich bin nicht vertraut mit der englischen Terminologie - ist ein HitMove
ein Zug, bei dem du ein Stück vom Brett entfernst?
In diesem Fall scheint es mir, dass Sie GetAllHitMoves
verwenden, um eine Liste der "lauten" Bewegungen für die Ruhesuche zu erhalten, die dann weiter ausgewertet werden als die üblichen 3 oder 6 Lagen. Dies wird jedoch rekursiv genannt, also wertet man dies immer wieder aus, solange es mögliche HitMoves-Reste gibt. Wenn Sie Ihre Ruhesuch-Suche einschränken möchten, sollten Sie Ihre Leistungsprobleme beheben.
Wie für die Auswahl der Grenze für die Ruhesuche suchen - Wiki besagt:
Moderne Schachmaschinen können bestimmte Bewegungen bis zu 2 oder 3 Mal tiefer als das Minimum suchen.
Tags und Links algorithm c# chess alpha-beta-pruning