Motor oyunda rastgele


11

İki motorun aynı renklerle birbirlerine karşı oynaması durumunda, aynı oyun her seferinde sonuç verir mi? Değilse, motor oyununda rastgelelik nereden geliyor? (Açılış kitabını ihmal etmek, burada yanılmıyorsam, kitap motora eşit derecede iyi oldukları için rastgele iki hareket arasında seçim yapmasını söyleyebilir.)

Alphazero vs. Stockish maçında rastgele bir oyun olduğunu varsayıyorum, aynı oyunu üst üste birçok kez olmadı. Ancak nedenini anlamıyorum. Muhtemelen bunu yapmanın tek yolu, motorun seppuku gibi görünen bir süre subpar hareketini oynatmasını sağlamaktır.


AlphaZero oynayarak öğrenir, bu nedenle her oyundan sonra modeli güncellenir.
ferit

Değerlendirmeye küçük rasgele değer eklemek olası yollardan biridir. Bence stockfish bunu yapıyor.
hoacin

Yanıtlar:


8

AlphaZero vs Stockish maçı ile ilgili olarak, bu soru burada SmallChess tarafından ele alınmıştır .

AlphaZero kenara ( oyun hatlarını keşfinde özel bir Monte Carlo 1 rutini kullanır ), Stockish ve diğerleri gibi olağan sezgisel tabanlı satranç motorları için inşaat tarafından belirleyici olmayan hale getirilir (başkaları da vardır) MC tabanlı rutinleri olan motorlar, AFAIK Rybka böyle bir özelliğe sahipti), rasgeleliğin kaynağı, motorun karar vermede algoritmik olarak getirilmek yerine, genellikle uygulamadaki teknik yönlerin bir sonucudur. Özetle, bunun bir nedeni, motorların tamamen sıralı bir şekilde çalışmamalarıdır (bir görevi birbiri ardına yürütmek). Bunun yerine, motorları daha verimli hale getirmek için, olası hareketler ağacının çeşitli dallarında paralel aramalar yaparlar. Bunu, çoklu iş parçacığı (veya -işleme) olarak adlandırılır, ancak bu biraz farklıdır. Yani CPU'ların birden fazla iş parçacığı aynı andaağacı aramak (ve ziyaret edilen konumların değerlendirmelerini önbelleğe almak için) işlemleri yürütmek, bu nedenle her bir iş parçacığına bir alt ağaç atandığını hayal edin. Bu tür bir uygulamadaki sorun, iş parçacıklarının genel olarak yürütülmesinin her türlü koşullara (bekleme süreleri, RAM swapları, ...) büyük ölçüde bağımlı hale gelmesidir, bu nedenle sonunda diğerlerine izin verilmeden bir ana varyasyon seçilebilir Konuları aramalarını bitirmek için.

Bu gerçekten de sık sık olur, çünkü motor belirli bir süre içinde karar vermek üzere ayarlanmıştır, bu nedenle zaman yönetimi davranışı değiştirir. Ayrıca bu ifadeyi, algoritmayı bilmek ve deterministik diş açma rutinlerini uygulamak, herhangi bir zamandan sonra programın durumunu güvenilir bir şekilde tahmin etmek için yeterli değildir diyerek geri alabilirsiniz. Tabii ki, tüm iş parçacıklarının her zaman aramalarını bitirmesine izin veriyorsa ve bu yürütme sırasında eşzamanlılık sorunları yoksa (örneğin, erişilemeyen belirli bir önbelleğe erişmeye çalışan bir iş parçacığı), davranış gerçekten tamamen tekrarlanabilir olacaktır verilen her şey aynı ise 2 .


1 : Ek eğitim yoluyla (örneğin kendi kendine oynatma) sinir ağının gelişmeye devam etmesi (yeniden ayarlanan parametreler) veya değerlendirme işlevinin sabit, sabit bir tanımlamaya (sezgisel tabanlı motorların aksine) sahip olması gerçeğiyle birlikte ).

2 : O zaman bile, dediğin gibi, açılış seviyesinde, bir açılış kitabı ile, bazen hangi varyasyonun seçileceği konusunda motor tarafından kasıtlı olarak rastgele kararlar verilir. Benzer şekilde, açılış aşamasının dışında, birden fazla varyasyonun eşit değerlendirmelere yakın olduğu (Eval için seçilen çözünürlük dahilinde) anlar olabilir, daha sonra tasarıma dayanarak, rastgele birini seçebilir. Son olarak, motor ayarları düzeyinde de dikkatli olmalısınız, örneğin her bir motor için seçilen arama derinliği ve durma zamanları (ve birbirlerinin akıntı zamanlarında daha fazla hesaplayıp hesaplayamayacakları).


6

@Phonon'a, önceki yanıtlarımı ayrıntılı olarak kapsayan teşekkürler. Bir nokta daha eklemek istiyorum: zaman kontrolü .

Tek deterministik zaman kontrolü düğüm sayısıdır , ancak bu nadirdir. Çok daha yaygın zaman kontrolü - sabit saniye sayısı veya oyun süresi genellikle belirleyici değildir.

Bir örnek deneyelim. Terminalinizde stockfish çalıştırın. Tür:

movetime 20000 git

Bu komut motora 20 saniye sonra hareket etmesini söyler. Benim sonuçlarım:

info depth 23 seldepth 32 multipv 1 score cp 6 upperbound nodes 24325860 nps 1216171 hashfull 999 tbhits 0 time 20002 pv g1f3 d7d5
bestmove g1f3 ponder d7d5

Hareket 1.Nf3 idi. Sonra, Stockish'imi öldürdüm, yeni bir tane başlattım. Yine, 20 saniye. Bende var:

info depth 23 seldepth 32 multipv 1 score cp 20 nodes 26185280 nps 1309067 hashfull 999 tbhits 0 time 20003 pv d2d4
bestmove d2d4 ponder g8f6

1.d4! Aynı pozisyonda, hem 20 saniye arama!

Görüyor musun? Her ikisi de hareket için 20 saniye, ancak Linux işletim sistemindeki dalgalanma nedeniyle ikinci koşum daha derin bir arama yaptı (26185280> 24325860).

Bu küçük deneyin çok iş parçacıklı bile olmadığını unutmayın (iş parçacığı sayısı = 1). Çok iş parçacıklılık, işleri daha da belirleyici olmayan hale getirir.

Google AlphaZero maçında hamleye bir dakika boyunca Stokish verildi. Konu sayısı 64 idi. Stokish'in maçtaki kararları muhtemelen deterministik olamazdı .


Gerçekten, çok öğretici bir örnek ve açıklama.
user929304

Güzel! 1 iplik kasasını bile sergilemek için harika bir fikir.
Ellie

Cevap için teşekkürler. Aptal takip sorusu: Düğüm nedir (satranç oyun motorları bağlamında)?
Allure

@ user3727079 Düğümler, oyun ağacındaki köşe noktalarıdır (benzersiz konumlar) . Örneğin, kök düğüm başlangıç ​​konumuysa, kökten tek katlı 20 benzersiz yasal konum olan 20 alt düğüme sahiptir.
Ellie
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.