首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Othello Minimax算法

Othello Minimax算法
EN

Stack Overflow用户
提问于 2016-06-30 02:11:58
回答 2查看 7.2K关注 0票数 4

我正在尝试使用Minimax算法为Othello实现一个人工智能播放器。这台电脑玩得还不错,但不是很好。我是否在下面的代码中正确地实现了它?

代码语言:javascript
运行
复制
Coordinate bestCoordinate = null;
public int minimax(MyButton[][] gameBoard, int depth, boolean maximizingPlayer) {
    if (depth == 0) {
        return evaluateBoard(gameBoard);
    }

    if (maximizingPlayer) {
        int bestValue = Integer.MIN_VALUE;
        LinkedList<Coordinate> moves = generateMoves(gameBoard);
        for (Coordinate move : moves) {
            MyButton[][] newBoard = cloneBoard(gameBoard);
            processMove(newBoard, newBoard[move.getxCoordinate()][move.getyCoordinate()]);
            int v = minimax(newBoard, depth - 1, !maximizingPlayer);
            if (v > bestValue) {
                bestValue = v;
                bestCoordinate = move;
            }
        }
        return bestValue;
    }
    else {
        int bestValue = Integer.MAX_VALUE;
        LinkedList<Coordinate> moves = generateMoves(gameBoard);
        for (Coordinate move : moves) {
            MyButton[][] newBoard = cloneBoard(gameBoard);
            processMove(newBoard, newBoard[move.getxCoordinate()][move.getyCoordinate()]);
            int v = minimax(newBoard, depth - 1, !maximizingPlayer);
            if (v < bestValue) {
                bestValue = v;
                bestCoordinate = move;
            }
        }
        return bestValue;
    }
}

另外,下面是我的求值函数:

代码语言:javascript
运行
复制
public int evaluateBoard(MyButton[][] gameBoard) {

    int blackPieces = 0;
    int whitePiecess = 0;

    for (MyButton[] array : gameBoard) {
        for (MyButton button : array) {
            if (button.getBackground().equals(Color.black)) {
                blackPieces++;
            } else if (button.getBackground().equals(Color.WHITE)) {
                whitePiecess++;
            }
        }
    }

    int cornerBonus = 10;
    if (gameBoard[0][0].getBackground().equals(Color.BLACK)) {
        blackPieces += cornerBonus;
    }
    if (gameBoard[0][getBoardWidth() - 1].getBackground().equals(Color.BLACK)) {
        blackPieces += cornerBonus;
    }
    if (gameBoard[getBoardHeight() - 1][0].getBackground().equals(Color.BLACK)) {
        blackPieces += cornerBonus;
    }
    if (gameBoard[getBoardHeight() - 1][getBoardWidth() - 1].getBackground().equals(Color.BLACK)) {
        blackPieces += cornerBonus;
    }
    if (gameBoard[0][0].getBackground().equals(Color.WHITE)) {
        whitePiecess += cornerBonus;
    }
    if (gameBoard[0][getBoardWidth() - 1].getBackground().equals(Color.WHITE)) {
        whitePiecess += cornerBonus;
    }
    if (gameBoard[getBoardHeight() - 1][0].getBackground().equals(Color.WHITE)) {
        whitePiecess += cornerBonus;
    }
    if (gameBoard[getBoardHeight() - 1][getBoardWidth() - 1].getBackground().equals(Color.WHITE)) {
        whitePiecess += cornerBonus;
    }
    return whitePiecess - blackPieces;
}

(计算机总是玩白色的,而人类是黑色的)。我主要不确定,因为电脑似乎不能保护角落,尽管它们提供了加分。我的代码/逻辑有什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-06-30 03:30:45

你正在更新你在每个深度的最佳走法。在函数外部创建一个名为SEARCH_DEPTH的常量,每次调用该函数时都会使用该常量,并执行if检查:

代码语言:javascript
运行
复制
if(depth == SEARCH_DEPTH) {
    bestCoordinate = move;
}

另外,假设您是最大化玩家,您只需要在if(maximizingPlayer)块中设置移动。

票数 1
EN

Stack Overflow用户

发布于 2018-11-20 08:53:38

我没有亲自测试您的代码,但这是最小极大算法,而且它似乎写得很正确(假设您的助手函数实现正确)。我有一些观点可能会让你深入了解为什么你的代理的行为不是最优的:

  1. 我看到你的目标函数是你的智能体拥有的棋子数量减去对手拥有的数量,加上角落棋子的奖金。这看起来可能是最好的策略,但我会读一读奥赛罗玩家如何做出他们的动作。通常,他们会尝试在比赛后期之前只抛出一块,因为这样他们有更多的机会。
  2. Minimax不一定会返回将导致捕捉角球的走法,即使你对它们进行了很高的权重,因为它可能会被对手的走法所破坏。例如,假设你的算法在计算机转弯时向前看了三圈,所以它首先看的是一种状态,它捕获了一个具有高目标函数的角落。然而,你的对手将选择使你的目标函数最小化的路线,因此,由于风险,计算机不会将朝着捕获角点移动的移动视为最佳。我不知道这有多容易,但如果你能以某种方式将这棵树可视化,你可能就能弄清楚情况是否如此。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38107173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档