Non posso parlare dell'algoritmo usato per Deep Blue, ma cercherò di spiegare i miglioramenti nella programmazione degli scacchi. La velocità è il massimo miglioramento. Deep Blue utilizzava computer dedicati multiprocessore, quindi un confronto non è davvero possibile.
https://chessprogramming.wikispaces.com/ è un'ottima fonte, ma è difficile da navigare.
Ci sono 3 funzioni principali che sono state modificate per migliorare un motore di scacchi: la valutazione, la generazione di mosse e le funzioni di ricerca.
La valutazione è la più difficile da programmare, in quanto vi sono molte eccezioni alle regole. Con lo spazio su disco rigido sempre più economico, la funzione eval consente di valutare più eccezioni.
La generazione di mosse, insieme a fare e non fare una mossa, consuma molta memoria perché deve essere preformata così tante volte. Le funzioni di generazione più comuni sono mailbox, bitboard, 0x88, 8x8, schede estese (10x10, 10x12) e una matrice / tabella di spostamento predeterminata (* utilizzo una tabella di spostamento indicizzata). L'opinione attuale è che i bitboard sono i più veloci e l'utilizzo di bitboard magici lo accelera fino al 30%. Il Dr. Robert Hyatt, professore e creatore del motore di scacchi cratificato, non sostiene un aumento significativo della velocità.
La prima funzione di ricerca era la primitiva funzione min-max. Fondamentalmente stavi cercando di massimizzare il punteggio del lato da muovere e minimizzare il punteggio dell'avversario. Alpha-Beta è stato il primo miglioramento. Hanno ridotto il numero di mosse ricercate per tabella di trasposizione, valori di cut-off, finestre di aspirazione ed euristica della storia. Queste sono ricerche approfondite. C'è anche la ricerca approfondita iterativa interna che cerca di cercare le mosse "migliori" nella speranza più profonda che la ricerca di altre mosse si riveli infruttuosa.
NOTA: la mia tabella degli indici. GNUChess e Jester usano entrambi una matrice di indici per generare le loro mosse. Inizializzano il motore riempiendo l'array con possibili mosse. Prende i sei pezzi e calcola le mosse legali disponibili per ogni quadrato. Quindi ogni pezzo aveva un array [64] [8]. Ho preso questa idea e l'ho compressa in due indici e una tabella. La tabella contiene un valore che indica se sono possibili le 16 mosse, un indice contiene l'offset della mossa e l'altro contiene la maschera.
offset [] = {-8, -1, 1, 8, -9, -7, 7, 9, -17, -15, -10, -6, 6, 10, 15, 17};
maschera [] = {1, 2, 4, 8, 16, 32, 64, 128, 256, ...};
Quindi la generazione di una mossa scorrevole è facile come cercare la validità della sua maschera nei suoi offset consentiti rispetto alla tabella delle mosse.