Questo problema è piuttosto simile ad alcuni problemi di codifica. Lo stoccafisso ha già più set di mosse pre-calcolate. Rappresenta lo stato della scacchiera usando più bitboard, che quindi utilizza per valutare le posizioni della scacchiera usando una rappresentazione categorica (controlli, tempos, checkmates) e statistica (valori dei pezzi). Quasi immediatamente, utilizza un algoritmo di ricerca alpha-beta avanzato. Per non analizzare più volte la stessa posizione, viene utilizzata una tabella di trasposizione. Questa è essenzialmente la memorizzazione applicata alla funzione di ricerca, che è fondamentale in molti problemi di programmazione della teoria dei grafi. Pertanto, utilizza effettivamente un algoritmo piuttosto semplice. Ecco alcune ricerche fatte prima:
Passaggio 1. Inizializzare il nodo
Passaggio 2. Verificare la ricerca interrotta e il sorteggio immediato. Applicare qui il limite del nodo. (Funziona solo con 1 thread di ricerca, a partire da Stoccafisso 2.3.1.)
Passaggio 3. Accoppiamento della potatura a distanza. Anche se ci accoppiamo alla prossima mossa, il nostro punteggio sarebbe nella migliore delle ipotesi mate_in (textsrightarrowtextply + 1textssrightarrowtextply + 1, ma se l'alfa è già più grande perché un compagno più corto è stato trovato verso l'alto nell'albero, allora non c'è bisogno di cercare ulteriormente, non faremo mai più ricerche battere l'alfa corrente La stessa logica ma con segni invertiti si applica anche nella condizione opposta di essere accoppiati invece di dare accoppiamento, in questo caso restituisce un punteggio alto.
Passaggio 4. Ricerca della tabella di trasposizione. Non vogliamo che il punteggio di una ricerca parziale sovrascriva una precedente ricerca completa. Usiamo un tasto di posizione diverso in caso di mossa esclusa.
Passaggio 5. Valutare staticamente la posizione e aggiornare le statistiche sui guadagni dei genitori
Passaggio 6. Rasoio (viene omesso nei nodi PV)
Passaggio 7. Potatura statica a spostamento nullo (omessa nei nodi PV). Scommettiamo che l'avversario non ha una mossa che ridurrà il punteggio di più di futility_margin (profondità) se facciamo una mossa nulla.
Passaggio 8. Spostare la ricerca senza spostare la ricerca di verifica
Passaggio 9. ProbCut. Se abbiamo un'ottima acquisizione e una ricerca ridotta restituisce un valore molto superiore alla beta, possiamo (quasi) potare in sicurezza la mossa precedente.
Passaggio 10. Approfondimento iterativo interno.
Passaggio 11. Scorri le mosse. Passa attraverso tutte le mosse pseudo-legali fino a quando non rimangono mosse o non si verifica un taglio beta
Passaggio 12. Estendere i controlli e anche le mosse pericolose
Passaggio 13. Potatura di futilità.
Passaggio 14. Effettuare la mossa
Passaggio 15. Ricerca di profondità ridotta (LMR). Se la mossa fallisce in alto, verrà nuovamente cercata a tutta profondità.
Passaggio 16. Ricerca approfondita, quando LMR viene saltato o fallisce in alto.
Passaggio 17. Annulla spostamento
Passaggio 18. Controlla la nuova mossa migliore
Passaggio 19. Controlla la divisione
Passaggio 20. Verificare la presenza di compagno e stallo
Passaggio 21. Aggiorna tabelle. Aggiorna la voce della tabella di trasposizione, i killer e la cronologia
Cercherò di spiegare di cosa parla la ricerca del professore. Lo stoccafisso crea un albero di ricerca della mossa legale.
Quindi, inizia a valutare se ogni mossa è buona o cattiva, e quanto è buona o cattiva, eseguendo prima un campo di ricerca superficiale e quindi utilizzando i valori di cut-off alpha / beta risultanti come valori iniziali per una ricerca più approfondita. Anche lo stoccafisso dà la priorità ai pezzi. Ad esempio, i cavalieri avrebbero la priorità al centro, quindi se un cavaliere e un vescovo vengono biforcati al centro, questo sposterà il cavaliere, a meno che non ci siano altri guadagni significativi spostando il vescovo. Mentre questo può sembrare complicato, questa esecuzione è approssimativamente log (numero di mosse possibili), rendendolo quindi piuttosto veloce.