如何在C#中使用Alpha Beta Pruning从Minimax获得最佳移动?

时间:2013-06-02 12:24:00

标签: c# minimax alpha-beta-pruning

我知道以前曾经问过这个问题,但我无法弄明白这一点。

我有一个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;
    }


}

1 个答案:

答案 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;
}