Sonsuz işleme gücü verilirse, bir bilgisayarın hiç bir zaman kaybetmemesi için mükemmel bir şekilde satranç oynayabileceği bir algoritma var mı?
Öyleyse, bunun için sözde kodu nerede bulabilirim?
Sonsuz işleme gücü verilirse, bir bilgisayarın hiç bir zaman kaybetmemesi için mükemmel bir şekilde satranç oynayabileceği bir algoritma var mı?
Öyleyse, bunun için sözde kodu nerede bulabilirim?
Yanıtlar:
Bir algoritma var mı? Evet. Göre Zermelo Teoremi ilk oyuncu ya bir kazanma stratejisi vardır, ya da ikinci oyuncu kazanan bir stratejisi vardır, ya iki oyuncu beraberlik zorlayabilirsiniz:, satranç gibi sonlu deterministik mükemmel-bilgi iki oyunculu oyun için üç olasılık vardır. Satranç için hangisinin olduğunu henüz bilmiyoruz. (Diğer taraftan, dama çözüldü : her iki oyuncu da berabere zorlayabilir.)
Kavramsal olarak, algoritma oldukça basittir: tam bir oyun ağacı oluşturmak , yaprak düğümlerini analiz etmek (oyun bitiş pozisyonları) ve kazanan ilk hamleyi yapmak, istifa etmek veya berabere teklif etmek.
Sorun ayrıntılarda yatıyor: yaklaşık 10 43 olası pozisyon ve daha da fazla sayıda hamle var (çoğu pozisyona birden fazla şekilde ulaşılabilir). Bundan yararlanmak için sonsuz derecede güçlü bilgisayarınıza gerçekten ihtiyacınız var, çünkü bu algoritmadan faydalanabilen bir bilgisayar ya bilinen evrene uymaz ya da evren bitene kadar hesaplamayı bitirmez.
Bkz. Https://en.wikipedia.org/wiki/Endgame_tablebase .
Sonsuz bilgisayar gücüyle, başlangıç pozisyonu için böyle bir masa inşa edilebilir ve satranç çözülebilir .
Uygulamada, yalnızca en fazla yedi "erkek" olan pozisyonları (piyonlar ve parçalar, kralları sayarak) mevcut süper bilgisayarlar kullanılarak çözüldü, bu yüzden satranç çözmekten çok uzağız. Sorunun karmaşıklığı, parça sayısıyla birlikte üssel olarak artar.
Gerçekten sonsuz bir işleme gücünüz varsa, böyle bir algoritma yazmak gerçekten önemsiz olurdu . Satrançta sınırlı sayıda olası durum olduğu gibi, teoride mükemmel bir oyun yolu bulana kadar sadece hepsini yineleyebilirsiniz. Korkunç derecede verimsiz olurdu, ancak sınırsız işlem gücünüz varsa, farketmez.
Soruyu doğrudan ele almak için: evet böyle bir algoritma var. Buna minimax denir. (Oyunsonu masa tabanları bu algoritma kullanılarak üretilir (geriye!), Fakat basit eski basit minimax algoritması ihtiyacınız olan tek şeydir). Bu algoritma herhangi iki oyuncu sıfır toplamı oyunu mükemmel oynayabilir. Sözde kodu burada bul:
https://en.wikipedia.org/wiki/Minimax
Bu algoritmanın türevlerinin modern bilgisayar satranç programları tarafından kullanıldığına dikkat edin.
Sadece mükemmel satranç oynamak için bir algoritma olmakla kalmaz, aynı zamanda (sonsuz kaynaklar göz önüne alındığında) herhangi bir belirleyici mükemmel bilgi sonlu süresi iki oyunculu oyunu mükemmel bir şekilde oynayacak kısa bir program yazmak mümkündür .
Oyun motorunun oynadığı oyunun kurallarını bile bilmesine gerek yok. İhtiyacı olan tek şey bir "oyun durumunun" opak bir temsilidir ve (a) herhangi bir oyun durumunun verildiği, bir sonraki oyun durumunun bir listesini sağladığı ve (b) oyun durumunun verildiği bir oyuncunun kazanıp kazanmadığına karar veren fonksiyonlar 1 , oyuncu 2 için bir galibiyet, beraberlik ya da son durum değil.
Bu fonksiyonlar göz önüne alındığında basit bir özyinelemeli algoritma oyunu "çözer".
Bu gerçek, önceki cevaplarda satranç programcısı (minimax) ve Acccumulation (programın python'da bir sürümünü sağlayan) tarafından sağlanmıştır.
20 yıl önce böyle bir program yazdım. Noughts-and-crosses oynayarak test ettim (Amerikalıysan tic-tac-toe). Tabii ki mükemmel bir oyun oynadı.
Elbette bu, ciddi bir oyun için akla gelebilecek herhangi bir bilgisayarda hızla düşecek. Özyinelemeli olduğu için, oyun ağacının tamamını etkin bir şekilde yığında oluşturuyor, bu nedenle diğer cevaplarda belirtilen 10 ^ 123 satranç halini analiz etmek için bir yere gitmeden önce bir "yığın taşması" (çok fazla amaçlanan) kazanacaksınız. Fakat prensipte bu küçük programın işi yapacağını bilmek eğlencelidir.
Benim için bu aynı zamanda AI ile ilgili ilginç bir şey söylüyor: Deep Blue veya Go Zero tarafından sergilenen bir çok "zeka" ya da aslında Chess veya Go oynayan bir insan tarafından sergilendiğini düşündüğünüzde, bu oyunların önemsiz, tam olarak hesaplanabilir optimum olduğu bir duygu var. çözümleri. Zor olan, makul bir sürede en iyi olmasa da iyi bir çözüm elde etmektir.
Sadelik için çekme veya sonsuz hamle dizisi olasılıklarını görmezden geleceğim. Algoritma anlaşıldıktan sonra, onu bu durumlara genişletmek özellikle zor değildir.
İlk olarak, bazı tanımlar:
Bu hamleyi yapan oyuncu için oyunu kazanan herhangi bir hamle, kazanan bir hamledir.
Bu hareketi yapan oyuncu için oyunu kaybedecek herhangi bir hamle kaybedilen bir hamledir.
Diğer oyuncuyu en az bir kazanan hamle bırakan herhangi bir hamle de kaybedilen bir hamledir. (Rakip bu hareketi yapıp zararı zorlayabildiğinden beri.)
Diğer oyuncuyu yalnızca kaybedilen hamlelerle terk eden herhangi bir hamle de kazanan bir hamledir. (Rakibinizin ne hareketi olursa olsun kazanırsınız.)
Mükemmel bir strateji, herhangi biri kalırsa her zaman kazanan hamle yapmak ve yalnızca kalan hamleleri kaldığında istifa etmek anlamına gelir.
Şimdi, mükemmel bir strateji yazmak çok önemlidir. Sadece tüm olası hareket dizilerini patlat ve kazanma / kaybetme hareketlerini tanımla. Çıkmazı görmezden gelmek, sonuçta bu her hareketi ya kazanan bir hareket ya da kaybedilen bir hareket olarak tanımlar.
Şimdi, strateji önemsiz. Olası tüm hareketlerine bak. Kazanan herhangi bir hamle kalırsa, bir tane al ve kazan. Sadece kaybedilen hamleler kalırsa, istifa et, çünkü rakibin seni kaybetmeye zorlayabilir.
Bir çıkmaz olasılığını içerecek şekilde stratejiyi ayarlamak zor değildir.
Güncelleme : Bunun her hamleyi nasıl kazanan veya kaybedilen bir hamle olarak tanımladığının açık olmadığı durumda:
n
Mümkün olan en uzun satranç oyununda hamle sayısını arayın . (Bunları dahil etmek zor olmasa da, şimdilik sınırsız dizileri görmezden geliyoruz.)n
önünde bulundurmamız gereken önceki hareketlerle hareket yok .n-1
öncesinde hamle ya bir kazanan hamle veya beri kaybetme harekettir n
hamle uçları en uzun oyun.n-2
yalnızca kazanan hamle veya kaybedilen hamle izler ve böylece kazanan bir hamle veya kaybedilen hamledir.1. d4
ile ...resigns
?
: Üç işlevlere sahip varsayalım win_state
, get_player
ve next_states
. İçin giriş win_state
bir oyun durumudur ve çıkış beyaz ise beyaz ise, 0 ise berabere, 0, siyah ise beyaz ise, None
aksi halde. İçin giriş get_player
bir oyun durumudur ve çıkış siyah ise siyah ise 1, beyaz ise 1'dir. Bu giriş next_states
, yasal bir hamleden kaynaklanabilecek bir sonraki oyun durumlarının bir listesidir. Daha sonra, bir oyun durumu ve bir oyuncu verildiğinde, aşağıdaki işlev size o oyuncunun kazanması için hangi oyun durumuna geçmeniz gerektiğini söyleyecektir.
def best_state(game_state,player)
def best_result(game_state):
if win_state(game_state):
return(win_state)
else:
player = get_player(game_state)
return max([best_result(move)*player for move in next_states(game_state)])*player
cur_best_move = next_states(games_state)[0]
cur_best_outcome = -1
for state in next_states(game_state):
if best_result(state)*player > cur_best_outcome:
cur_best_outcome = best_result(state)*player
cur_best_move = state
return(best_move)
Evet. Bu kolay. Sonsuz işlem gücüne bile ihtiyacınız yok. İhtiyacınız olan tek şey, her tahta pozisyonu için, o pozisyonda oynamak için en iyi hareketi içeren bir arama tablosu. İşte sözde kodu:
def play-move(my-color, board-position):
return table-of-best-moves[my-color, board-position]
Tek yakalama, bu arama masasının çok, çok büyük - belki de Samanyolu galaksisinden daha büyük olması - ve inşa etmek için uzun zaman alacağı - belki de evrenin şu anki yaşından daha uzun olması gerektiğidir. Satrançta keşfedilmemiş bazı düzenlilikler, şu anda görebildiğimizden çok daha basit. Ancak bu arama tablosuna sahipseniz, her seferinde mükemmel bir hareket seçmek için alt rutin bir CPU talimatı kadar küçük bir sürede uygulanabilir.
Ayrıca, şu anki satranç bilgimiz göz önüne alındığında, mükemmel oyunun kaybetmeyeceğinizi garanti ettiğinden emin olmanın yolu yoktur. Örneğin, mükemmel oyun Beyaz için bir kazanmayı garanti ederse, Siyah mükemmel şekilde oynasa bile Siyah kaybeder.