Se la potenza di elaborazione è infinita, esiste un algoritmo che gioca perfettamente a scacchi?


29

Esiste un tale algoritmo in cui, se dotato di una potenza di elaborazione infinita, un computer potrebbe giocare a scacchi perfettamente in modo da non perdere mai?

In tal caso, dove posso trovare lo pseudo codice per esso?


8
Cosa intendi con scacchi perfetti?
Herb Wolfe,

5
@HerbWolfe Presumo che significhi che non fa mai una mossa che consente al suo avversario di costringerlo a perdere e si dimette se, e solo se, ogni mossa possibile permette al suo avversario di costringerlo a perdere.
David Schwartz,

5
@DavidSchwartz - "scacchi perfetti", ovviamente, non possono essere definiti. Né può "potenza di elaborazione infinita". Questo significa "esegue tutte le sequenze di istruzioni in 0 tempo"? "È disponibile un numero infinito di processori"? FWIW - la mia definizione di "scacchi perfetti" è "non perde mai un gioco".
Bob Jarvis - Ripristina Monica il

24
Sì, si chiama forza bruta. Con una potenza di elaborazione infinita non è necessario eseguire la potatura alfa-beta, anche se potrebbe essere necessaria una quantità piuttosto grande di spazio di archiviazione per contenere l'albero di ricerca.
Michael,

4
Il concetto di "algoritmo" e il concetto di potenza di elaborazione infinita non si mescolano davvero. La teoria degli algoritmi e della calcolabilità si basa sul presupposto di ottenere un risultato in un numero finito di passaggi. Se ti viene concesso un numero infinito di passaggi, la distinzione tra ciò che è calcolabile e ciò che non lo è scompare.
Michael Kay,

Risposte:


62

Esiste un algoritmo? Sì. Secondo il Teorema di Zermelo , ci sono tre possibilità per una partita a due giocatori deterministica a informazioni perfette finite come gli scacchi: o il primo giocatore ha una strategia vincente, oppure il secondo giocatore ha una strategia vincente, o entrambi possono forzare un pareggio. Non sappiamo (ancora) quale sia per gli scacchi. (Dama invece è stata risolta : entrambi i giocatori possono forzare un pareggio.)

Concettualmente, l'algoritmo è abbastanza semplice: costruisci un albero di gioco completo , analizza i nodi foglia (le posizioni finali del gioco) e fai la mossa iniziale vincente, rassegna le dimissioni o offri un pareggio.

Il problema sta nei dettagli: ci sono circa 10 43 posizioni possibili e un numero ancora maggiore di mosse (la maggior parte delle posizioni può essere raggiunta in più di un modo). Hai davvero bisogno del tuo computer infinitamente potente per trarne vantaggio, dal momento che un computer che può trarre vantaggio da questo algoritmo o non può adattarsi all'universo conosciuto, o non finirà il calcolo fino a qualche tempo dopo la fine dell'universo.


13
@Wildcard No, non assume nulla: contiene solo tutte le possibili partite di scacchi legali e sceglierà tutte quelle in cui il giocatore in mano non perde.
gented

11
@gented, mi riferivo al passaggio "dimettersi" dell'algoritmo. Non è affatto un passo necessario.
Wildcard il

38
La regola delle tre ripetizioni limita lo spazio di ricerca, quindi il computer non deve essere infinitamente potente, ma solo astronomicamente potente.
Hoa Long Tam,

9
Per riferimento, confronta un limite inferiore per il numero di giochi possibili ( 10 ^ 120 ) con il numero di atomi nell'universo osservabile (nell'ordine di 10 ^ 80 ). L'algoritmo più semplice dovrebbe trovare tutti quei giochi e archiviare i loro dati. Memorizzare un gioco per atomo richiederebbe 10 ^ 40 volte il numero di atomi che stimiamo nell'universo osservabile.
Ingegnere Toast,

6
Questa risposta è ottima fino alla fine quando ti riferisci a un "computer infinitamente potente". Ecco , non quello che vuoi dire, e quella frase non appartiene nella questione, né la discussione.
Don Hatch,

25

Vedi https://en.wikipedia.org/wiki/Endgame_tablebase .

Con la potenza infinita del computer, si potrebbe costruire una tabella del genere per la posizione iniziale e risolvere gli scacchi .

In pratica, solo le posizioni con un massimo di sette "uomini" (pedine e pezzi, contando i re) sono state risolte usando gli attuali supercomputer, quindi siamo molto lontani dal risolvere gli scacchi. La complessità del problema aumenta esponenzialmente con il numero di pezzi.


