【问题标题】:Help with my MinMax Implementation帮助我的 MinMax 实现
【发布时间】:2011-07-15 14:20:30
【问题描述】:

我一直在尝试为一个简单的游戏实现 minMax 算法(稍后将尝试进行字母修剪)......我看过很多伪代码和教程,但我就是无法让它工作......

我们将不胜感激:)

这里是相关的类...(为了清楚起见删除了实现)

class Board { //Stores board state, Immutable

    Board playMove(Move m); //generates new Board after playing "Move m"

    List<Move> nextMoves(Move m); // generates all possible moves, previous move is required to decide the validity of the next moves

    boolean isTerminal(); //board at terminal state?
}


class Move { //stores positions played and score gained from that move

}

这是我的最小-最大实现...有人可以指出我做错了什么吗?谢谢。

private Move bestMove = null; // field variable

private int maxMove(Board board, Move prevMove, int myScore, int oppnScore) {
    out("maxMove " + board );
    if(board.isTerminal()) {
        return myScore - oppnScore;
    }
    int mx = Integer.MIN_VALUE;
    for(Move nxtMove: board.nextMoves(prevMove)) {
        int k = minMove(board.playMove(nxtMove),
                        nxtMove,
                        myScore + nxtMove.score,
                        oppnScore);
        if(k > mx) {
            mx = k;
            bestMove = nxtMove;
        }
    }
    return mx;
}

private int minMove(Board board, Move prevMove, int myScore, int oppnScore) {
    if(board.isTerminal()) {
        return myScore - oppnScore;
    }
    out("minMove " + board );
    int mn = Integer.MAX_VALUE;
    for(Move nxtMove: board.nextMoves(prevMove)) {
        int k = maxMove(board.playMove(nxtMove),
                        nxtMove,
                        myScore,
                        oppnScore + nxtMove.score);
        if(k < mn) {
            mn = k;
            bestMove = nxtMove;
        }
    }
    return mn;
}

编辑:游戏的简要说明如下,你面前有一定数量的不同面额的硬币。您和另一名玩家轮流从任一侧(左侧或右侧)取出一枚硬币。硬币的面额表示您为该动作得分。某些硬币具有特殊含义,例如选择 X 表示您将跳过一个回合,或者 Y 表示您将再获得一个回合。你的目标是比你的对手得分更多。

【问题讨论】:

  • 或许告诉我们一些游戏规则会有所帮助。
  • 游戏的对象是什么?尽可能多地得分?得分比对手多?
  • @MAK,得分比对手多。

标签: java algorithm implementation minmax


【解决方案1】:

我只看到了一个错误:你不记得你为给定的棋盘状态选择了哪一回合,所以你计算了很多次,算法变得很慢。还是速度不是你的问题?

【讨论】:

  • 速度不是问题。这是不正确的,它选择了错误的(如非最佳的)动作(有时是无效的动作)。
【解决方案2】:

我觉得我不是很清楚游戏规则,但是看起来你的终端条件不太对。

您正在返回玩家之间的得分差异。这意味着一个玩家想要最大化这个值(与对手的最大差异),而另一个想要最小化这个值(他试图获得与对手最接近的分数)。这看起来不像任何真实游戏的目标。

我认为你想要的是得分最高的玩家获胜。因此,您可以检查 myScore>oppScore 并相应地返回 1,0 和 -1。这意味着第一个玩家想要最大化回报(即他试图使其成为 1 - 他获胜),而对手试图最小化回报(即如果它是 -1 他获胜)。如果没有获胜,他们宁愿以 0 分(平局)。

另外,为什么需要prevMove 来生成下一步? board 没有关于游戏当前状态的所有信息(即剩下的硬币)吗?

【讨论】:

  • 我需要prevMove,因为如果上一步移除了X 硬币,这意味着我需要选择2 个硬币而不仅仅是一个。否则我只选一枚硬币。
  • @st0le:我明白了。我会将它作为标志保留在 board 中,但我想保留 prevMove 也可以。
  • @MAK,您的观察似乎是正确的,我会尝试并报告。
  • @MAK,不,问题似乎出在bestMove 的分配上,它选择了比当前状态提前 3-4 步的动作。
  • @st0le:您是否已将终端检查更改为返回 -1,0,+1?
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多