我知道以前曾经问过这个问题,但我无法弄明白这一点。
我有一个7x7的棋盘,用于连接4的游戏。
我定义了这种方法,以实现Minimax的Alpha Beta修剪。
它应该是我的启发式,并设置最好的举动。但我总是得到最好的举动,因为这是我董事会的最后一次行动......
我有什么东西可能会丢失吗?
谢谢!
private int alphaBeta(Node node, int depth, int alpha, int beta, bool max)
{
if (depth == 0 || node.getBoard().noMorePlays())
{
return node.getBoard().heuristic(max ? 1 : 2);
}
if (max)
{
foreach (Node child in node.Children( (max ? 1 : 2)) )
{
alpha = Math.Max(alpha, alphaBeta(child, depth - 1, alpha, beta, !max));
this.bestNode = child;
if (beta <= alpha)
{
break;
}
}
return alpha;
}
else
{
foreach (Node child in node.Children((max ? 1 : 2)))
{
beta = Math.Min(beta, alphaBeta(child, depth - 1, alpha, beta, !max));
if (beta <= alpha)
{
break;
}
}
return beta;
}
}
答案 0 :(得分:1)
this.bestNode = child;
周围没有条件,所以是的,它总是选择列表的最后一个。
我可能有反转的逻辑,但它应该看起来像:
//alpha = Math.Max(alpha, alphaBeta(child, depth - 1, alpha, beta, !max));
int temp = alphaBeta(child, depth - 1, alpha, beta, !max);
if (temp > alpha)
{
this.bestNode = child;
alpha = temp;
}