Satranç motorları daha önce analiz edilen pozisyonların tümünü hamleler arasında depolar mı?


17

Satranç motorlarıyla oynamaya başlıyorum. En iyi satranç motorlarının hareket etmesinin birkaç dakika sürebileceğini fark ettim. Nedenini merak ediyorum. Her hareketten önce motor, gelecekteki tüm yasal ilerlemeleri bir derinliğe inceliyor. Ancak bu egzersizi bir sonraki hamle için tekrarlıyor gibi görünüyor. Önceki hamlenin incelenen hamle ağacına zaten dahil edildiği göz önüne alındığında, bu verimsiz değil mi? Yoksa yanlış mı anladım?

[Düzenle: Hareket analizlerinin önbelleğe alınmamasının nedeninin, bilgisayarın analizi yeniden başlatmayı daha hızlı hale getiren bazı bellek sınırlamalarından kaynaklandığını varsayıyorum]

Yanıtlar:


20

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=2vardır 20 * 20 = 400olası 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 .


Çok ilginç, bu, motorumla derinlemesine analiz ettiğimde RAM'imin neden neredeyse çöktüğünü açıklıyor (bir süredir beni şaşırtan bir gizem).
Pablo S. Ocal

Teşekkür! Çok ilginç. Satranç motoru wiki tartışmasını büyüleyici buldum.
Dom

3

Tipik bir satranç motoru, bazı pozisyonları ve parantez alfa-beta puanlarını, sonraki aramalar sırasında danışılabilecek bir transpozisyon tablosunda saklar . Bir sonraki hareketi seçmek için bu tabloya doğrudan danışılmaz, ancak bu hareketi aramayı iki şekilde daha verimli hale getirir.

  1. Bir arama ağacında bir konuma, bir dizi hareketin aktarılması veya permütasyonu ile erişilmesi muhtemeldir. Tabloya danışılabildiğinden, böyle bir konumun, konum ziyaret edildiğinde ve yeniden ziyaret edildiğinde düzinelerce kez yerine yalnızca birkaç kez (farklı sabit arama derinlikleri için) değerlendirilmesi gerekebilir.

  2. Alfa-beta aramaları için standart bir teknik yinelemeli derinleştirmeyi kullanmaktır , terminal derinliğine ulaşılana kadar ağacı daha büyük bir arama derinliğinde tekrarlayarak araştırır. Önceki iterasyonlarda hesaplanan değerleme puanları, sonraki iterasyonlarda aranan hareketleri sıralamak için kullanılır. Alfa-betanın kötü hamleler öncesinde iyi hamleler aranması durumunda daha iyi performans gösterdiği (yani arama ağacının daha fazla budaması) bilinmektedir.


3

Motorun hafızasını gösteren örnek:

Derin teorik yeniliklerin keşfedildiği konumları, özellikle Caruana ve Topalov'un bu yıl oynadığı oyunu düşünün . Motorun 12 hareketinden sonra pozisyonunu az ya da çok kısa bir süre (örneğin 10-15 dakika) analiz etmesine izin verdiğinizde, önerilen hareketleri kontrol edebilir ve TN ( 13.Re2!) aralarında görünmediğini görebilirsiniz. Hareketi kendiniz tanıtın, bir hamleye geri dönün ve motorun aşağı yukarı aynı anda tekrar aynı pozisyonu analiz etmesine izin verin. Şaşırtıcı bir şekilde, bazı düşüncelerden sonra, motor şimdi TN'yi en iyi hareketler arasında ele alıyor ve onaylıyor.

DÜZENLEME: Orijinal yanıt (aşağıda tutulur) yanlıştır, ancak üstte belirtilen motor belleğine yararlı bir örnek sağlar.

Bildiğim kadarıyla, her harekette neredeyse sıfırdan ağaç aramaya başlarlar.

Ancak, her hareket için değerleri gerçekleştiren bir tür fonksiyona sahip olmaları gerekir ve bu fonksiyonun kesinlikle kısa süreli bir hafızası vardır. Bazı örnekler derin teorik yeniliklerin keşfedildiği konumlardır, özellikle Caruana vs Topalov'un bu yıl oynadığı oyun . Motorun hareket 12'den sonraki pozisyonunu az ya da çok kısa bir süre için analiz etmesine izin verdiğinizde (diyelim ki 10-15 dakika) önerilen hareketleri kontrol edebilir ve TN ( 13.Re2!) aralarında görünmediğini görebilirsiniz. Hareketi kendiniz tanıtın, bir hamleye geri dönün ve motorun aşağı yukarı aynı anda tekrar aynı pozisyonu analiz etmesine izin verin. Şaşırtıcı bir şekilde, bazı düşüncelerden sonra, motor şimdi TN'yi en iyi hareketler arasında ele alıyor ve onaylıyor.

Satranç yazılımı konusunda uzman değilim, ama bu oluyor. Konum için hareketleri değerlendiren fonksiyonun bir hafızası varsa (en az dediğim gibi) bu en azından kısmen açıklanabilir.


2
Hayır. Motorlar ağaç aramasını sıfırdan başlatmaz. Cevabıma bakın.
HelloWorld

Üzgünüz ama cevabınızı biraz yanıltıcı buluyorum
BlueTrin

1
Daha net yapmaya çalıştım. Söylendiği gibi, cevap yanlış, ancak örnek tutar ve kontrol etmek için güzel bir şeydir (bizim için romantikler, bilgisayarların insanlardan çok daha güçlü olmasına rağmen, bazen sezgi, deneyim ve sıkı çalışmanın onların orijinal).
Pablo S.Ocal

