【问题标题】:Minimax in ScalaScala中的极小极大
【发布时间】:2013-11-30 06:54:15
【问题描述】:

我正在尝试将 Wikipedia 中的 minimax 算法用于我在 Scala 中实现井字游戏。我希望 X 玩家 -1 尝试最大化他的分数。我找到了一个很酷的静态评估函数here,我想使用它。如果棋盘对玩家来说是好棋盘,则返回正数,如果棋盘对玩家不利,则返回负数。我已经尝试了一些变化,而 X 继续只是让第一步可用。方法如下,方法和评价函数见here

我错过了什么明显的东西吗?

// 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
}

【问题讨论】:

    标签: scala artificial-intelligence minimax


    【解决方案1】:

    似乎alpha 被初始化为错误的值:

    var alpha = -player * Double.PositiveInfinity
    

    表示在X播放器(-1)的情况下alpha被初始化为

    var alpha = - (-1) * Double.PositiveInfinity
    

    可以简化为

    var alpha = Double.PositiveInfinity
    

    因此,alpha 无法再增加,即

    alpha = if (player == -1) Math.max(alpha, score) else //...
    

    不会有任何影响。另一个玩家 (1) 的情况正好相反,alpha 被初始化为负无穷大,因此不能再被最小化。因此,您应该能够通过简单地从 alpha 的初始化中删除 -1 因子来解决此问题:

    var alpha = player * Double.PositiveInfinity
    

    【讨论】:

    • 当然。感谢您的明确解释。我还必须明确返回 evaluatePosition(board, player) 才能得到结果。它现在可以工作了,但奇怪的是,当 height 设置为 0 时,它的性能似乎比 height > 0 时更好。我认为这可能只是评估函数的一个怪癖。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多