Я не могу говорить об алгоритме, используемом для Deep Blue, но я собираюсь попытаться объяснить улучшения в шахматном программировании. Скорость это величайшее улучшение. Deep Blue использовал многопроцессорные компьютеры, поэтому сравнение не представляется возможным.
https://chessprogramming.wikispaces.com/ - отличный источник, но по нему сложно ориентироваться.
Для улучшения шахматного движка есть три основные функции: оценка, генерация ходов и функции поиска.
Оценку сложнее всего запрограммировать, так как есть много исключений из правил. Благодаря уменьшению места на жестком диске, функция eval позволяет оценивать больше исключений.
Генерация ходов, наряду с созданием и снятием ходов, занимает много памяти, потому что ее нужно формировать очень много раз. Наиболее распространенными функциями генерации являются почтовый ящик, битовая доска, 0x88, 8x8, расширенные доски (10x10, 10x12) и предопределенный массив / таблица перемещений (* Я использую индексированную таблицу перемещений). В настоящее время принято считать, что битборды быстрее, а использование волшебных битбордов ускоряет это до 30%. Доктор Роберт Хаятт, профессор и создатель ленивого шахматного двигателя, не заявляет о существенном увеличении скорости.
Ранней функцией поиска были примитивные функции min-max. По сути, вы пытались максимизировать счет стороны, чтобы двигаться и минимизировать счет противника. Альфа-бета была первым улучшением. Они сократили количество ходов, которые ищутся, с помощью таблицы транспозиции, предельных значений, окон аспирации и эвристики истории. Это поиск в глубину. Существует также внутренний итеративный углубляющий поиск, который пытается найти «лучший» ход (ы), наиболее глубоко надеясь, что поиск других ходов окажется бесплодным.
ПРИМЕЧАНИЕ. Моя таблица индексов. GNUChess и Jester оба используют индексный массив для генерации своих ходов. Они инициализируют двигатель, заполняя массив возможными ходами. Возьмите шесть частей и вычислите законные ходы, которые доступны из каждого квадрата. Таким образом, каждый кусок имел массив [64] [8]. Я взял эту идею и сжал ее до двух индексов и таблицы. Таблица содержит значение, которое сообщает, возможны ли 16 ходов, один индекс содержит смещение хода, а другой - маску.
смещение [] = {-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, ...};
Тогда создание скользящего движения так же просто, как поиск достоверности его маски в его допустимых смещениях относительно таблицы перемещений.