Je ne peux pas parler de l'algorithme utilisé pour Deep Blue, mais je vais essayer d'expliquer les améliorations de la programmation des échecs. La vitesse est la plus grande amélioration. Deep Blue utilisait des ordinateurs dédiés multiprocesseurs, donc une comparaison n'est pas vraiment possible.
https://chessprogramming.wikispaces.com/ est une excellente source, mais il est difficile de s'y retrouver.
Il y a 3 fonctions principales qui sont modifiées pour améliorer un moteur d'échecs: les fonctions d'évaluation, de génération de mouvement et de recherche.
L'évaluation est la plus difficile à programmer, car il existe de nombreuses exceptions aux règles. L'espace sur le disque dur devenant moins cher, la fonction eval permet d'évaluer plus d'exceptions.
La génération de mouvements, ainsi que la réalisation et l'annulation d'un mouvement, consomme beaucoup de mémoire car elle doit être préformée tant de fois. Les fonctions de génération les plus courantes sont la boîte aux lettres, le bitboard, 0x88, 8x8, les cartes étendues (10x10, 10x12) et un tableau / tableau de déplacement prédéterminé (* J'utilise une table de déplacement indexée). L'opinion actuelle est que les bitboards sont les plus rapides, et l'utilisation de bitboards magiques accélère cela jusqu'à 30%. Le Dr Robert Hyatt, professeur et créateur du moteur d'échecs cratfy, ne prétend aucune augmentation significative de la vitesse.
La fonction de recherche précoce était les fonctions primitives min-max. Fondamentalement, vous essayez de maximiser le score du côté à déplacer et de minimiser le score de l'adversaire. Alpha-Beta a été la première amélioration. Ils ont réduit le nombre de mouvements recherchés par la table de transposition, les valeurs de coupure, les fenêtres d'aspiration et l'heuristique historique. Ce sont des recherches approfondies. Il y a aussi la recherche d'approfondissement itérative interne qui essaie de rechercher le (s) "meilleur (s)" mouvement (s) le plus profond en espérant que la recherche d'autres mouvements s'avérera infructueuse.
REMARQUE: ma table d'index. GNUChess et Jester utilisent tous deux un tableau d'index pour générer leurs déplacements. Ils initialisent le moteur en remplissant le tableau de mouvements possibles. Prenez les six pièces et calculez les mouvements légaux disponibles sur chaque case. Ainsi, chaque pièce avait un tableau [64] [8]. J'ai pris cette idée et l'ai compressée en deux index et une table. Le tableau contient une valeur qui indique si les 16 mouvements sont possibles, un index contient le décalage du mouvement et l'autre contient le masque.
décalage [] = {-8, -1, 1, 8, -9, -7, 7, 9, -17, -15, -10, -6, 6, 10, 15, 17};
mask [] = {1, 2, 4, 8, 16, 32, 64, 128, 256, ...};
Ensuite, la génération d'un mouvement coulissant est aussi simple que de rechercher la validité de son masque dans ses décalages autorisés par rapport à la table de mouvement.