【问题标题】:could someone explain minimax tic tac toe algorithm有人可以解释 minimax tic tac toe 算法吗
【发布时间】:2017-08-22 15:54:16
【问题描述】:

我正在研究 tic tac toe(用户与计算机)的 AI,并且我正在使用 minimax 算法来实现计算机的最佳移动。我在 youtube 上看过一些视频,并阅读了一些人的代码。但是,有些代码我仍然对正在做的事情感到困惑。让我们以 tic tac toe minimax 函数中的以下代码为例。有一个主要的 if、else if、else 语句,其他一切都从那里派生出来。我的主要问题是理解嵌入式 for 循环,以及紧随其后的 2 个 if。我认为,我已经在这些东西上放了一些 cmets。我从这个 youtube 视频中获取了示例代码:https://www.youtube.com/watch?v=x_Je9i3aKNk 井字游戏的极小极大函数。

//minimax function
function minimax(newGrid, depth, player) {
    const gameState = isGameOver(newGrid);
    //if the game is not over, evalute best move for computer
    if(gameState === false) {
        const values = [];

        for(var i = 0; i < 3; i++) {
            for(var j = 0; j < 3; j++) {
                const gridCopy = _.cloneDeep(newGrid);
                //if that spot is taken, skip to next loop
                if(gridCopy[i][j] !== ' ') continue;
                //if spot is player, evaluate
                gridCopy[i][j] = player;
                //need clarification
                const value = minimax(gridCopy, depth+1, (player == PLAYER_TOKEN) ? COMPUTER_TOKEN : PLAYER_TOKEN);
                values.push(value);
            }
        }
        //need clarification for computer turn
        if(player === COMPUTER_TOKEN) {
            const max = _.maxBy(value, (v) => {
                return v.cost;
            });
            if(depth === 0) {
                return max.cell;
            }
            else {
                return max.cost;
            }
        //need clarification for user turn
        else {
            const min = _.minBy(value, (v) => {
                return v.cost;
            });
            if(depth === 0) {
                return v.cell;
            }
            else {
                return v.cost;
            }
        }

    //if game state is null return 0
    else if (gameState === null) {
        return 0;
    }
    //if game state is player return negative
    else if(gameState === PLAYER_TOKEN) {
        return depth - 10;
    }
    //if game state is computer return positive
    else if(gameState === COMPUTER_TOKEN) {
        return 10 - depth;
    }
}

【问题讨论】:

    标签: javascript algorithm youtube tic-tac-toe minimax


    【解决方案1】:

    Minimax 算法的关键是两个玩家之间的反复,其中“轮到”的玩家希望选择得分最高的动作。反过来,每个可用动作的分数由对方玩家决定其可用动作中的哪一个具有最低分数。并且对方玩家移动的分数再次由轮流玩家试图最大化其分数等决定,一直沿着移动树向下直到结束状态。

    算法的描述,假设 X 是“轮到玩家”,看起来像:

    • 如果游戏结束,从 X 的角度返回分数。
    • 否则为每个可能的移动获取新游戏状态列表
    • 创建分数列表
    • 对于这些状态中的每一个,将该状态的极小极大结果添加到分数列表中
    • 如果轮到 X,则返回分数列表中的最高分数
    • 如果轮到 O,则返回分数列表中的最低分数

    你会注意到这个算法是递归的,它在玩家之间来回翻转,直到找到最终分数。

    让我们通过完整的移动树来了解算法的执行情况,并说明为什么从算法上会选择即时获胜的移动:

    • 轮到 X 进入状态 1。X 生成状态 2、3 和 4 并在这些状态上调用 minimax。
    • 状态 2 将 +10 的分数推入状态 1 的分数列表,因为游戏处于结束状态。
    • 状态 3 和 4 未处于结束状态,因此状态 3 生成状态 5 和 6 并对其调用 minimax,而状态 4 生成状态 7 和 8 并对其调用 minimax。
    • 状态 5 将 -10 的分数推送到状态 3 的分数列表中,而状态 7 的情况相同,将 -10 的分数推送到状态 4 的分数列表中。
    • 状态 6 和 8 生成唯一可用的移动,即结束状态,因此它们都将 +10 的分数添加到状态 3 和 4 的移动列表中。
    • 因为在状态 3 和 4 中都轮到 O,所以 O 将寻求找到 最低分数,并在 -10 和 +10 之间进行选择,两种状态 3 和 4 将产生 -10。
    • 最后,状态 2、3 和 4 的得分列表分别填充了 +10、-10 和 -10,状态 1 寻求最大化得分将选择得分 +10 的获胜动作,状态 2。

    更多算法细节和代码实现可以参考以下文章:

    Tic Tac Toe: Understanding The Minimax Algorithm

    online version tic tac toe

    Source code on github

    Reference: http://neverstopbuilding.com/minimax

    Here is the presentation slide by us

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      相关资源
      最近更新 更多