Satranç motorlarını programlamak çok karmaşık bir bölgedir, bu yüzden sizi bu konuda çok fazla bilgiye sahip olan Satranç Programlama Wiki'ye yönlendireceğim .
Arka fon
Satranç hesaplamaları (ve benzer birçok şey) genellikle "oyun ağaçları" veya " karar ağaçları " olarak modellenir ve düşünülür . Genel olarak, bu ağaç her olası hareket için bir düğüme giden, en az bir düğüm (mevcut konumu), yönlendirilmiş bir grafiktir, her biri her bir olası daha fazla düğüme açar sonraki hareket, ve böyle devam eder.
En basit, kaba kuvvet formlarında, Satranç motorları bu ağaçtaki tüm pozisyonları bir miktar derinlik sınırına ("kat") kadar üretir ve sonuçta ortaya çıkan her pozisyonu bazı karmaşık kriterlere göre değerlendirir 1 . Sonra en iyi sonuca götürecek gibi görünüyor. Günümüzde, motorun bakması gereken pozisyon sayısını sınırlamak için çok karmaşık teknikler geliştirildi, ancak bu cevabın amacı için bunları görmezden geleceğim, çünkü gerçek meseleyi el.
Matematik Teğet
Motorların tipik olarak her hareketi dikkate almak için yaklaşık olarak aynı süreyi almasının temel nedeni, karar ağacının boyutunun derinlikle katlanarak artmasıdır ( k
).
Başlangıç pozisyonunu düşünün. Ağacın ( k=0
) üstü bir düğümdür. Beyaz için yirmi olası ilk hamle var, bu yüzden derinlikte yirmi düğüm var k=1
. Ardından, Siyah ayrıca White'ın seçeneklerin her biri için yirmi mevcut hamle vardır: o kadar k=2
vardır 20 * 20 = 400
olası pozisyonları! Ve oyuncular sadece parçalarını geliştirdikçe daha da kötüleşiyor!
Örneğin, herhangi bir zamanda her oyuncu için her zaman yirmi olası hamle olduğunu varsayalım 2 . Bilgisayara her oyuncu için beş hamle ileriye bakmasını söylersiniz (on kat). Her seviyede kaba kuvvet ağacının boyutuna bakalım. Eğlenmek için, ağaçtaki toplam pozisyon sayısına da bakacağız (yukarıdan verilen seviyeye).
Ply | Positions | Total Tree Size
----------------------------------------
0 | 1 | 1
1 | 20 | 21
2 | 400 | 421
3 | 8000 | 8421
4 | 160000 | 168421
5 | 3200000 | 3368421
6 | 64000000 | 67368421
7 | 1280000000 | 1347368421
8 | 25600000000 | 26947368421
9 | 512000000000 | 538947368421
10 | 10240000000000 | 10778947368421
Her seviyenin bir önceki seviyeden katlanarak daha büyük olmasının sonucu, tüm ağacın boyutunun en alt seviyeye hakim olmasıdır . Yukarıdaki örneği düşünün: yalnızca son seviye on trilyon düğüm içerir. Ağacın geri kalanının tamamı sadece beş yüz milyar içerir. Onuncu kat, tüm ağaçtaki düğümlerin yaklaşık% 95'ini içerir (bu aslında her düzeyde doğrudur). Uygulamada bunun anlamı, tüm arama süresinin "son" hareketi değerlendirmek için harcanmasıdır.
Cevap
Peki bu sorunuzla nasıl bir ilişki içindedir? Diyelim ki bilgisayar yukarıdaki gibi on kat olarak ayarlandı ve ayrıca değerlendirmelerinin sonuçlarını "hatırlıyor". Bir hareketi hesaplar, oynatır ve sonra bir hamle yaparsınız. Şimdi iki hamle yapıldı, bu yüzden gerçekleşmemiş hamlelerle ilgili hafızadaki tüm pozisyonları budadı ve zaten hesapladığı sekiz hamleden aşağı inen bir ağaçla kaldı: 26.947.368.421 pozisyon!
Tamam! Bu yüzden sadece son iki katı hesaplamamız gerekiyor! Her derinlikte 20 hamle tahminimizi kullanarak, burada hesaplamamız gereken toplam hamle sayısı hala on trilyonun üzerindedir. Daha önce hesapladığımız pozisyonlar olasılıkların sadece% 2.5'ini oluşturmaktadır! Bu nedenle, son hamlenin sonuçlarını önbelleğe alarak bile, umabileceğimiz en iyi şey, hızda% 2.5'lik bir artış! Bu nedenle, programınız önceki sonuçları önbelleğe alsa bile, genellikle hamleler arasında önemli bir hızlanma görmezsiniz (bilgisayar elbette zorla bir eş veya başka bir şey bulduğu durumlar hariç!).
Sadeleştirme Feragatnamesi
Orada bir sürü çok üstünde programlama wiki bağlantılı olan ve yalnızca geniş matematiksel terimlerle cevabını açıkla girişiminde yüzden bu soruya, katılan karmaşıklık. Gerçekte, programlar yapmak hareket geçmekle ağacın genel önbellek parçalarını ve diğer nedenler bu tek başına yeterli neden vardır - bir sırtı bazı basit nedenler (örneğin belli bir hat sekiz hamle iyi out görünebilir ama uçları dokuz hareket halinde eş dostum!) ve çok karmaşık olanlar (genellikle çeşitli akıllı budama yöntemleri ile ilgili). Bu nedenle bilgisayar, önceki hamlenin kesme derinliğine bağlı olarak kötü varsayımlar yapmaktan kaçınmak için daha ileriye bakmaya devam etmelidir.
1 Burada sezgisel işlevlere girmeyeceğim, çünkü burası inanılmaz derecede karmaşık bir alan, ancak burada konum önbellekleme şemalarıyla da elde edilebilecek bazı kazanımlar var.
2 Ortalama dallanma faktörü 20 muhtemelen çok düşüktür .