Bu sorun, bazı kodlama sorunlarına oldukça benzer. Stockfish'in halihazırda önceden hesaplanmış birden fazla hareket seti var. Birden fazla bitboard kullanan satranç tahtasının durumunu temsil eder ve daha sonra kategorik (kontroller, temposlar, şah matlar) ve istatistiksel gösterimler (parça değerleri) kullanarak tahta konumlarını değerlendirmek için kullanır. Hemen hemen, gelişmiş bir alfa beta arama algoritması kullanır. Aynı konumu birkaç kez analiz etmemek için, bir aktarım tablosu kullanılır. Bu, aslında birçok grafik teorisi programlama probleminde temel olan arama fonksiyonuna uygulanan ezberlemedir. Bu nedenle, aslında oldukça basit bir algoritma kullanır. İşte daha önce yapılan bazı araştırmalar:
Adım 1. Düğümü başlatın
Adım 2. Durdurulan aramayı ve anında çizmeyi kontrol edin. Burada düğüm sınırını zorunlu kılın. (Bu, Stockfish 2.3.1'den itibaren yalnızca 1 arama iş parçacığı ile çalışır.)
Adım 3. Montaj İlişkisi mesafesi budama. Bir sonraki hamlede çiftleşsek bile, puanımız en iyi ihtimalle mate_in (textssrightarrowtextply + 1textssrightarrowtextply + 1 olacaktır, ancak alfa zaten daha büyükse, ağaçta yukarı doğru daha kısa bir mat bulunursa, o zaman daha fazla aramaya gerek yoktur, asla Geçerli alfayı yen. Aynı mantık, ancak ters işaretler, eş vermek yerine çiftleşmenin tam tersi durumunda da geçerlidir, bu durumda bir başarısız-yüksek puan verir.
4. Adım Transpozisyon tablosu araması. Kısmi arama puanının önceki bir tam aramanın üzerine yazmasını istemiyorum. Hariç tutulan bir hareket durumunda farklı bir konum anahtarı kullanıyoruz.
Adım 5. Konumu statik olarak değerlendirin ve ebeveynin kazanç istatistiklerini güncelleyin
6. Adım. Tıraşlama (PV düğümlerinde ihmal edilir)
Adım 7. Statik boş hamle budama (PV düğümlerinde ihmal edilir). Rakibin bir Eğer boş bir hamle yaparsak, puanı futility_margin'den (derinlik) daha fazla azaltacak hamle.
Adım 8. Doğrulama denizi ile boş hareket araması rch
Adım 9. ProbCut. Çok iyi bir yakalamaya sahip olursak ve azaltılmış bir arama betanın çok üzerinde bir değer döndürürse, önceki hamleyi (neredeyse) güvenli bir şekilde budayabiliriz.
10. Adım. Dahili yinelemeli derinleşme.
Adım 11. Hareketler arasında döngü yapın. Hiçbir hamle kalmayana veya bir beta sınırlama oluşana kadar tüm sözde yasal hareketleri tekrarlayın
Adım 12. Kontrolleri ve tehlikeli hareketleri uzatın
Adım 13. Boşluk budama.
Adım 14. Harekete geçin
Adım 15. Azaltılmış derinlik araması (LMR). Hareket başarısız olursa, yüksekler tam derinlikte yeniden aranacaktır.
Adım 16. Tam derinlik arama, LMR atlandığında veya yüksek başarısız olduğunda.
Adım 17. Hareket etmeyi geri al
18. Adım. Yeni en iyi hamleyi kontrol edin
Adım 19. Ayrımı kontrol edin
Adım 20. Eşleşmeyi ve çıkmazlığı kontrol edin
21. Adım Tabloları güncelleyin. Transpozisyon tablosu girişini, katilleri ve geçmişi güncelleyin
Profesörün araştırmasının ne hakkında konuştuğunu açıklamaya çalışacağım. Stockfish, yasal hamle için bir arama ağacı oluşturur. Ardından, önce sığ bir arama alanı yürüterek, her hareketin iyi mi yoksa kötü mü ve ne kadar iyi veya kötü olduğunu değerlendirmeye başlar, ve sonra elde edilen alfa / beta sınır değerlerini daha derin bir arama için başlangıç değerleri olarak kullanmak. Stockfish ayrıca parçalara da öncelik veriyor. Örneğin, atlara merkezde öncelik verilir, yani bir at ve fil merkezde çatallanırsa, fili hareket ettirerek başka önemli kazançlar olmadığı sürece atı hareket ettirecektir. Bu karmaşık görünse de, bu uygulama yaklaşık olarak günlüktür (olası hamle sayısı), dolayısıyla hala oldukça hızlıdır.