Come programmare il gioco del filetto
Per sviluppare un programma intelligente in grado di giocare al gioco del tris si possono seguire diverse tecniche di intelligenza artificiale.
La struttura del programma
La tavola del tris viene trasformata in un vettore di nove elementi. Ogni elemento indica una particolare posizione sulla tavola.
Se la posizione è vuota l'elemento è uguale a 0. Viceversa, se è occupata l'elemento è uguale a 1 se si tratta di una X oppure a 2 se si tratta di un O.
Per ogni possibile combinazione di gioco è possibile calcolare un numero decimale su base 10.
In questo modo si ottiene un numero indice in grado di indicare in modo biunivoco la situazione di gioco.
Un database che chiameremo Mosse contiene la mossa migliore da fare in ciascuna combinazione sulla tavola.
Nel file il programmatore associa ogni numero indice (X) a una mossa.
Per ogni possibile combinazione sulla tavola ( numero indice ) c'è un nuovo vettore V.
Le combinazioni delle mosse possibili sono 39 ossia 19683
Come funziona l'algoritmo
Quando il programma deve fare una mossa, trasforma la situazione del vettore V in un numero decimale X.
Il numero decimale così calcolato è associato alla situazione della tavola.
Si utilizza il numero decimale X come indice per cercare la mossa migliore nel file Mosse.
Una volta trovato, si estrapola il vettore della situazione successiva dal file Mosse.
Il programma esegue la mossa ponendo la X o la O nel quadro corrispondente della tavola.
Infine, il vettore Tavola viene posto uguale al vettore Mosse.
A questo punto, ci sono tre possibilità:
- se non si verifica una condizione di vittoria ( tris / filetto ) il programma termina l'esecuzione
- se non ci sono più caselle libere il programma termina l'esecuzione
- se ci sono ancora libere e nessun ha vinto, l'algoritmo ricomincia da capo e compie un altro giro ( loop ).
Pro e contro del programma
Il programma ha il vantaggio di saper giocare in modo ottimale una partita di filetto.
Tuttavia, non è la migliore tecnica possibile di intelligenza artificiale.
Può andare bene per il tris ma non si presta ad altre applicazioni.
I motivi sono i seguenti:
- Spazio di memoria elevato. Per registrare tutte le mosse è necessario utilizzare uno spazio di memoria molto grande.
Esempio. Sarebbe impossibile usare questa strada per costruire un algoritmo driverless su un'automobile a guida automatica. Non basterebbe uno spazio di memoria grande come l'Universo.
- Rischio di errori nel database. Il vettore Mosse è documento dal programmatore. Questo lavoro richiede molto tempo. Inoltre, possono verificarsi errori di inserimento, dimenticanze, ecc.
Nota. In alcuni problemi è impossibile determinare a priori tutte le possibili situazioni di gioco e inserirle in tabella. Lo spazio di memoria sarebbe infinito.
- L'algoritmo non fa esperienza. Il programma si limita a eseguire la mossa giusta trovata nel database. Non la valuta.
Esempio. Se una mossa si rivela essere sbagliata, per errore iniziale del programmatore, l'algoritmo continua a eseguirla ogni volta che si presenta.
- L'algoritmo non è versatile perché sa soltanto giocare a tris.
Esempio. Lo stesso algoritmo non può essere usato per sviluppare un bot in grado di guidare un'automobile, giocare a poker, investire in borsa, ecc.
In conclusione, questa tecnica di intelligenza artificiale è efficace ma non efficiente.
Come migliorare il programma
Per consentire all'algoritmo di fare esperienza, si potrebbe consentire all'algoritmo di modificare il database delle mosse.
Ogni tanto l'algoritmo compie delle mosse a caso, osservando gli effetti delle sue decisioni.
Nel corso del tempo l'algoritmo sperimenta e capisce quali mosse sono migliori in una particolare combinazioni di gioco.
In questo modo, il programma può correggere autonomamente gli eventuali errori o lacune del database iniziale.
Per un approfondimento su questa tecnica rimando a come sviluppare un software intelligente con le tabelle.
Handicap. La modifica aumenta enormemente lo spazio di memoria del database Mosse perché considera tutte le mosse possibili per ogni situazioni di gioco e aggiunge il dato sulla probabilità di successo. Inoltre, la sperimentazione implica degli sbagli. Questa modifica diventa pericolosa se il costo delle conseguenze di uno sbaglio è troppo alto.