我想爲我的國際象棋引擎寫一個negamax搜索算法,但我似乎無法得到它的工作。我使用wikipedias僞代碼作爲示例,但不知何故,它不會產生預期的結果。當我用2層運行它時,它會改變我的板數據結構,但它不應該。功能完成後,使用層2運行,所有的白色(或黑色)取決於玩家所稱的功能。小兵從起始位置向前移動2個空格。
我的make和unmake move函數工作得很完美,因爲我用一個非遞歸函數測試它們,最多搜索5層。然後,它完美地工作。我的negamax實現一定有什麼問題。
非常感謝您的幫助!
def negaMax(self, board, rules, ply, player):
""" Implements a minimax algorithm. """
if ply == 0:
return self.positionEvaluation()
self.max_eval = float('-infinity')
self.move_list = board.generateMoves(rules, player)
for self.move in self.move_list:
board.makeMove(self.move, player)
self.eval = -self.negaMax(board, rules, ply - 1, board.getOtherPlayer(player))
board.unmakeMove(self.move, player)
if self.eval > self.max_eval:
self.max_eval = self.eval
return self.max_eval
在使用遞歸算法時,您應該避免使用對象變量(或靜態變量)。我會嘗試將他的算法轉換爲僅使用局部變量,並嘗試調試它們。我可以向你保證,至少 - 調試起來要容易得多。 – amit
你能解釋爲什麼嗎? – geekkid
是的。對象變量對所有遞歸調用都是通用的。當一個人改變它 - 都看到它。它導致更復雜的代碼,這是很難遵循的,而僅使用局部變量的遞歸代碼是非常自包含的,並且更易於理解和更易於調試。 – amit