提问者:小点点

Scala中的极小极大


我正在尝试调整维基百科中的极小值算法,以实现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
}

共1个答案

匿名用户

似乎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