Per quanto riguarda la partita AlphaZero vs Stockfish, questa domanda è già stata trattata qui da SmallChess .
AlphaZero a parte (che impiega una routine specializzata Monte Carlo 1 nella sua esplorazione delle linee di gioco), che è reso non deterministico dalla costruzione, per i soliti motori di scacchi basati sull'euristica, come Stockfish e altri (anche se ci sono altri motori che hanno routine basate su MC, AFAIK Rybka aveva tale caratteristica), la fonte della casualità è generalmente solo una conseguenza degli aspetti tecnici dell'attuazione, piuttosto che la casualità intenzionale introdotta algoritmicamente nel processo decisionale del motore. In termini astratti, uno dei motivi è il fatto che i motori non funzionano in modo puramente sequenziale (eseguendo un'attività dopo l'altra). Invece, per rendere i motori più efficienti, eseguono ricerche parallele in vari rami dell'albero delle possibili mosse. Lo fanno tramite quello che viene chiamato multi-threading (o -processing ma che è un po 'diverso). Quindi più thread delle CPU sono contemporaneamenteeseguendo operazioni per cercare l'albero (e memorizzare nella cache le valutazioni delle posizioni visitate), quindi immagina che a ogni thread venga assegnato un sottoalbero. Il problema con questo tipo di implementazione è che l'esecuzione complessiva dei thread diventa fortemente dipendente da tutti i tipi di condizioni (tempi di attesa, scambi di RAM, ...), quindi alla fine una variazione principale può essere scelta senza aver permesso a tutti gli altri discussioni per completare la ricerca.
Questo infatti accade spesso perché il motore è impostato per prendere una decisione in un determinato periodo di tempo, quindi la gestione del tempo altera il comportamento. Puoi anche ripristinare questa affermazione dicendo: conoscere l'algoritmo e implementare le routine di threading deterministico non è sufficiente per prevedere in modo affidabile lo stato del programma dopo ogni momento t. Naturalmente, se si consente sempre a tutti i thread di completare la ricerca e non sono stati rilevati problemi di concorrenza durante tale esecuzione (ad esempio un thread che tenta di accedere a una determinata cache non accessibile), il comportamento sarà effettivamente completamente riproducibile dato che tutto il resto è uguale 2 .
1 : Insieme al fatto che attraverso l'addestramento aggiuntivo (ad esempio l'auto-gioco) la sua rete neurale continua ad evolversi (parametri ricalibrati), o se vuoi che la sua funzione di valutazione non abbia una definizione fissa e costante (a differenza dei motori basati sull'euristica ).
2 : Anche allora, come hai detto, a livello di apertura, con un libro di apertura, a volte ci sono decisioni casuali intenzionali prese dal motore su quale variante scegliere. Allo stesso modo, al di fuori della fase di apertura, possono esserci momenti in cui più variazioni hanno quasi uguali valutazioni (all'interno della risoluzione scelta per l'Eval), quindi in base al progetto, può finire per sceglierne una a caso. Infine, a livello di impostazioni del motore, bisogna anche fare attenzione, ad esempio la profondità della ricerca e i tempi di ponderazione scelti per ciascun motore (e se possono calcolare ulteriormente durante i periodi di ponderazione reciproci).