【问题标题】:Where do we actually assign the best move during Minimax?在 Minimax 期间,我们实际上在哪里分配最佳移动?
【发布时间】:2019-11-22 16:51:34
【问题描述】:

我对 minimax 和 alpha beta 修剪在返回“最佳价值”方面的工作方式有很好的理解。但是我不确定应该在哪里分配“最佳移动”。

我知道最好的移动需要来自传入的原始棋盘,并且由于我正在寻找最大值,因此必须在最大化玩家下分配它。但是,使用我当前的代码会导致一次又一次地重新分配最佳操作。
例如如果原来的棋盘是O--\n---\n---,那么最好的动作就变成了
OX-\n---\n---,然后重新分配给O-X\n---\n---等等。

public int minimax(Board board, int depth, boolean maximizing,int alpha,int beta) {
    int bestValue;
    if (board.isTerminal()) {
        bestValue = board.calculateValue();
    } else if (maximizing) {
        bestValue = alpha;
        for (Action action : board.makePossibleActions()) {
            int childValue = minimax(board.makeCopy().takeAction(action),depth+1,false,bestValue,beta);
            if (bestValue <= childValue) {
                bestValue = childValue;
                if (board.equals(originalBoard)) {
                    bestAction = action;
                }
            }
            bestValue = Math.max(bestValue,childValue);
            if (beta <= bestValue) {
                break;
            }
        }
    } else {
        bestValue = beta;
        for (Action action : board.makePossibleActions()) {
            int childValue = minimax(board.makeCopy().takeAction(action),depth+1,true,alpha,bestValue);
            bestValue = Math.min(bestValue,childValue);
            if (bestValue <= alpha) {
                break;
            }
        }
    }
    return bestValue;
}

【问题讨论】:

    标签: java artificial-intelligence tic-tac-toe minimax alpha-beta-pruning


    【解决方案1】:
    1. 你知道 root 是一个最大玩家。
    2. 您还知道深度(0 或 1,取决于您如何进行初始调用)。

    因此,如果要玩最大玩家,则您位于树的根部,并且更新了最大移动的值,然后还将移动存储在类变量中以返回。 (不要取最大值,而是测试该值是否更大,然后将最大值和最佳移动一起更新。)

    【讨论】:

      【解决方案2】:

      根据游戏的复杂性,实际的极小极大算法实现需要其中一些功能。

      1) 棋盘的低级实现,可以快速分析位置并生成有效动作。

      2) 一个哈希表,用于输入每个哈希键的评估分数和移动,这也将有助于强制移动。

      3) 一个移动表,用于输入所有先前的移动以及相应的哈希键,以帮助避免重复移动并协助撤消和重做移动。

      4) 由于需要响应式 GUI 用户界面,因此极小极大算法可以在后台实现,最好在另一个线程上实现。

      5) 实际上需要迭代深化搜索,因为玩家可能喜欢使用强制移动或改变游戏级别。

      因此,在评估了最佳移动之后,我更愿意将结果传递给主调用线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-22
        • 2018-02-07
        • 2016-06-17
        相关资源
        最近更新 更多