在红宝石中实施用于tic-tac-toe的negamax的问题

时间:2013-06-27 01:19:08

标签: ruby tic-tac-toe

我正在撞墙试图为tic-tac-toe实施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

它确实产生了结果,但人工智能很容易被击败所以我知道出了什么问题,任何帮助 非常感谢!

1 个答案:

答案 0 :(得分:1)

问题是value需要相对于mark当前执行中的negamax,而不是始终相对于计算机。如果您使用以下mark的修改定义将value参数从negamax传递给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已经太晚了;-),但是进行“测试”也是一个不错的选择。

此外,请理解,根据其他评论,这不是一个问题,你通常会在这里得到答案。我甚至不知道这个问题是否能够在审查过程中继续存在而不会被删除。我出于各种个人原因对其进行了研究。

更新:查看您的参考实现,您会注意到negamax代码包含表达式sign[color]*Analysis(b)。这是sign[color],你有效地失踪了。