我正在尝试调整维基百科中的极小值算法,以实现Scala中的TicTacToe。我希望X玩家,-1,试着最大化他的得分。我在这里找到了一个很酷的静态评估函数,我想使用它。如果棋盘对玩家来说是好棋盘,它会返回正数,如果棋盘对玩家来说是坏棋盘,它会返回负数。我已经尝试了一些变体,X继续只是让第一步可用。方法如下,方法和评价函数可以在这里找到。
关于这件事,我有没有明显的遗漏?
// player X = -1, player O = 1
def minmax(board:Array[Int], height:Int, player:Int):Double={
if(height == 0)
evaluatePosition(board, player)
var alpha = -player * Double.PositiveInfinity;
val allBoards = makeAllPossibleMoves(board, player) // array of child boards
for(b <- allBoards){
val score = minmax(b, height-1, -player)
alpha = if (player == -1) Math.max(alpha, score) else Math.min(alpha, score)
}
alpha
}
似乎alpha
用错误的值初始化:
var alpha = -player * Double.PositiveInfinity
表示在X
播放器(-1)alpha
初始化为
var alpha = - (-1) * Double.PositiveInfinity
可以简化为
var alpha = Double.PositiveInfinity
因此,α不能再增加,即。
alpha = if (player == -1) Math.max(alpha, score) else //...
没有效果。另一个玩家(1)的情况应该相反,其中alpha
被初始化为负无穷大,因此不能再模拟。因此,您应该能够通过从alpha
的初始化中删除-1
因子来解决此问题:
var alpha = player * Double.PositiveInfinity