gpt4 book ai didi

c++ - 通过 Alpha-Beta 修剪迭代加深 Negamax

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:03:02 27 4
gpt4 key购买 nike

我的程序中有一个有效的 negamax 算法。但是,我需要程序在 kMaxTimePerMove 时间内找到最佳可能的着法。我做了一些研究,似乎使用迭代加深和我的 negamax 算法是最好的方法。现在,我启动搜索的函数如下所示:

// this is a global in the same scope as the alpha-beta functions, so they can check the elapsed time
clock_t tStart;

int IterativeDeepening(Board current_state)
{
bool overtime = false;
int depth = 0;
tStart = clock();

MoveHolder best_move(-1, kWorstEvaluation);

while ((static_cast<double> (clock() - tStart)/CLOCKS_PER_SEC) < kMaxTimePerMove)
{
MoveHolder temp_move = AlphaBetaRoot(kWorstEvaluation, -best_move.evaluation_,++depth, current_state, overtime);
if (!overtime)
best_move = temp_move;
}

return best_move.column_;
}

我想我也应该将之前的最佳移动重新排序到子列表的前面,但是,我正在等待实现它,直到我获得基本版本。实际的 Alpha-Beta 函数如下所示:

MoveHolder AlphaBetaRoot(int alpha, int beta, int remaining_depth, Board current_state, bool &overtime)
{
MoveHolder best(-1, -1);
if (overtime)
return MoveHolder(0,0);

std::vector<Board> current_children;
current_state.GetBoardChildren(current_children);

for (auto i : current_children)
{
best.evaluation_ = -AlphaBeta(-beta, -alpha, remaining_depth - 1, i, overtime);
if ((static_cast<double> (clock() - tStart)/CLOCKS_PER_SEC) > kMaxTimePerMove)
{
overtime = true;
return MoveHolder(0,0);
}
if (best.evaluation_ >= beta)
return best;
if (best.evaluation_ > alpha)
{
alpha = best.evaluation_;
best.column_ = i.GetLastMoveColumn();
}
}
return best;
}

int AlphaBeta(int alpha, int beta, int remaining_depth, Board2 current_state, bool &overtime)
{
if (overtime)
return 0;
if ((static_cast<double> (clock() - tStart)/CLOCKS_PER_SEC) > kMaxTimePerMove)
{
overtime = true;
return 0;
}

if (remaining_depth == 0 || current_state.GetCurrentResult() != kNoResult)
{
return current_state.GetToMove() * current_state.GetCurrentEvaluation();
}


std::vector<Board> current_children;
current_state.GetBoardChildren(current_children);
for (auto i : current_children)
{
int score = -AlphaBeta(-beta, -alpha, remaining_depth - 1, i, overtime);
if (score >= beta)
{
return beta;
}
if (score > alpha)
{
alpha = score;
}
}
return alpha;
}

当我尝试调试时,一切似乎都在按预期工作。然而,当我让迭代深化版本与常规 alpha-beta 实现对战时,它总是输。有时它似乎被“卡住了”,并返回一个可怕的举动。

例如,如果此程序“被迫”在下一回合采取行动,否则对手将获胜,它不会阻止获胜。在那一步,它报告说它正在搜索 38 的深度。我发现该算法极难调试,因为如果我中断执行,就会破坏计时。

我不确定我是否错误地实现了算法,或者只是这里有一个棘手的错误。如果有人能指出正确的方向,我将不胜感激。

最佳答案

您正在使用 -best_move.evaluation_ 作为搜索的 beta 值,其中 best_move 是之前深度的最佳移动。这是不正确的:假设一个移动在深度 = 2 时看起来不错,但在更大的深度时结果很糟糕。这种方法将继续认为它是好的,并导致在其他移动中不应该发生的 beta 截止。

您应该在 (-infinity, infinity) 上搜索每个迭代来解决此问题。您也可以使用 aspiration windows限制 alpha-beta 范围。

请注意,由于您不使用上一次迭代来改进下一次迭代的移动顺序,因此迭代加深会导致稍微更差的结果。理想情况下,您希望移动顺序从换位表和/或前一次迭代的主要变化中选择最佳移动。

关于c++ - 通过 Alpha-Beta 修剪迭代加深 Negamax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13549594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com