2011-09-14 76 views
-2

我想爲跳棋遊戲實現人工智能。我不明白alpha beta修剪的原理,因爲沒有任何工作!
我希望算法在某個時間停止(5或10秒)。但是,我認爲,用我的算法,它永遠不會停止。此外,該算法不會削減分支。帶跳棋的Alpha-beta修剪

編輯:
我有這些錯誤:

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 

感謝您的幫助。

+2

「什麼都行不通!!」這是模糊的。 「它永遠不會停止。」這是模糊的。 「它」是什麼意思?哪個功能?所有這些使用'for',所以他們看起來像他們會終止。 「此外,該算法不會削減分支。」如果它永不停止,那麼「永不削減分支」部分並不意味着太多,是嗎?請添加'print'語句來顯示此代碼中各個點上正在發生的事情。沒有'print',我們都只是在猜測。添加'print'後,請包含顯示錯誤的示例輸出。 –

+0

'TypeError:unorderable types:NoneType()

回答

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。這經常發生是因爲沒有returnreturn沒有表達式。

+1

+1代碼應始終構建/運行而不會出錯。忘記算法正確性問題,直到這些問題得到解決。 – phkahler