No puedo hablar por el algoritmo utilizado para Deep Blue, pero voy a tratar de explicar las mejoras en la programación de ajedrez. La velocidad es la mayor mejora. Deep Blue usó computadoras dedicadas multiprocesador, por lo que una comparación no es realmente posible.
https://chessprogramming.wikispaces.com/ es una gran fuente, pero es difícil de navegar.
Hay 3 funciones principales que se modifican para mejorar un motor de ajedrez: las funciones de evaluación, generación de movimientos y búsqueda.
La evaluación es la más difícil de programar, ya que hay muchas excepciones a las reglas. Con el espacio del disco duro cada vez más barato, la función eval permite evaluar más excepciones.
La generación de movimientos, junto con hacer y deshacer un movimiento, consume mucha memoria porque tiene que formarse tantas veces. Las funciones de generación más comunes son buzón, bitboard, 0x88, 8x8, tableros extendidos (10x10, 10x12) y una matriz / tabla de movimientos predeterminada (* utilizo una tabla de movimientos indexados). La opinión actual es que los bitboards son los más rápidos, y el uso de bitboards mágicos acelera esto hasta en un 30%. El Dr. Robert Hyatt, profesor y creador del ingenioso motor de ajedrez, afirma que no hay un aumento significativo de la velocidad.
La función de búsqueda temprana eran las funciones primitivas min-max. Básicamente, ¿intentaste maximizar la puntuación del lado para moverte y minimizar la puntuación del oponente? Alpha-Beta fue la primera mejora. Redujeron el número de movimientos que se buscan por tabla de transposición, valores de corte, ventanas de aspiración y heurística del historial. Estas son búsquedas de profundidad primero. También existe la búsqueda interna de profundización iterativa que trata de buscar el "mejor" movimiento (s) con la más profunda esperanza de que la búsqueda de otros movimientos resulte infructuosa.
NOTA: Mi tabla de índice. GNUChess y Jester usan una matriz de índice para generar sus movimientos. Inicializan el motor llenando la matriz con posibles movimientos. Luego toman las seis piezas y calculan los movimientos legales que están disponibles en cada casilla. Entonces cada pieza tenía una matriz [64] [8]. Tomé esta idea y la comprimí en dos índices y una tabla. La tabla contiene un valor que indica si los 16 movimientos son posibles, un índice contiene el desplazamiento del movimiento y el otro contiene la máscara.
desplazamiento [] = {-8, -1, 1, 8, -9, -7, 7, 9, -17, -15, -10, -6, 6, 10, 15, 17};
máscara [] = {1, 2, 4, 8, 16, 32, 64, 128, 256, ...};
Entonces, la generación de un movimiento deslizante es tan fácil como buscar la validez de su máscara en sus desplazamientos permitidos contra la tabla de movimientos.