【问题标题】:problems implementing negamax for tic-tac-toe in ruby在 ruby​​ 中为井字游戏实现 negamax 的问题
【发布时间】:2013-06-27 01:19:07
【问题描述】:

我正试图为井字游戏实现 negamax 撞墙

def negamax(board_obj, mark, depth)
  if board_obj.game_over?
    return value(board_obj)
  else
    max = -1.0/0 # negative infinity
    if mark == @mark
      next_mark = @opponent_mark
    else
      next_mark = @mark
    end
    board_obj.empty_squares.each do |square|
      board_obj[square] = mark
      x = -negamax(board_obj, next_mark, depth + 1)
      board_obj[square] = ' '
      if x > max
        max = x
        @scores << x
        @best_move = square if depth == 1
      end
    end
    return max
  end
end

# determines value of final board state
def value(board_obj)
  if board_obj.mark_win?(@mark)
    return 1
  elsif  board_obj.mark_win?(@opponent_mark)
    return -1
  else
    return 0
  end
end

其余代码在这里:https://github.com/dave-maldonado/tic-tac-doh/blob/AI/tic-tac-doh.rb

它确实会产生结果,但 AI 很容易被击败,所以我知道出了点问题,任何帮助 不胜感激!

【问题讨论】:

  • 您对哪里出了问题有什么看法? Stackoverflow 不能很好地处理刚刚扔给我们的代码。但如果您能向我们提出一些具体问题,我们很乐意为您提供帮助
  • negamax 函数的参考实现您使用什么?
  • 最初在我的实现中遵循hamedahmadi.com/gametree/#negamax,但不是在每次迭代之前制作板对象的副本,而是在递归之后撤消移动。我放了一些打印语句来试图弄清楚发生了什么,我认为 value 工作正常,状态是 AI 返回 1 的胜利,玩家返回 -1 并且平局返回 0 但有些东西不能正常工作,因为 AI 会返回无意义的举动。

标签: ruby tic-tac-toe


【解决方案1】:

问题是value 在当前执行negamax 时需要相对于mark,而不是始终相对于计算机。如果您将mark 参数从negamax 传递给value,并对value 进行以下修改定义,您将得到正确的结果:

def value(board_obj, mark)
  if board_obj.mark_win?(mark)
    return 1
  elsif  board_obj.mark_win?(mark == 'X' ? 'O' : 'X')
    return -1
  else
    return 0
  end
end

negamax正文的前两行需要为:

if board_obj.game_over?
  return value(board_obj, mark)

也就是说,相对于 Ruby、良好的设计原则等,这个整体程序还有很多不足之处(无意冒犯)。现在您已经运行了它,您可能想前往 Code Review SE 以获得一些反馈。 :-) 虽然使用 TDD 为时已晚 ;-),但“测试”也是一个不错的选择。

另外,请理解,对于其他 cmets,这不是您通常会在 SO 获得答案的问题。我什至不知道这个问题是否会在审核过程中幸存下来而不会被删除。我出于各种个人原因进行了研究。

更新:查看您的参考实现,您会注意到 negamax 代码包含表达式 sign[color]*Analysis(b)。您实际上错过了sign[color]

【讨论】:

  • 不客气。感谢接受。如果您愿意,请随时“投票”。它会让我超过 1k 代表,我会永远记得我是如何到达那里的(如果问题仍然存在的话)。 ;-)
  • 我是 SO 新手,一旦获得所需的 15 个代表,我肯定会投赞成票
  • :-) 不知道有最低要求。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多