1

我知道以前有人问过这个问题,但我无法弄清楚这个问题。

我有一个 7x7 板,用于连接 4ish 游戏。

我定义了这个方法,来实现 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;
    }


}
4

1 回答 1

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;
}
于 2013-06-02T12:51:15.593 回答