|
||
Модуль перебора. Начальная глубина у нас - 0. Начальная максимальная глубина у нас - 1. Если глубина предельная, то мы статически оцениваем позицию и возвращаем оценку. Причем, статический оценщик у нас абсолютный. Т.е. он преимущество белых отмечает как " +", а черных как "-". Но мы оценку инвертируем в зависимости от того, кто ходит. Это нужно для негамакса. Тут есть тонкий момент. Мы оцениваем уже схоженную позицию. Т.е., если например ходили белые, то позиция в оценщик придет с флагом "ход черных". Вообще-то мы при ходе белых оценку инвертировать не должны, но так как мы имеем уже схоженную позицию, то и инвертируем именно при ходе белых. Запись варианта. Когда погружаемся в вариант, на каждой глубине записываем, откуда и куда фигура ходила. Таким образом, у нас получается текущий массив ходов. В случае, если мы считаем, что оценка нам подходит мы записываем вариант. Причем, записываем от текущей до предельной глубины. Записываем лучший вариант во временный массив, по-новой создаваемый для каждого узла. Когда же мы выходим из узла, мы вновь скидываем вариант в текущий массив ходов. Вероятно, объяснение туманное, но если посмотреть код, то все станет понятным. Альфа бета. Если альфа больше локальной оценки, то записываем ее в альфу. Если бета больше или равна альфа, то выходим возвращая бету. В функцию передаем альфу и бету, причем, меняя их местами и со знаком "минус". Локальную оценку тоже принимаем со знаком "минус". В начале альфа максимально большая, а бета - максимально маленькая. Итак, мы ищем локальный минимум и если он уже меньше минимума в предыдущем более высоком узле, поиск бросаем, так как в дальнейшем локальный минимум будет только уменьшаться, а мы уже знаем, что его отбросим. Тут слегка все путает негомакс, но если поднапрячься и посмотреть исходники, то врубиться можно. |