на главную
AlphaBeta

 AlphaBeta является основным улучшением полного перебора. Подробное описание алгоритма было дано в известной статье Кнута и Мура (1975г.).  Из-за отсутствия информации алгоритм множество раз открывался заново (как и NegaMax).  Основная идея в следующем: нам не нужно исследовать обязательно все дерево перебора для получения лучшего хода (и его оценки). Дело в том, что в NegaMax мы завышаем оценка в каждом узле. Если результат перебора очередного хода меньше запомненной лучшей оценки, то он отбрасывается и не запоминается. Таким образом, переборы некоторых вариантов оказываются совершенно не нужны, так как они в результате не завышают оценку в узле. Если назвать лучшую оценку для узла alpha, а лучшую оценку противника, достигнутую до этого в строке - beta, то мы видим, что величины alpha и beta - меняются местами для каждого следующего узла в строке. Также видно, что если в строке мы достигли некоторой alpha, и в некотором узле далее в строке, который обсчитывается для противника, мы уже достигли beta, то перебор можно прекратить и вернуть эту оценку или beta, что безразлично. Когда перебор вернется в точку где была получена beta (для того узла это будет alpha), то результат будет отвергнут, так-как не улучшается alpha. Таким образом, мы можем не доводя перебор до конца, подрезать некоторую очевидную бесполезность.

int AlphaBeta(int alpha, int beta, int depth)
{
   int tmp;

   if(depth <= 0)
     return Evaluate();

   Generate();
   while(moveList)
   {
     tmp = -AlphaBeta(-beta,-alpha,depth-1);
     if(tmp > alpha) alpha = tmp;
     if(alpha >= beta) return beta;
   }//while
   return alpha;
}

Данный алгоритм при наилучшем порядке ходов исследует sqrt(N) позиций, где N - количество позиций, исследуемых при полном переборе. Это эквивалентно перебору на глубину в 2 раза больше, за то-же время.