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