La programmazione dei motori per gli scacchi è un territorio molto complicato, quindi ti indicherò il Wiki sulla programmazione degli scacchi , che contiene molte ottime informazioni su questo argomento.
sfondo
I calcoli degli scacchi (e molte altre cose simili) sono generalmente modellati e pensati come "alberi di gioco" o " alberi di decisione ". In generale, questo albero è un grafico diretto, con un nodo in alto (la posizione corrente), che porta a un nodo per ogni possibile spostamento, ognuno dei quali porta a più nodi per ogni possibile spostamento successivo e così via.
Nella loro forma più semplice, a forza bruta, i motori di scacchi generano tutte le posizioni su questo albero fino a un limite di profondità ("piega"), valutando ogni posizione risultante sulla base di alcuni criteri complessi 1 . Quindi gioca la mossa che sembra portare al miglior risultato. Al giorno d'oggi, sono state sviluppate molte tecniche davvero complicate per limitare il numero di posizioni che il motore deve guardare, ma le ignorerò ai fini di questa risposta, perché non cambiano il vero problema in mano.
Tangente matematica
Il motivo fondamentale per cui i motori impiegano generalmente lo stesso tempo per considerare ogni mossa è che la dimensione dell'albero decisionale aumenta esponenzialmente con la profondità ( k
).
Considera la posizione iniziale. La parte superiore dell'albero ( k=0
) è un nodo. Ci sono venti possibili prime mosse per il Bianco, quindi ci sono venti nodi in profondità k=1
. Quindi, il Nero ha anche venti mosse disponibili per ciascuna delle opzioni del Bianco: quindi k=2
, ci sono 20 * 20 = 400
possibili posizioni! E peggiora solo quando i giocatori sviluppano i loro pezzi!
Ad esempio, facciamo finta che ci siano sempre venti mosse possibili per ciascun giocatore in un dato momento 2 . Comandi al computer di guardare avanti cinque mosse per ogni giocatore (dieci strati). Diamo un'occhiata alle dimensioni dell'albero della forza bruta ad ogni livello. Per divertimento, esamineremo anche il numero totale di posizioni nella struttura (dall'alto al livello indicato).
Ply | Positions | Total Tree Size
----------------------------------------
0 | 1 | 1
1 | 20 | 21
2 | 400 | 421
3 | 8000 | 8421
4 | 160000 | 168421
5 | 3200000 | 3368421
6 | 64000000 | 67368421
7 | 1280000000 | 1347368421
8 | 25600000000 | 26947368421
9 | 512000000000 | 538947368421
10 | 10240000000000 | 10778947368421
Il risultato di ogni livello che è esponenzialmente più grande del livello precedente è che la dimensione dell'intero albero è dominata dal livello inferiore . Considera l'esempio sopra: solo l'ultimo livello contiene dieci trilioni di nodi. L'intero resto dell'albero contiene solo cinquecento miliardi. Il decimo strato contiene circa il 95% dei nodi nell'intero albero (questo è vero per ogni livello). In pratica, ciò significa che tutto il tempo di ricerca viene impiegato per valutare l '"ultima" mossa.
Risposta
Quindi, come si collega alla tua domanda? Bene, diciamo che il computer è impostato su dieci strati, come sopra, e inoltre "ricorda" i risultati delle sue valutazioni. Calcola una mossa, la gioca e poi fai una mossa. Ora sono state fatte due mosse, quindi elimina tutte le posizioni dalla memoria relative alle mosse che non sono avvenute e viene lasciato con un albero che scende le otto mosse rimanenti che ha già calcolato: 26.947.368.421 posizioni!
Tutto ok! Quindi dobbiamo solo calcolare gli ultimi due strati! Utilizzando la nostra stima di 20 mosse per ogni profondità, il numero totale di mosse che dobbiamo calcolare qui è ancora superiore a dieci trilioni. Le posizioni che abbiamo già calcolato rappresentano solo il 2,5% delle possibilità! Quindi, anche memorizzando nella cache i risultati dell'ultima mossa, il meglio che possiamo sperare è un aumento della velocità del 2,5%! In sostanza, questo è il motivo per cui anche se il tuo programma memorizza nella cache i risultati precedenti, di solito non vedi una significativa accelerazione tra le mosse (tranne i casi in cui il computer trova un compagno forzato o qualcosa del genere, ovviamente!).
Dichiarazione di non responsabilità
C'è molta complessità in questa domanda, motivo per cui mi sono legato al wiki di programmazione all'inizio e ho solo tentato di spiegare la risposta in termini matematici generali. In realtà, i programmi fanno generalmente parte di cache dell'albero di trasloco in trasloco, e ci sono altri motivi per cui questo è sufficiente di per sé - alcuni motivi semplici (ad esempio, una certa linea potrebbe guardare bene fuori per otto mosse, ma finisce con un back -rank mate on move nine!) e molti altri molto complicati (generalmente legati a vari metodi di potatura intelligenti). Quindi il computer deve continuare a guardare più avanti nel tentativo di evitare di fare cattive ipotesi basate sulla profondità di taglio della mossa precedente.
1 Non entrerò nelle funzioni euristiche qui, perché questa è la sua area incredibilmente complessa, ma spesso ci sono alcuni guadagni che possono essere raggiunti anche qui tramite schemi di memorizzazione della posizione.
2 Un fattore di ramificazione medio di 20 è probabilmente troppo basso .