井字棋Minimax函数未返回最优走法,仅按棋盘顺序输出问题排查
井字棋Minimax AI异常问题
我基于Minimax算法结构实现了井字棋AI,player函数本应返回当前局面的最优走法,但实际表现为仅按棋盘顺序返回可用空位(遇到已占据的位置就跳过,逻辑类似if board[move] != None: board[move + 1] = "O")。已独立验证Actions、Result、Terminal、Utility等辅助函数的逻辑均合理,仍无法定位问题所在。
核心AI逻辑代码
def player(board): if Terminal(board) != False: return None else: if turn(board) == "X": value,move = max_value(board) return move + 1 else: value,move = min_value(board) return move + 1 def max_value(board): global arg if Terminal(board) != False: ut = Utility(board) return ut,None else: v = -1000 move = None for action in Actions(board): aux,act = min_value(Result(board,action)) if aux > v: v = aux move = action if v == 1: return v,move return v,move def min_value(board): if Terminal(board) != False: ut = Utility(board) return ut,None else: v = 1000 move = None print(Actions(board)) for action in Actions(board): aux,act = max_value(Result(board,action)) if aux < v: v = aux move = action if v == -1: return v,move return v,move
辅助函数代码
def Actions(board = list): possible_moves = [] n = -1 for move in board: n += 1 if move == None: possible_moves.append(n) return possible_moves def Result(board,action): dc_board = board.copy() dc_board[action] = turn(board) return dc_board def Terminal(board): if board[0] == board[1] == board[2] and board[0] != None: return board[0] elif board[3] == board[4] == board[5] and board[3] != None: return board[3] elif board[6] == board[7] == board[8] and board[6]!= None: return board[6] elif board[0] == board[3] == board[6] and board[0] != None: return board[0] elif board[1] == board[4] == board[7] and board[1] != None: return board[1] elif board[2] == board[5] == board[8] and board[2] != None: return board[2] elif board[0] == board[5] ==board[8] and board[0]!= None: return board[0] elif board[2] == board[4] == board[6] and board[2] != None: return board[2] else: return False def Utility(board): result = Terminal(board) if result == False: return 0 elif result == "X": return 1 elif result == "O": return -1 else: print("Result:") print(result) print("Board:") print(board) raise "Utility conditions were not met."
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

