带Alpha Beta修剪功能的MiniMax适用于奥赛罗不起作用

我有以下实现alpha beta minimax的奥西奥(reversi)游戏。 不知何故,这永远不会真正返回正确的行动。 它似乎返回了我放入函数(0,0)的默认动作和-32768的二级值,这意味着它在MAX子程序中被修剪。 任何提示,我可以改善这个以及我如何解决这个问题?

注意:我已经确定了大部分的正确退回的后继者。 现在的最大深度为8.电脑玩家的pn(玩家数量)为1,人类玩家为0.第一阶段0为MINIMAX_MAX。 Alpha和beta最初分别设置为INT_MIN和INT_MAX。

mm_out minimax(Grid& G, int alpha, int beta, Action& A, uint pn, uint depth, bool stage) {
    if (G.check_terminal_state() || depth == MAX_DEPTH) {
#ifdef DEBUG
        cout << "best action: (" << A.get_x() << ", " << A.get_y() << ")n";
#endif
        return mm_out(A, G.get_utility(pn));
    }

    // add end game score total here

#ifdef DEBUG
    if (stage == MINIMAX_MAX) {
        cout << "max " << alpha << " " << beta << "n";
    }
    else {
        cout << "min " << alpha << " " << beta << "n";
    }
#endif

    set<Action> succ_temp = G.get_successors(pn);
    for (Action a : succ_temp) {

#ifdef DEBUG
        cout << a.get_x() << " " << a.get_y() << 'n';
#endif

        Grid gt(G);
        a.evaluate(gt);
    }
    set<Action, action_greater> successors(succ_temp.begin(), succ_temp.end());

#ifdef DEBUG
    Player p(0, "minimaxtest");
    G.display(p);
    int test;
    cin >> test;
#endif

    // if no successor, that player passes
    if (successors.size()) {
        for (auto a = successors.begin(); a != successors.end(); ++a) {
            Grid gt(G);
            gt.do_move(pn, a->get_x(), a->get_y(), !PRINT_ERR);
            Action at = *a;
            mm_out mt = minimax(gt, alpha, beta, at, pn ^ 1, depth + 1, !stage);
            int temp = mt.val;
//          A = mt.best_move;

            if (stage == MINIMAX_MAX) {
                if (alpha < temp) {
                    alpha = temp;
                    A = *a;
#ifdef DEBUG
                    cout << "Current action: (" << A.get_x() << ", " << A.get_y() << ") alpha = " << alpha << "n";
#endif
                }
                if (alpha >= beta) {
#ifdef DEBUG
                    cout << "pruned at maxn";
#endif
                    return mm_out(A, beta);
                }
            }
            else {
                if (beta > temp) {
                    beta = temp;
                    A = *a;
#ifdef DEBUG
                    cout << "Current action: (" << A.get_x() << ", " << A.get_y() << ") beta = " << beta << "n";
#endif
                }
                if (alpha >= beta) {
#ifdef DEBUG
                    cout << "pruned at minn";
#endif
                    return mm_out(A, alpha);
                }


}
    }
    return mm_out(A, (stage == MINIMAX_MAX) ? alpha : beta);
}
else {
    cout << "no successorn";
    return mm_out(A, (stage == MINIMAX_MAX) ? (std::numeric_limits<int>::max() - 1) : (std::numeric_limits<int>::min() + 1));
}

}

实用功能:

int Grid::get_utility(uint pnum) const {
    if (pnum)
        return wcount - bcount;
    return bcount - wcount;
}

您应该按值(不是通过引用)传递alpha / beta参数:

mm_out minimax(Grid& G, int alpha, int beta, Action& A, uint pn, uint depth, bool stage)

每个节点都将Alpha和Beta值传递给其子节点。 然后,孩子们根据轮到它们的时间更新他们自己的alpha或beta值副本 ,并返回该节点的最终评估结果。 然后用它来更新父代的alpha值或beta值。

链接地址: http://www.djcxy.com/p/56347.html

上一篇: MiniMax with Alpha Beta Pruning for Othello not working

下一篇: beta pruning yields wrong results