9
Come nota a margine, se effettivamente producessi una tale tabella, indipendentemente da ciò su cui hai archiviato le informazioni, peserebbe circa 10 ^ 43 volte tanto quanto l'universo osservabile; considerando che ci sono ~ 10 ^ 123 possibili posizioni di scacchi e solo ~ 10 ^ 80 barioni nell'universo osservabile.
Shufflepants,

6
@Shufflepants che hanno detto che lo stavo immagazzinando usando i barioni?
Michael,

3
@Christoph E supponendo la conservazione delle informazioni, e supponendo che tu avessi un rilevatore e il tuo super computer con una potenza di elaborazione infinita, potresti lentamente nel corso di qualcosa come anni googolplex leggere la base del tavolo come radiazione falciante.
Shufflepants,

3
@Shufflepants Nota che una strategia vincente effettiva potrebbe richiedere molto meno spazio di una base completa. Ad esempio, Nim ha una strategia vincente che è semplice da descrivere, non è necessario creare una tabella enorme di tutti gli stati possibili.
Federico Poloni,

1
Questa soluzione, come indicato, non è praticabile. La massa di una tale tabella formerebbe un buco nero e sarebbe impossibile esfiltrare i dati da essa.
emory

19

Se avessi davvero una potenza di elaborazione infinita , un tale algoritmo sarebbe in realtà banale da scrivere. Dato che gli scacchi hanno un numero finito di stati possibili, in teoria si potrebbe semplicemente scorrere attraverso di essi fino a trovare un percorso di gioco perfetto. Sarebbe terribilmente inefficiente, ma se hai una potenza di elaborazione infinita , non importerebbe.


Non è vero. Ha detto che hai una potenza di elaborazione infinita, ma non ha detto nulla sullo spazio infinito.
ubadub,

@ubadub: non avremmo bisogno di spazio infinito. La durata di una partita è limitata a causa della regola delle 50 mosse e una regola può essere inventata per ordinare tutte le mosse possibili da una posizione. Poiché possono essere ordinati, possono essere memorizzati come numeri interi. Questo è tutto il ricordo necessario per percorrere l'intero albero. E se hai un tempo infinito, puoi camminare sull'albero tutte le volte che vuoi, quindi non devi memorizzare tutte le possibili partite di scacchi.
vsz,

La lunghezza del gioco è limitata, ma è estremamente grande; come ha sottolineato qualcun altro, se producessi un tavolo per archiviare tutti questi giochi ", indipendentemente da cosa hai archiviato le informazioni, peserebbe circa 10 ^ 43 volte tanto quanto l'universo osservabile; considerando che ci sono ~ 10 ^ 123 possibili posizioni di scacchi e solo ~ 10 ^ 80 barioni nell'universo osservabile
ubadub il

2
@ubadub: è vero, ma non stavo parlando di "un tavolo per memorizzare tutti questi giochi". Esistono molti algoritmi relativi agli alberi che non devono contenere tutti i nodi dell'intero albero in memoria.
vsz

@ vsz buon punto
ubadub

13

Per rispondere direttamente alla domanda: sì, esiste un tale algoritmo. Si chiama minimax. (I tablebase di endgame sono generati usando questo algoritmo (indietro!), Ma il semplice vecchio algoritmo minimax minimo è tutto ciò di cui hai bisogno). Questo algoritmo può giocare perfettamente a qualsiasi gioco a somma zero per due giocatori. Trova pseudocodice qui:

https://en.wikipedia.org/wiki/Minimax

si noti che le varianti di questo algoritmo sono utilizzate dai moderni programmi di scacchi per computer.


4

Non solo esiste un algoritmo per giocare a scacchi perfetti, ma è anche possibile scrivere un breve programma che (con infinite risorse) giocherà perfettamente a qualsiasi gioco deterministico a due giocatori di durata finita .

Il motore di gioco non ha nemmeno bisogno di conoscere le regole del gioco a cui sta giocando. Tutto ciò di cui ha bisogno è una rappresentazione opaca di uno "stato di gioco" e funzioni che (a) dato qualsiasi stato di gioco, forniscono un elenco di stati di gioco successivi legali e (b) dato uno stato di gioco, decidono se si tratta di una vittoria per il giocatore 1 , una vittoria per il giocatore 2, un pareggio o non è uno stato finale.

Date queste funzioni, un semplice algoritmo ricorsivo "risolve" il gioco.

