Una guida passo-passo alla costruzione di una semplice IA di scacchi

Esploriamo alcuni concetti di base che ci aiuteranno a creare una semplice IA di scacchi:

  • mossa generazione
  • valutazione del consiglio di amministrazione
  • Minimax
  • e potatura alfa beta.

Ad ogni passo, miglioreremo il nostro algoritmo con una di queste tecniche di programmazione di scacchi testate nel tempo. Dimostrerò come ciascuno di essi influisce sullo stile di gioco dell'algoritmo.

Puoi visualizzare l'algoritmo AI finale qui su GitHub.

Passaggio 1: spostare la generazione e la visualizzazione della scheda

Useremo la libreria chess.js per la generazione di mosse e chessboard.js per visualizzare la scheda. La libreria di generazione delle mosse fondamentalmente implementa tutte le regole degli scacchi. Sulla base di questo, possiamo calcolare tutte le mosse legali per un dato stato del consiglio.

Una visualizzazione della funzione di generazione delle mosse. La posizione iniziale viene utilizzata come input e l'uscita è tutte le mosse possibili da quella posizione.

L'uso di queste librerie ci aiuterà a concentrarci solo sul compito più interessante: creare l'algoritmo che trova la mossa migliore.

Inizieremo creando una funzione che restituisce solo una mossa casuale da tutte le mosse possibili:

Sebbene questo algoritmo non sia un giocatore di scacchi molto solido, è un buon punto di partenza, dato che possiamo davvero giocare contro di esso:

Il nero gioca mosse casuali. Giocabile su https://jsfiddle.net/lhartikk/m14epfwb/4

Passaggio 2: valutazione della posizione

Ora proviamo a capire quale parte è più forte in una certa posizione. Il modo più semplice per raggiungere questo obiettivo è contare la forza relativa dei pezzi sul tabellone usando la seguente tabella:

Con la funzione di valutazione, siamo in grado di creare un algoritmo che sceglie la mossa che offre la valutazione più alta:

L'unico miglioramento tangibile è che il nostro algoritmo ora catturerà un pezzo, se possibile.

Il nero gioca con l'aiuto della semplice funzione di valutazione. Giocabile su https://jsfiddle.net/lhartikk/m5q6fgtb/1/

Passaggio 3: cerca l'albero usando Minimax

Successivamente creeremo un albero di ricerca da cui l'algoritmo può scegliere la mossa migliore. Questo viene fatto usando l'algoritmo Minimax.

In questo algoritmo, l'albero ricorsivo di tutte le possibili mosse viene esplorato a una data profondità e la posizione viene valutata in corrispondenza delle "foglie" finali dell'albero.

Dopodiché, restituiamo il nodo più piccolo o più grande al nodo padre, a seconda che sia bianco o nero da spostare. (Cioè, cerchiamo di minimizzare o massimizzare il risultato ad ogni livello.)

Una visualizzazione dell'algoritmo minimax in posizione artificiale. La mossa migliore per il bianco è b2-c3, perché possiamo garantire che possiamo arrivare a una posizione in cui la valutazione è -50

Con minimax in atto, il nostro algoritmo sta iniziando a comprendere alcune tattiche di base degli scacchi:

Minimax con livello di profondità 2. Giocabile su: https://jsfiddle.net/k96eoq0q/1/

L'efficacia dell'algoritmo minimax è fortemente basata sulla profondità di ricerca che possiamo raggiungere. Questo è qualcosa che miglioreremo nel prossimo passaggio.

Passaggio 4: potatura alfa-beta

La potatura alfa-beta è un metodo di ottimizzazione dell'algoritmo minimax che ci consente di ignorare alcuni rami nella struttura di ricerca. Questo ci aiuta a valutare l'albero di ricerca minimax molto più in profondità, usando le stesse risorse.

La potatura alfa-beta si basa sulla situazione in cui possiamo smettere di valutare una parte dell'albero di ricerca se troviamo una mossa che porta a una situazione peggiore di una mossa precedentemente scoperta.

La potatura alfa-beta non influenza il risultato dell'algoritmo minimax, ma lo rende solo più veloce.

L'algoritmo alfa-beta è anche più efficiente se visitiamo prima quei percorsi che portano a buone mosse.

Le posizioni che non abbiamo bisogno di esplorare se la potatura alfa-beta viene utilizzata e l'albero viene visitato nell'ordine descritto.

Con l'alfa-beta, otteniamo un notevole aumento dell'algoritmo minimax, come mostrato nell'esempio seguente:

Il numero di posizioni necessarie per valutare se si desidera eseguire una ricerca con profondità 4 e la posizione

Segui questo link per provare la versione alpha-beta migliorata dell'intelligenza artificiale degli scacchi.

Passaggio 5: funzione di valutazione migliorata

La funzione di valutazione iniziale è abbastanza ingenua poiché contiamo solo il materiale che si trova sul tabellone. Per migliorare ciò, aggiungiamo alla valutazione un fattore che tiene conto della posizione dei pezzi. Ad esempio, un cavaliere al centro del tabellone è migliore (perché ha più opzioni ed è quindi più attivo) di un cavaliere sul bordo del tabellone.

Useremo una versione leggermente modificata delle tabelle pezzo quadrato che sono originariamente descritte nel wiki di programmazione degli scacchi.

Visualizzati i tavoli pezzo quadrati visualizzati. Possiamo ridurre o aumentare la valutazione, a seconda della posizione del pezzo.

Con il seguente miglioramento, iniziamo a ottenere un algoritmo che gioca a scacchi "decenti", almeno dal punto di vista di un giocatore occasionale:

Miglioramento della valutazione e potatura alfa-beta con profondità di ricerca di 3. Giocabile su https://jsfiddle.net/q76uzxwe/1/

conclusioni

Il punto di forza di un semplice algoritmo per giocare a scacchi è che non commette errori stupidi. Detto questo, manca ancora di comprensione strategica.

Con i metodi che ho introdotto qui, siamo stati in grado di programmare un algoritmo per giocare a scacchi in grado di giocare a scacchi di base. La "parte AI" (esclusa la generazione di mosse) dell'algoritmo finale è di soli 200 righe di codice, il che significa che i concetti di base sono abbastanza semplici da implementare. Puoi controllare che la versione finale sia su GitHub.

Alcuni ulteriori miglioramenti che potremmo apportare all'algoritmo sarebbero ad esempio:

  • move-ordinazione
  • generazione di mosse più veloce
  • e valutazione specifica di fine gioco.

Se vuoi saperne di più, dai un'occhiata al wiki sulla programmazione degli scacchi. È una risorsa utile per esplorare oltre questi concetti di base che ho introdotto qui.

Grazie per aver letto!