Sonsuz işleme gücü verilirse, mükemmel satranç oynayacak bir algoritma var mı?


29

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?


8
Mükemmel satrançla ne demek istiyorsun?
Herb Wolfe

5
@HerbWolfe Sanırım, rakibinin kaybetmeye zorlamalarına izin verecek bir hamle yapamayacağını ve ancak her olası hamlenin rakibini kaybetmeye zorlamasına izin verdiğinde istifa edeceğini sanıyorum.
David Schwartz

5
@DavidSchwartz - "mükemmel satranç", elbette, tanımlanamaz. Ne de "sonsuz işlem gücü" olamaz. Bu, "tüm komut dizilerini 0 zamanında çalıştırır" anlamına mı geliyor? "Sınırsız sayıda işlemci mevcut mu"? FWIW - “mükemmel satranç” tanımım “oyunu asla kaybetmez” dir.
Bob Jarvis - Monica

24
Evet, kaba kuvvet denir. Sınırsız işlem gücüyle, alfa-beta budaması yapmanız gerekmez, ancak arama ağacınızı tutmak için oldukça fazla miktarda depolama alanı da gerekebilir.
Michael

4
Bir "algoritma" kavramı ve sonsuz işlem gücü kavramı gerçekten karışmaz. Algoritmalar ve hesaplanabilirlik teorisi, sınırlı sayıda adımda sonuç elde etme varsayımına dayanmaktadır. Sınırsız sayıda adıma izin verilirse, neyin hesaplanabilir ile neyin yok olmadığı arasındaki fark vardır.
Michael Kay,

Yanıtlar:


62

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.


13
@Wildcard Hayır, hiçbir şey varsaymaz: sadece tüm olası satranç oyunlarını içerir ve eldeki oyuncunun kaybetmediği tüm oyuncuları seçer.
1917'de

11
@gented, algoritmanın “istifa” adımına atıfta bulunuyordum. Bu hiç gerekli bir adım değil.
Joker

38
Üçlü tekrarlama kuralı, arama alanını sınırlandırır, bu nedenle bilgisayarın sonsuz güçlü olması gerekmez , yalnızca astronomik olarak güçlü olması gerekir.
Hoa Long Tam

9
Başvuru için, muhtemel oyunların sayısının ( 10 ^ 120 ), gözlemlenebilir evrendeki atom sayısı ( 10 ^ 80 sırasına göre ) ile karşılaştırılması. En basit algoritma, tüm bu oyunları bulmak ve verilerini depolamak zorunda kalacaktı. Atom başına bir oyun saklamak, gözlemlenebilir evrende tahmin ettiğimizden 10 - 40 kat daha fazla atom alacaktır.
Mühendis Toast,

6
Bu cevap, “sonsuz derecede güçlü bir bilgisayara” başvurduğunuzda sonuna kadar mükemmeldir. Budur değil ne demek ve bu ifade söz ne de tartışma aittir yok.
Don Hatch,

25

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.


9
Bir yan not olarak, eğer gerçekten böyle bir tablo ürettiyseniz, bilgiyi ne şekilde saklarsanız saklayın, gözlemlenebilir evren kadar kabaca 10 ^ 43 kat daha ağır olacaktır; gözlemlenebilir evrende ~ 10 ^ 123 olası satranç pozisyonu ve sadece ~ 10 ^ 80 baryon olduğu düşünülür.
Shufflepants

6
@ Shufflepants, onu baryons kullanarak sakladığımı söyledi?
Michael

3
@Christoph Bilgilerin korunmasını varsayarsak ve dedektörünüzün ve sonsuz işlem gücüne sahip bir süper bilgisayarınız olduğunu varsayarsanız, googolplex yıllarında masa tabanını hawking radyasyonu olarak okuduğunuz gibi yavaş yavaş sürebilirsiniz.
Shufflepants

3
@Shufflepants Gerçek bir kazanma stratejisinin tam bir masa tabanından çok daha az alan gerektirebileceğini unutmayın. Örneğin, Nim'in tanımlaması basit bir kazanma stratejisi var, tüm olası durumlardan büyük bir tablo oluşturmaya gerek yok.
Federico Poloni

1
Belirtildiği gibi bu çözüm uygun değildir. Böyle bir masanın kütlesi bir karadelik oluşturacak ve ondan veri çıkarmak imkansız olacaktı.
emory

19

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.


Bu doğru değil. Sınırsız işlem gücünüz olduğunu söyledi, ancak sınırsız alan hakkında hiçbir şey söylemedi.
ubadub

@ubadub: Sonsuz alana ihtiyacımız olmaz. Oyunun uzunluğu, 50 hamle kuralı nedeniyle sınırlıdır ve olası tüm hamleleri bir konumdan sıralamak için bir kural oluşturulabilir. Sıralanabildikleri için bir tamsayı olarak depolanabilirler. Bu, tüm ağacı dolaşmak için gereken tüm hafızadır. Sonsuz zamanınız varsa, ağaçta istediğiniz kadar yürüyebilirsiniz, böylece her satranç oyununu saklamak zorunda kalmazsınız.
23z ve

Oyunun uzunluğu sınırlıdır, ancak son derece büyüktür; Bir başkasının işaret ettiği gibi, bu tür oyunları saklamak için bir masa hazırlarsanız, "bilgileri sakladığınızın ne olduğu önemli değil, gözlemlenebilir evrenden kabaca 10 ^ 43 kat daha ağır olacaktır; satranç pozisyonları ve gözlemlenebilir evrende sadece ~ 10 ^ 80 baryon
ubadub