Questo fatto è stato accennato nelle risposte precedenti da chessprogrammer (minimax) e da Acccumulation (che fornisce una versione del programma in python).

Ho scritto un programma del genere più di 20 anni fa. L'ho provato suonando noughts and crosses (tic-tac-toe se sei americano). Abbastanza sicuro ha giocato un gioco perfetto.

Naturalmente questo cadrà rapidamente su qualsiasi computer immaginabile per qualsiasi gioco serio. Poiché è ricorsivo, sta effettivamente costruendo l'intero albero di gioco in pila, quindi otterrai uno "overflow dello stack" (gioco di parole molto inteso) prima di arrivare ovunque vicino all'analisi dei 10 ^ 123 stati degli scacchi a cui si fa riferimento in altre risposte. Ma è divertente sapere che in linea di principio questo piccolo programma farebbe il lavoro.

Per me questo dice anche qualcosa di interessante sull'intelligenza artificiale: per quanto molta "intelligenza" pensi che sia esibita da Deep Blue, o Go Zero, o in effetti da un umano che gioca a scacchi o vai, c'è un senso in cui questi giochi hanno un'ottimale banale, esattamente calcolabile soluzioni. La sfida è come ottenere una soluzione buona ma non ottimale in un tempo ragionevole.


Il tuo algoritmo funziona solo per giochi a due giocatori a perfetta conoscenza. Cadrà per i giochi con informazioni nascoste come Stratego , poiché qualsiasi implementazione della funzione (a) viola le regole del gioco. Fallisce anche per i giochi di durata potenzialmente infinita: ad esempio, elimina la regola delle 50 mosse dagli scacchi e non può dire che due re che si rincorrono intorno alla scacchiera non siano uno stato vincibile. Tutto ciò che può dire è che non è uno stato finale.
Segna il

Punti validi. Modificherò la mia risposta.
Gareth, il

3

Ignorerò le possibilità di estrazioni o sequenze infinite di mosse per semplicità. Una volta compreso l'algoritmo, non è particolarmente difficile estenderlo a questi casi.

Innanzitutto, alcune definizioni:

  1. Ogni mossa che vince il gioco per il giocatore che fa quella mossa è una mossa vincente.

  2. Ogni mossa che perde il gioco per il giocatore che fa quella mossa è una mossa perdente.

  3. Ogni mossa che lascia l'altro giocatore con almeno una mossa vincente è anche una mossa perdente. (Dal momento che l'avversario può prendere quella mossa e forzare una perdita.)

  4. Ogni mossa che lascia l'altro giocatore con solo mosse perdenti è anche una mossa vincente. (Non importa quale mossa faccia il tuo avversario, vincerai.)

  5. Una strategia perfetta significa fare sempre mosse vincenti se ne rimangono e dimettersi quando rimangono solo mosse perdenti.

Ora, è banale scrivere una strategia perfetta. Basta esplodere tutte le possibili sequenze di mosse e identificare le mosse vincenti / perdenti. Ignorando la situazione di stallo, questo alla fine identificherà ogni mossa come mossa vincente o mossa perdente.

Ora, la strategia è banale. Guarda tutte le tue mosse possibili. Se rimangono delle mosse vincenti, prendine una e vinci. Se rimangono solo le mosse perdenti, dimettiti, poiché il tuo avversario può costringerti a perdere.

Non è difficile adattare la strategia per includere la possibilità di una situazione di stallo.

Aggiornamento : nel caso in cui non sia chiaro come questo identifichi ogni mossa come una mossa vincente o perdente, considera:

  1. Ogni mossa che si traduce in una vittoria è una mossa vincente.
  2. Ogni mossa che provoca una perdita è una mossa perdente.
  3. Ogni mossa che porta all'avversario a vincere o perdere solo le mosse è una mossa vincente o perdente.
  4. Chiama nil numero di mosse nella partita a scacchi più lunga possibile. (Per ora stiamo ignorando le sequenze illimitate, anche se includerle non è difficile.)
  5. Non ci sono mosse con nmosse precedenti che dobbiamo considerare.
  6. Ogni mossa con n-1mosse precedenti è una mossa vincente o perdente poiché le nmosse terminano il gioco più lungo.
  7. Quindi ogni mossa in profondità n-2è seguita solo da mosse vincenti o mosse perdenti e quindi è essa stessa una mossa vincente o una mossa perdente.
  8. E così via alla prima mossa.

