【问题标题】:How to get best move from Minimax with Alpha Beta Pruning in C#?如何在 C# 中使用 Alpha Beta Pruning 从 Minimax 中获得最佳移动?
【发布时间】:2013-06-02 12:23:59
【问题描述】:

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

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


}

【问题讨论】:

    标签: c# minimax alpha-beta-pruning


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多