2
@ubadub: Bu doğru, ama "bütün bu oyunları saklayacak bir masa" hakkında konuşmuyordu. Tüm ağacın tüm düğümlerini bellekte tutmak zorunda olmayan birçok ağaçla ilgili algoritma vardır.
vsz

@ vsz iyi bir nokta
ubadub

13

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.


4

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.


Algoritmanız yalnızca mükemmel bilgili iki oyunculu oyunlar için çalışır. (A) fonksiyonunun herhangi bir şekilde uygulanması oyun kurallarını ihlal ettiğinden, Stratego gibi gizli bilgi oyunları için düşecektir . Aynı zamanda potansiyel olarak sınırsız süreli oyunlar için de başarısız olur: örneğin, 50 hamleli kuralı satrançtan düşürün ve tahtanın etrafında birbirini kovalayan iki kralın kazanılabilir bir durum olmadığını söyleyemez. Tek söyleyebileceği, bunun bir son durum olmadığı.
Mark

Geçerli noktalar Cevabımı düzenleyeceğim.
gareth

3

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:

  1. Bu hamleyi yapan oyuncu için oyunu kazanan herhangi bir hamle, kazanan bir hamledir.

  2. Bu hareketi yapan oyuncu için oyunu kaybedecek herhangi bir hamle kaybedilen bir hamledir.

  3. 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.)

  4. 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.)

  5. 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:

  1. Kazanmayla sonuçlanan her hamle kazanan bir hamledir.
  2. Kayba neden olan her hareket, kaybedilen bir harekettir.
  3. Rakibin sadece kazanma veya kaybetme hamleleriyle sonuçlanan her hamle ya bir kazanma ya da kaybetme hareketidir.
  4. nMü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.)
  5. Göz nönünde bulundurmamız gereken önceki hareketlerle hareket yok .
  6. Olan her hareket n-1öncesinde hamle ya bir kazanan hamle veya beri kaybetme harekettir nhamle uçları en uzun oyun.
  7. Böylece derinlikteki her hareketi n-2yalnızca kazanan hamle veya kaybedilen hamle izler ve böylece kazanan bir hamle veya kaybedilen hamledir.
  8. Ve böylece ilk hamleye geri dönelim.

1
Kazanma ve kaybetme hamlelerinin tanımlarınız yeterince kapsamlı değil. Örneğin, ilk hamle ne oyunu kazanır (# 1), ne de rakibini sadece kaybedilen hamle (# 4) ile terk etmez, bu yüzden "kazanan bir hamle" değildir. Ne oyunu kaybetmez (# 2), ne de rakibini kazanma hareketi (# 3) ile bırakmaz, bu yüzden "kaybetme hareketi" değildir. Stratejiniz, her hareketin “kazanma hareketi” veya “kaybetme hareketi” olarak tanımlanmasını gerektirir; bu sizin tanımladığınız gibi değildir.
Nükleer Wang

2
@NuclearWang Her hareketi, kazanan bir hareket veya kaybedilen bir hareket olarak tanımlar. Sence üçüncü alternatif nedir? Tüm olası satranç oyunlarının ağacını görselleştirin (ve unutmayın, şimdilik şimdilik bağları veya sınırsız dizileri hariç tutuyoruz). Her zincir kazanır ya da kaybedilir. Bu sonuçta ağaçta toparlanır ve sonunda her hareketi bir kazanan hamle veya kaybedilen bir hamle olarak tanımlar.
David Schwartz

13
@NuclearWang ilk hareket ya olan bir oyuncu için kazanan bir hareket, ya da başka bir satranç (tic-tac-toe gibi) mükemmel oyunuyla bir çizilmiş oyun. Hangisini bilmiyoruz, çünkü hiç kimse bu algoritmayı tamamlamak için çalıştırmak için gereken hesaplama gücüne sahip değildi ve hiç kimse daha doğrudan bir kanıt bulamadı.
hobbs

8
Satrançta rastlantısallık ve gizli bilgi yoktur, bu da “belki” için yer bırakmaz. Her pozisyon kazanılır, kaybedilir veya çekilir ( onları tanımlamayı başaramasak bile ). Ve bu açıklama basitlik için “çizilen” seçeneğini bırakıyor, ancak çoğunlukla 1) kurallara göre çekiliyorsa bir pozisyon çizilir ve 2) kazanma hareketi yoksa ama bir pozisyon alırsa Kazanan bir hamle olmadan rakibi terk eden en az bir hamle.
hobbs

2
@DavidSchwartz: Birisi kaybetme konumunda değilse, mükemmel olmayan her hareket kötüdür. Kaybeden bir pozisyonda, genel olarak tek bir "mükemmel" hareket olmazdı (zorla taşıma durumu hariç), çünkü herhangi bir yasal hareketin akla gelebilecek (muhtemelen yüksek oranda tartışılan) durumlarda tek kazanan ya da çekme hareketi olma olasılığı olabilir. Ancak istifa, açıkça belirsiz en kötü "hamle" gibi görünüyor. Oyunun, d4 ile Beyaz için kazandığı kanıtlanmış olduğunu varsayalım. Eğer cevap bir satranç programı oynamak ister misiniz 1. d4ile ...resigns?
supercat

2

: Üç işlevlere sahip varsayalım win_state, get_playerve next_states. İçin giriş win_statebir oyun durumudur ve çıkış beyaz ise beyaz ise, 0 ise berabere, 0, siyah ise beyaz ise, Noneaksi halde. İçin giriş get_playerbir 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)

0

Bir arama tablosu kullanın

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]

Yakalayış

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.

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.