Deep Blue için kullanılan algoritma için konuşamam, ancak satranç programlamasındaki gelişmeleri açıklamaya çalışacağım. Hız en büyük gelişmedir. Deep Blue, çok işlemcili özel bilgisayarlar kullandı, bu yüzden bir karşılaştırma gerçekten mümkün değil.
https://chessprogramming.wikispaces.com/ harika bir kaynak, ancak gezinmek zor.
Bir satranç motorunu iyileştirmek için ayarlanan 3 ana işlev vardır: değerlendirme, hareket oluşturma ve arama işlevleri.
Kurallarda birçok istisna olduğu için değerlendirme programlaması en zor olandır. Sabit disk alanı daha ucuz hale geldikçe, eval işlevi daha fazla özel durumun değerlendirilmesini sağlar.
Hareket oluşturma ve hareket ettirmeyle birlikte hareket üretimi, çok fazla bellek tüketir, çünkü birçok kez önceden oluşturulması gerekir. En yaygın nesil işlevler posta kutusu, bitboard, 0x88, 8x8, genişletilmiş kartlar (10x10, 10x12) ve önceden belirlenmiş bir hareket dizisi / tablodur (* Dizinlenmiş bir hareket tablosu kullanıyorum). Mevcut görüş, bitboard'ların daha hızlı olduğu ve sihirli bitboard'ların kullanılması bunu% 30'a kadar hızlandırdığıdır. Havalı satranç motorunun profesörü ve yaratıcısı Dr. Robert Hyatt, önemli bir hız artışı olmadığını iddia ediyor.
İlk arama işlevi ilkel min-max işlevleridir. Temel olarak, hareket etmek ve rakibin puanını en aza indirmek için tarafın puanını en üst düzeye çıkarmaya çalıştınız. Alfa-Beta ilk gelişmeydi. Transpozisyon tablosu, kesme değerleri, aspirasyon pencereleri ve geçmiş buluşsal yöntemleriyle aranan hareket sayısını azalttılar. Bunlar önce derinlemesine aramalardır. Ayrıca, diğer hamleleri araştırmanın sonuçsuz olacağına dair en derin ümitle “en iyi” hamleleri araştırmaya çalışan iç yinelemeli derinleştirme araştırması da vardır.
NOT: Dizin tablom. GNUChess ve Jester, hareketlerini oluşturmak için bir dizin dizisi kullanırlar. Diziyi olası hareketlerle doldurarak motoru başlatırlar. Altı parçayı alın ve her kareden elde edilebilen yasal hareketleri hesaplayın. Her parçanın bir [64] [8] dizisi vardı. Bu fikri aldım ve iki dizine ve bir tabloya sıkıştırdım. Tabloda 16 hareketin mümkün olup olmadığını söyleyen bir değer bulunur, bir dizin hareketin ofsetini tutar ve diğeri maskeyi tutar.
ofset [] = {-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, ...};
Daha sonra kayma hareketinin oluşturulması, hareket masasına karşı izin verilen ofsetlerinde maskesinin geçerliliğini aramak kadar kolaydır.