Я использую negamax для игры, чтобы подключить четыре. Я заметил, что если я добавлю альфа-бету, он дает иногда «неправильные» результаты, как в случае проигрыша, я не думаю, что он должен делать с глубиной, которую я ищу. Если я удалю альфа-бету, он будет играть так, как предполагается. Может ли альфа-бета отрезать некоторые реально жизнеспособные ветви (особенно когда глубина ограничена)? Вот код на всякий случай:C++ Negamax alpha-beta неправильное обрезание?
int negamax(const GameState& state, int depth, int alpha, int beta, int color)
{
//depth end reached? or we actually hit a win/lose condition?
if (depth == 0 || state.points != 0)
{
return color*state.points;
}
//get successors and optimize the ordering/trim maybe too
std::vector<GameState> childStates;
state.generate_successors(childStates);
state.order_successors(childStates);
//no possible moves - then it's a terminal state
if (childStates.empty())
{
return color*state.points;
}
int bestValue = -extremePoints;
int v;
for (GameState& child : childStates)
{
v = -negamax(child, depth - 1, -beta, -alpha, -color);
bestValue = std::max(bestValue, v);
alpha = std::max(alpha, v);
if (alpha >= beta)
break;
}
return bestValue;
}
Большое спасибо, у меня больше нет подозрений относительно ограниченной глубины и альфа-беты. В конце концов, это оказалось ошибкой реализации (я испортил ее многопоточность). – lightxbulb