Я добавляю поиск покоя в свой шахматный движок, используя альфа-бета-обрезку с таблицами транспонирования, вызываемыми внутри алгоритма MTD(f). В моем основном поиске, после достижения глубины = 0 (конечный узел), я вызываю поиск Quiescence, который реализован как простая альфа-бета-обрезка без таблицы транспонирования (поскольку тесты показали, что поиск только по захватам работает быстрее без TT).
Я заметил кое-что, что не описано в псевдокодах по этой теме: когда я нахожусь на глубине = 0 (лист) в основном поиске и вызываю функцию поиска покоя для получения оценки узла, я думаю, что я также должен получить тип оценки: точный , альфа или бета:
... beginning of main alpha-beta search, checking node in TT
if (depth == 0)
{
// calling quiescence search with current alpha beta
int qresult = QuiescenceAlphaBetaSearch(node, alpha, beta);
saveInTT(node, qresult.Type, qresult.Value);
}
else
{
... run alpha beta search of node.children
}
В типичных примерах оценка конечного узла всегда хранится в TT как «точное» значение, но когда оценка узла основана на альфа-бета-поиске с помощью захватов, и этот поиск начинается с границ альфа-бета, которые не являются (-inf,+inf), Я думаю, что результат QuiescenceAlphaBetaSearch не всегда будет точным значением, и если он хранится в TT, он должен быть помечен флагом, возвращаемым из поиска покоя, я прав?
Я не совсем уверен, что передача текущей альфы и беты из основного поиска в поиск покоя математически правильна, поэтому я был бы признателен за подтверждение и по этой теме.