Sto cercando di creare un'IA semplice che può giocare usando Ricerca dell'albero di Monte Carlo .
Questa domanda, tuttavia, è valida per tutti i giochi in cui i giocatori a turno fanno un'azione che, in media, riduce la quantità di azioni possibili da intraprendere in futuro. (Altri esempi potrebbero essere Tic Tac Toe, Connect 4 e un sacco di altri.), O qualsiasi situazione in cui abbiamo bisogno di " Scegli una possibilità casuale fino a quando non rientra nei parametri previsti ".
In Go, i giocatori a turno mettono una pietra del loro colore sul tabellone. Quando la scheda si riempie, alcune mosse non sono più valide (ad esempio perché potrebbe esserci già una pietra in quella posizione. *)
L'algoritmo dovrebbe scegliere una mossa a caso. Tuttavia, come possiamo garantire che la mossa che abbiamo scelto sia valida? Vedo le seguenti opzioni, ognuna con i propri svantaggi:
-
Quando lo spostamento non è valido, sceglierne uno nuovo casuale. Svantaggio: il programma è ora probabilistico; è molto probabile che selezioni solo le mosse non valide ripetutamente, e quindi non finisca mai di essere eseguito.
-
Quando la mossa non è valida, passa al quadrato successivo (avvolgendolo ai bordi della scacchiera). Svantaggio: quando c'è una vasta area del tabellone che è già occupata, la distribuzione delle mosse scelte non è più casuale: è molto più probabile che venga scelta la posizione proprio accanto all'area riempita, come quando il numero casuale cade in questo intervallo, questo è il quadrato scelto.
-
Per prima cosa ottieni un elenco di tutte le possibilità e scegli un elemento casuale da questo elenco. Ciò garantisce un'equa distribuzione delle probabilità. Svantaggio: Perché abbiamo bisogno di scorrere l'intera scheda e ottenere un elenco di tutte le mosse possibili, questo è inefficiente. Dato che l'algoritmo dovrebbe funzionare il più velocemente possibile (poiché vogliamo simulare il maggior numero possibile di giochi), è meglio evitare di ripetere l'intera scheda.
Ora, mi chiedo se esiste un altro metodo per scegliere una mossa a caso che:
- Non favorisce in modo significativo determinati risultati rispetto ad altri.
- terminerà.
- Non ha bisogno di scoprire prima tutte le possibili mosse da una determinata posizione.
* (Le regole di Go hanno più condizioni perché una mossa sia valida, ma queste non cambiano questa domanda)