@pablo, örneğin iyi. Hafıza var çünkü aramayı ilk çalıştırdığınızda, motor konum değerlendirmelerini bir tabloda saklıyor. Aynı konumu tekrar aradığınızda, motor çok daha hızlı arama yapabilir. Bu nedenle size farklı bir sonuç verecektir.
HelloWorld

Bu son düzenleme, yanıltıcı olduğunu düşünen @BlueTrin içindi.
Pablo S.Ocal

2

Henry Keiter zaten size genel bir cevap verdi, size daha teknik bir cevap vereceğim. Her şey transpozisyon tablosu, arama derinliği ve kesim ile ilgilidir. Buradaki tartışma diğer cevaplardan çok daha tekniktir, ancak satranç programlamasını öğrenmek isteyenler için faydalı olacaktır.

Bir pozisyon daha önce değerlendirildiyse, hareketleri saklamak için yeterli hafıza olduğu sürece değerlendirme puanının tekrar kullanılabileceği yaygın bir yanlış anlamadır. Satranç programlaması bundan daha karmaşıktır. Sonsuz hafıza bile olsa, yine de pozisyonları aramak zorunda kalacaksınız. Her hareket için derinliği ve sınırı ile bir değerlendirme puanı eklenir. Örneğin, motor bir hamleyi başarısızlıkla depolarsa, tablo girişinin bir alt sınırı olur. Bu, bir konum arıyorsanız, önceki değerlendirme puanını kullanıp kullanamayacağınızı kontrol etmek zorunda kalacağınız anlamına gelir.

Bunun dışında her değerlendirmenin kendisine bağlı bir derinliği vardır. Yinelemeli derinleşen bir çerçevede, her yinelemenin derinliğini artırdıkça, önceki yinelemede zaten aradığınız konumları aramanız gerekir.

Sorunuzun kısa cevabı, bir motorun önceki analiz edilen konumların tümünü (yeterince bellek olduğu sürece) saklamasıdır, ancak saklanan bu sonuçlar düşündüğünüz kadar kolay yeniden kullanılamaz . Daha az tekrarın olduğu bir açılış aşamasında, saklanan bu sonuçlar, hareket sırası ve bir düzine hareket azaltma sezgiselliği için en kullanışlıdır. Örneğin, son derinlikteki en iyi hareketin mevcut derinlikteki en iyi hareket olduğunu varsayarsak, hareket listelerini sıralar ve diğer hareketlerden önce en iyi hareketi ararız. İnşallah erken bir başarısızlık derecesi alırız.

Pozisyonları saklamak için sonsuz hafızamız yok. Bir karma algoritması tanımlamamız gerekir. Zobrist karma algoritması bize sözde rastgele bir dağıtım verir, ancak er ya da geç bazı mevcut girişleri değiştirmek zorunda kalırız.


0

Her motorun kendi zaman yönetimi şeması vardır. Bazı motorlar ve GUI'ler, motorun oynayacağı hızı ayarlamanıza izin verir. Motorlar, zaman yönetimi altprogramları veya kullanıcı ayarları tarafından getirilen kısıtlamalar göz önünde bulundurularak mümkün olduğunca hesaplar / değerlendirir / minimaks. Bir motor uzun bir süre düşünüyorsa, muhtemelen oyunun zaman kontrolü yavaştır veya kullanıcı yavaş çalışacak şekilde ayarlamış olabilir.

Motorun hesapladığı konumlar ve değerlendirmeler bir karma tabloda saklanır. Kullanıcı, mevcut karma değerinin boyutunu çoğu UCI motorunun ayarlarında ayarlayabilir. Motorun kendisi belirli miktarda RAM kullanır ve karma tablo boyutunuzu çok yüksek ayarlarsanız, bilgisayar karma sürücüyü sanal RAM biçiminde sabit sürücünüzde depolamaya başlar. Sabit sürücü belleğine RAM'den daha yavaş erişilir ve genellikle sabit sürücünün çalkalandığını duyabilirsiniz. Birçok kullanıcı karma tablo boyutunu mevcut RAM'e sığacak şekilde ayarlar.

Herhangi bir hash tablosunun büyük bir kısmı motor ve rakibi hamle yaptıktan sonra dikkate alınan diğer pozisyonlar artık geçerli olmadığında işe yaramaz hale gelir. Motor, karma içinde saklanan değerlendirmeleri yeniden kullanacaktır, ancak motor aynı çizginin derinliklerine indiğinde ufuk etkilerinden dolayı bazı değerlendirmeler yanlıştır, bu nedenle genellikle aday hareketlerini yeniden sipariş etmek zorundadır.

Karma miktarı sonlu olduğundan, bir motor aynı zamanda yeni bilgileri eklerken karmadan hangi bilgilerin silineceğine karar vermelidir. Motor hangi hamlelerin oynanacağını önceden bilmiyor, bu nedenle yeni veriler ekledikçe yararlı olabilecek bilgileri yanlışlıkla silebilir.

Motorlar genel olarak tüm yasal hareketleri belirli bir derinliğe kadar incelemez. Ağacın belirli dallarını ileri ve geri budamaya dayalı olarak dikkate almazlar. Ayrıca, bir yaprak düğümü konumunda henüz yapılmayan çekimler veya kontroller varsa, motor sessiz (durgun) bir konuma ulaşıncaya kadar bu çizgide devam edecektir. Gerçek ağaç muhtemelen bazı yerlerde oldukça derinken, az sayıda hareketten sonra diğer çizgiler kesilmiş olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.