Я вижу, по крайней мере, два места, где могут возникать эти ошибки.
Одна потенциальная проблема находится в этой строке:
Entry e = (*tTable)[hash];
if (e && e.depth == reverseDepth)
return e.scoreMove;
Помимо проверки того, сохраняет ли таблица транспонирования результат поиск с той же глубиной, вам также необходимо проверить, что сохраненные границы в таблице совместимы с границами в таблице.
Я рассмотрел это как часть ответа на другой вопрос :
Когда вы сохраняете значения в таблице транспонирования, вам также необходимо сохранить границы альфа и бета, используемые во время поиска. Когда вы получаете значение обратно в середине поиска узла, это либо верхняя граница истинного значения (потому что значение = бета), нижняя граница истинного значения (потому что значение = альфа), либо фактическое значение узла ( альфа <значение <бета). Вам нужно сохранить это в своей таблице транспонирования. Затем, когда вы хотите повторно использовать значение, вы должны проверить, можете ли вы использовать значение с учетом ваших текущих границ альфа и бета. (Вы можете проверить это, фактически выполнив поиск после нахождения значения в таблице транспонирования, чтобы увидеть, получаете ли вы то же значение при поиске, что и в таблице.) </p>
Способ проверки этого это изменить AI::minMax
. Установите флаг в значение true, если у вас есть значение, возвращаемое из таблицы транспонирования. Затем, каждый раз, когда вы возвращаете значение, если флаг таблицы транспонирования истинен, сравните значение, которое вы собираетесь вернуть, со значением, которое было найдено в таблице транспонирования. Если они не совпадают, значит, что-то не так.
Кроме того, минимакс обычно используется с играми с нулевой суммой, что означает, что сумма очков двух игроков должна быть добавлена к 0. Я не знаю ' Я не знаю, что означают все возвращаемые значения в вашем коде, но иногда вы возвращаете {0, -1}
, а иногда {0, -2}
. Это проблема c, потому что теперь у вас есть игра с ненулевой суммой, и большая часть теории разваливается.
В частности, максимальный игрок может рассматривать {0, -1}
и {0, -2}
одинаково, но мин-плеер не будет. Таким образом, если порядок ходов каким-либо образом изменится, вы можете увидеть их в другом порядке, и, следовательно, значение в root дерева не будет стабильным.
В стороне, это фундаментальная проблема в многопользовательских играх. На практике это возникает, когда один игрок является королем. Они не могут сами выиграть игру, но они могут решить, кто выиграет.