我已经使用我自己的旧国际象棋引擎经历了AlphaBeta算法,现在我正在尝试编写新引擎,我看到算法会遇到beta截止,但在我看来,如果我不使用缩小,这绝不应该发生窗口。我错了吗 ?我使用int.MaxValue
进行测试,将-int.MaxValue
用于alpha,那么可能会导致beta截止?
public Result Search(int maxDepth)
{
int alpha = -int.MaxValue, beta = int.MaxValue, ply = maxDepth;
var bestLine = new Stack<Move>();
var score = AlphaBeta(alpha, beta, ply, bestLine);
return new Result(score, bestLine);
}
int AlphaBeta(int alpha, int beta, int ply, Stack<Move> bestLine)
{
if (ply <= 0) return Evaluation.Evaluate(Board);
var moves = Board.GenerateMoves();
foreach (var move in moves)
{
Board.MakeMove(move);
eval = -AlphaBeta(-beta, -alpha, ply - 1, bestLine);
Board.TakeBackMove(move);
if (eval >= beta)
{
return beta;
}
if (eval > alpha)
{
alpha = eval;
if (ply == 1) bestLine.Clear();
bestLine.Push(move);
}
}
return alpha;
}
}
答案 0 :(得分:1)
好的,你在MinValue / MaxValue上是正确的。
<击> 我对NegaMax和AlphaBeta有点生疏,但当我看到
if (eval >= beta)
{
return beta;
}
if (eval > alpha)
{
}
您正在测试>
两个限制,这似乎不对。
击>
编辑:这似乎只是一种命名/理解问题。您的AlphaBeta()
方法可以更准确地命名NegaMaxWithAlphaBeta()
。由于NegaMax中alpha和beta的交替角色,这些参数的命名与MiniMax不完全匹配。
我看到算法会遇到beta截止,但在我看来,这绝不应该发生
是的,它应该发生。并且它只是在均匀水平的β截止。在奇数级别,if (eval >= beta)
测试alpha截止。
如果我不使用缩小的窗口。
我认为你正在使用缩小的alpha / beta窗口。
但也许这个答案可以帮助你更好地解释你的问题。
答案 1 :(得分:1)
请注意,在递归中,您以相反的顺序传递参数:
eval = -AlphaBeta(-beta, -alpha, ply - 1, bestLine);
与他们宣布的方式相反:
int AlphaBeta(int alpha, int beta, int ply, Stack bestLine)
所以他们改变每个角色的角色。 Alpha可以更新,这相当于树的更深层次的beta减少。
对我来说,这看起来像是Alpha / Beta和Negamax的奇怪混合,因为两位玩家都试图降低分数,这在每个级别都被否定了。