Статичекий поиск
Чтобы AlphaBeta процедура возвращала точный результат, она должна считать до конца, Это возможно только для самых простых игр с минимальным количеством ходов типа 'Крестиков-ноликов'. В шахматах и других подобных играх идут на некоторое упрощение. После основного перебора вместо вызова оценочной функции вызывают упрощенный поиск, который рассматривает не все перемещения. В самом простейшем случае он рассматривает только взятия. Взятия дают наибольшее приращение в оценке и мы имеем в конце результат размена, что существенно повышает силу игры. Остальные перемещения вычеркнуты. Так как в шахматах взятие не является вынужденным ходом, то при просчете нужно учитывать этот фактор. Сторона, для которой идет просчет в узле должна иметь альтернативу взятию, и делать его только когда это выгодно. Для определения этого вычисляется статическая оценка узла и программа выбирает только те перемещения, которые ее не ухудшают. Для определения статической оценки используется оценочная функция Evaluate. Фигуры как бы замирают и находятся не в движении. Даже не имеет значения, чей ожидается ход. У статической оценки имеется одно важное свойство. Если одна сторона сделала ход, мы вычислили статическую оценку и ожидается ход противника, то в нормальных (не деградирующих) позициях противник всегда сможет найти ход, который как минимум не ухудшит его положение. Это понятие и используется для статического отсечения. Мы не делаем неинтересных перемещений, а считаем, что уже их сделали и нашли варинант, как минимум не ухудшающий статическую оценку до хода. Можно оставлять все перемещения, но на большой глубине смысла в этом не много. Статический максимум каждого хода ограничен приращением статической оценки при ходе. Если ход дает всего +5, то на большой глубине нет смысла выяснять его в стаитческом поиске, так как оценка не поднимется более, чем на 5. Другое дело - на 100,200 и более. Напомним, что статическая оценка инвертированная. Чтобы получить простейшую статическую оценку для белых нужно сложить материальные веса всех белых фигур и вычесть из полученного числа материал черных. Позиционные факторы суммируются и вычитаются аналогично.
Вот пример простейшего статического поиска, рассматривающего только взятия:

int Quies(int alpha, int beta, int side, int xside)
{
   int score;
   TMove move;
   score = Evaluate(side);
   if(score > alpha) alpha = score;
   if(alpha >= beta) return beta;
 
   move = GenerateAndSortAllCapture(side);
   while(move  &&  (alpha < beta))
   {
      MakeMove(move);
      score = -Quies(-beta,-alpha,xside,side);
      UnMakeMove(move);
      if(score > alpha) alpha = score;
      move = move->next;
   }//while
   return alpha;
}

Как видите, параметра глубины у нас нет. Взятия рассматириваются до конца. Список взятий должен быть отсортирован. Наиболее крупные приращения оценки должны идти сначала. Также взятие пешка*ладья имеет больший приоритет, чем ферзь*ладья.
Если смотреть из пре-узла, то мы ограничиваем максимум у каждого хода статической оценкой. Некоторые перемещения, тем не менее, имеет смысл просмотреть далее вместе со взятиями. В шахматах это в первую очередь шахи. Все остается по старому, только у шахов мы не ограничиваем максимум.

int StaticSearch(int alpha, int beta, int side,
                 int xside,int qdepth)
{
   TMove move;
   int score,nextDepth, check;
   if(qdepth <= 0)
      return Quies(alpha,beta,side,xside);
 
   GenerateAndSortAllMoves(side);
   while(move = NextMove())
   {
         MakeMove(move);
         check = Check(xside);
         nextDepth = qdepth – 1;
         if(check) nextDepth = qdepth;
 
 
         if(!check  && Evaluate(side) <= alpha)
            score = alpha;  //статическое отсечение
         else
            score = -StaticSearch(-beta,-alpha,xside,side,nextDepth);
         UnMakeMove(move);
 
         if(score > alpha) alpha = score;
         If(alpha >= beta) return alpha;
   }//while
   return alpha;
}
 

Функция статического поиска вызывается после основного AlphaBeta поиска и qdepth как правило равен 2.. Основная задача этой функции - более углубленный просмотр шахов и сглаживание эффекта горизонта за счет статического отсечения.  Некоторые программисты при единственном ответе на шах увеличивают глубина на 1 ( по крайней мере, до некоторой глубины). Чтобы данная функция считала точнее, желательно главное изменение рассматривать первым. Впрочем, это не единственный вариант статического поиска. В качестве  оценки для отсечения можно использовать не только статическую оценку после хода, но и результат недействительного перемещения. Мы делаем 2 хода подряд и это засчитывается как наш возможный максимум.

int SelectivSearch(int alpha, int beta, int side,
                 int xside,int qdepth)
{
   TMove move;
   int score,nextDepth, check;
   if(qdepth <= 0)
      return Quies(alpha,beta,side,xside);
 
   GenerateAndSortAllMoves(side);
   while(move = NextMove())
   {
         MakeMove(move);
         check = Check(xside);
         nextDepth = qdepth – 1;
         if(check) nextDepth = qdepth;
 
 
         if(!check  && SelectivSearch(alpha,beta,side,xside,qdepth-4) <= alpha)
            score = alpha;  //Null-Move CutOff
         else
            score = -SelectivSearch(-beta,-alpha,xside,side,nextDepth);
         UnMakeMove(move);
 
         if(score > alpha) alpha = score;
         If(alpha >= beta) return alpha;
   }//while
   return alpha;
}

Лучше этого для шахмат, пожалуй, никто ничего не придумал.