使用检查器进行Alpha-beta修剪

时间:2011-09-14 09:47:48

标签: python artificial-intelligence

我想为跳棋游戏实施人工智能。我不能理解alpha beta修剪的原理,因为没有任何作用!!
我希望算法在某个时间(5或10秒)停止。但是,我认为使用我的算法,它永远不会停止。此外,算法永远不会削减分支。

编辑:
我有这些错误:

    File "player.py", line 61, in min_value
    v = min(v, self.max_value(pBoard, single_move, pDue, alpha, beta))
    File "player.py", line 44, in max_value
    v = max(v, self.min_value(pBoard, single_move, pDue, alpha, beta))
    File "player.py", line 61, in min_value
    [...]  
    File "player.py", line 61, in min_value
    v = min(v, self.max_value(pBoard, single_move, pDue, alpha, beta))
    File "player.py", line 44, in max_value
    v = max(v, self.min_value(pBoard, single_move, pDue, alpha, beta))
    File "player.py", line 61, in min_value

    TypeError: unorderable types: NoneType() < float()

如果有人能够清楚地解释实施过程,我将非常感激。 这是我用python编写的内容:
“评估”功能给出了相对于棋盘上棋子位置的值。

    def calc_move(self, pBoard, pDue):
       score =0
       validMoves = pBoard.find_possible_moves(CELL_OWN)
       for move in validMoves:
          pBoard.do_move(move)
          score_move = self.max_value(pBoard, move, pDue, -float('inf'), float('inf'))
          if score_move > score:
             score = score_move
             best_move = move
       return best_move

    def max_value(self, pBoard, move, pDue, alpha, beta):
      if pDue - time.time() < 0.5 or move.is_EOG():
         return self.evaluation(move, CELL_OWN)
      v = -float('inf')
      validMoves = pBoard.find_possible_moves(CELL_OWN)
      for single_move in validMoves:
          pBoard.do_move(single_move)
          v = max(v, self.min_value(pBoard, single_move, pDue, alpha, beta))
          if v >= beta:
             return v
          alpha = max(alpha, v)
      return v

    def min_value(self, pBoard, move, pDue, alpha, beta):
      if pDue - time.time() < 0.5 or move.is_EOG():
         return self.evaluation(move, CELL_OTHER)
      v = float('inf')
      validMoves = pBoard.find_possible_moves(CELL_OTHER) 
      for single_move in validMoves:
         pBoard.do_move(single_move)
         v = min(v, self.max_value(pBoard, single_move, pDue, alpha, beta))
         if v <= alpha:
           return v
         beta = min(beta, v)
      return v

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

File "player.py", line 61, in min_valueTypeError: unorderable types: NoneType() < float()是重要的提示。您应该考虑实际的错误消息比您所说的有关您遇到的问题的其他任何内容都更重要。

由于您没有阅读错误消息,因此您可以向我们猜测哪一行是第61行。

在该函数中有一些似乎相关的比较(即min()if v <= alpha)。

错误消息表明vNone

由于v可以来自return self.evaluation(move, CELL_OWN)的值,看起来self.evaluation正在返回None。这通常是因为没有return或没有表达式的return而发生的。