【问题标题】:C++ MiniMax Algorithm getting stuck in an infinite loop for Tic Tac Toe BoardC++ MiniMax 算法陷入井字棋盘的无限循环
【发布时间】:2014-02-03 02:05:10
【问题描述】:

我目前正在为井字游戏实现MiniMax AlgorithmAlpha Beta Pruning

我的算法采用一个空棋盘,最后该棋盘包含与当前棋盘相同的状态,以及下一步行动。然后,我只是让*this(当前板)等于返回的板。

但是,由于某种原因,我的算法陷入了无限循环。这是我的 miniMax 函数:

int board::miniMax(int alpha, int beta, board & childWithMaximum)
{   
    if (checkDone())
        return boardScore();

    vector<board> children = getChildren();
    while (!children.empty())
    {
        board curr = children.back();

        board dummyBoard;
        int score = curr.miniMax(alpha, beta, dummyBoard);

        if (computerTurn && (beta > score)) {

            beta = score;
            childWithMaximum = *this;   
            if (alpha >= beta)
                break;

        } else if (alpha < score) {

            alpha = score;
            childWithMaximum = *this;
            if (alpha >= beta)
                break;
        }
    }
    return computerTurn ? alpha : beta;
}

我已经进行了一些打印语句调试,看来这个getChildren() 辅助函数正在工作。我让它打印出几个孩子,树中还有其他董事会状态:

vector<board> board::getChildren()
{
    vector<board> children;

    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            if (getPosition(i, j) == '*') {
                //move not made here

                board moveMade(*this);
                moveMade.setPosition(i, j);             
                children.push_back(moveMade);
            }
        }
    }

    return children;
}

但是,我的miniMax() 函数并没有使返回板等于下一步。

【问题讨论】:

    标签: c++ algorithm infinite-loop tic-tac-toe


    【解决方案1】:

    while-loop 中的指令永远不会修改children,但只有在children.empty() 为真时才会停止。因此循环内部要么永远不会执行,要么无限执行。

    也在这里:

    int score = curr.miniMax(alpha, beta, dummyBoard);
    

    您使用相同的参数递归调用该函数(第三个参数除外,但到目前为止尚未使用)。由于thisalphabeta 的状态到目前为止似乎没有改变(除非checkDone()getPosition() 改变它),这也会导致无限递归。

    然后,我只是让*this(当前板)等于返回的板。

    不,您只会使其他boards 等于*this。我在你的代码中没有看到*this =

    【讨论】:

    • 所有孩子都应该有computerTurn =! parent.computerTurn.. 所以它是 MinMax 算法而不是 MinMin/MaxMax。没有?
    • @odesh 实际上 getChildren() 中的 SetPosition() 负责处理。
    • @Nabla 感谢您的帮助!我会尝试一下,看看它是如何工作的。
    猜你喜欢
    • 2018-10-12
    • 2015-10-03
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多