negaMax算法产生一些奇怪的结果

我目前正在实施一个跳棋游戏,唯一让我退缩的是我的AI状态不佳。 它正在使用Groovy编写。

我有以下(尝试)negaMax算法与alpha,beta修剪。 我跟着几个伪指南,但我明显失败了,因为结果是无意义的。

该方法调用如下: negaMax(3, Integer.MIN_VALUE, Integer.MAX_VALUE, 1)

我决定1将是电脑玩家; 任何其他用户。

def negaMax(int depth, int alpha, int beta, int player) {
    int score
    int bestScore = Integer.MIN_VALUE
    def moves = getMoves(player)                                        // this function returns a hashmap as I felt I needed not just the move but the checker
    // loop through all moves
    for (move in moves) {
        Position origin = move.key.location                             // save original position to allow undo
        move.key.location = move.value                                  // move piece
        if (depth == 0) {
            score = evaluateGameState(player)
        } else {
            score = -negaMax(depth - 1, -beta, -alpha, -player)         //  move score = - opponents best move
        }
        move.key.location = origin                                      // undo move
        if (player == 1) {                                              // save successor evaluations for the computer to search
            evaluations.put((move.key) , new PositionAndScore(score, move.value))
        }
        bestScore = Math.max(bestScore, score)
        alpha = Math.max(alpha, bestScore)
        if (alpha >= beta) {
            break                                                       // prune
        }
    }
    return bestScore
}

我选择了一个移动散列图,作为检查器(Piece对象)的键和值作为实际移动。 我没有看到存储任何意义,因为我需要跟踪实际可以实现的目标。

我利用另一个哈希映射来存储后续评估,再次存储检查者作为关键字,但是这次我存储了该值的位置和位置得分(我为此创建了一个类PositionAndScore)。

evaluateGameState函数会根据该玩家可以移动的棋子数量来启动分数,为任何国王添加一个点并为可移动位置中的任何棋子收回点数。

在玩游戏时,电脑的前两个动作看起来很聪明,但从那时开始,它就走下坡路了。 很多时候计算机正在尝试进行无效的动作,因此它们不会执行。

如果有任何人给我他们的时间只是为了看看我迄今为止所做的事情,并且评论是否有什么突出的地方是错误的,我将不胜感激。

非常感谢。


编辑:好的我已经取得了一些进展。 正如我可能没有提到的evaluations hashmap是用来计算电脑的最佳举措。 它得到它的最高分。

这个问题造成的问题是评估hashmap被添加到每个循环的玩家是1,所以移动那些不合法(但是他们是未来的移动)正在被添加。

为了解决这个问题,我决定添加一个名为前驱体法callSearch()被调用,而不是negaMax所有相同的参数,但它也设置rootDepth到了的depth

然后我对这个算法做了这个小改动

if (player == 1 && depth == rootDepth) {

}

我的想法是,只有当搜索已经回到根目录时,我才想添加后续评估。

无论如何,做完所有这些后,电脑不再尝试进行非法移动,但它仍然没有做出胜任的举动。 这可能是我的评价功能,虽然有点不成熟。

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

上一篇: negaMax algorithm producing some odd results

下一篇: Implementing alpha beta pruning in a TicTacToe minimax algorithm