1
Le tue definizioni di mosse vincenti e perdenti non sono abbastanza complete. La prima mossa, ad esempio, non vince la partita (n. 1), né lascia l'avversario perdendo solo le mosse (n. 4), quindi non è una "mossa vincente". Né perde la partita (n. 2), né lascia l'avversario con alcuna mossa vincente (n. 3), quindi non è una "mossa perdente". La tua strategia richiede che ogni mossa sia definita come "mossa vincente" o "mossa perdente", il che semplicemente non è il caso come l'hai definita.
Nuclear Wang,

2
@NuclearWang Definisce ogni mossa come mossa vincente o mossa perdente. Quale pensi sia la terza alternativa? Visualizza l'albero di tutti i possibili giochi di scacchi (e ricorda, per ora stiamo escludendo legami o sequenze infinite). Ogni catena finisce con una vittoria o una perdita. Questo percorre attraverso l'albero alla fine identificando ogni mossa come mossa vincente o mossa perdente.
David Schwartz,

13
@NuclearWang o la prima mossa è una mossa vincente per un giocatore, oppure gli scacchi (come il tic-tac-toe) sono un gioco disegnato con un gioco perfetto. Non sappiamo quale, perché nessuno ha mai avuto la potenza di calcolo per eseguire questo algoritmo fino al completamento, e nessuno ha trovato una prova più diretta.
Hobbs,

8
Non c'è casualità né informazioni nascoste negli scacchi, che non lascia spazio a "forse". Ogni posizione viene conquistata, persa o disegnata (anche se non siamo riusciti a identificarli come tali). E questa spiegazione sta tralasciando l'opzione "disegnata" per semplicità, ma per lo più equivale a 1) viene disegnata una posizione se viene disegnata secondo le regole e 2) viene disegnata una posizione se non ha mosse vincenti, ma ha almeno una mossa che lascia l' avversario senza mosse vincenti.
Hobbs,

2
@DavidSchwartz: A meno che qualcuno non si trovi in ​​una posizione perdente, ogni mossa che non è perfetta è cattiva. In una posizione perdente, in genere non ci sarebbe una singola mossa "perfetta" [tranne in una situazione di mossa forzata] poiché qualsiasi mossa legale potrebbe avere qualche probabilità di essere l'unica mossa vincente o di pareggio in alcune circostanze immaginabili (forse altamente inventate). Dimettersi, tuttavia, sembrerebbe la peggiore "mossa" inequivocabile. Supponiamo che il gioco sia stato risolto come una vittoria per White con d4. Vorresti giocare a un programma di scacchi, che ha risposto a 1. d4con ...resigns?
Supercat,

2

Supponiamo di avere tre funzioni: win_state, get_player, e next_states. L'input per win_stateè uno stato di gioco e l'output è -1 se il bianco è in scacco matto, 0 se è un pareggio, 1 se il nero è in scacco matto, e Nonealtrimenti. L'input per get_playerè uno stato di gioco e l'output è -1 se è il turno del nero e 1 se è il turno del bianco. L'input per next_statesè un elenco di possibili stati di gioco successivi che possono derivare da una mossa legale. Quindi la seguente funzione, quando viene dato uno stato di gioco e un giocatore, dovrebbe dirti in quale stato di gioco passare per quel giocatore per vincere.

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

Usa una tabella di consultazione

Sì. È facile. Non hai nemmeno bisogno di una potenza di elaborazione infinita. Tutto ciò di cui hai bisogno è una tabella di consultazione che contiene, per ogni possibile posizione del tabellone, la mossa migliore per giocare in quella posizione. Ecco lo pseudo-codice:

def play-move(my-color, board-position):
    return table-of-best-moves[my-color, board-position]

La presa

L'unico problema è che questo tavolo di consultazione dovrebbe essere molto, molto grande - forse più grande della galassia della Via Lattea - e ci vorrebbe molto tempo per costruirlo - forse più lungo dell'era attuale dell'universo, a meno che non ci sia un po 'di regolarità da scoprire negli scacchi che lo rende molto più semplice di quanto possiamo vedere in questo momento. Ma se avessi questa tabella di consultazione, la subroutine per scegliere una mossa perfetta ogni volta potrebbe essere implementata in appena un'istruzione CPU.

Inoltre, data la nostra attuale conoscenza degli scacchi, non c'è modo di essere sicuri che il gioco perfetto garantisca che non perderai. Ad esempio, se il gioco perfetto garantisce una vittoria per il Bianco, il Nero perderebbe anche se il Nero gioca perfettamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.