我通過使用卷積神經網路來評估特定的棋盤狀態來撰寫國際象棋 AI,然后我使用該評估來應用 min_max 演算法來獲取 AI 的移動。當我在演算法上通過 2 的深度時,我得到一個關于將元組與標量進行比較的錯誤。
def NN_evaluate(board):
board3d = split_dims(board)
board3d = np.expand_dims(board3d, 0)
return model.predict(board3d)[0][0]
def minimax(board, depth, alpha, beta, maximizing_player):
if depth == 0 or board.is_game_over():
return NN_evaluate(board)
moves = board.legal_moves
if maximizing_player:
max_eval = -np.Inf
for move in moves:
board.push(move)
current_eval = minimax(board, depth-1, alpha, beta, False)
board.pop()
max_eval = max(max_eval, current_eval)
best_move = move
alpha = max(alpha, current_eval)
if beta <= alpha:
break
return max_eval
else:
min_eval = np.Inf
for move in moves:
board.push(move)
current_eval = minimax(board, depth-1, alpha, beta, True)
board.pop()
min_eval = min(min_eval, current_eval)
best_move = move
beta = min(beta, current_eval)
if beta <= alpha:
break
return min_eval
def get_ai_move(board, depth, maximizing_player):
max_move = None
max_eval = -np.inf
for move in board.legal_moves:
board.push(move)
current_eval = minimax(board, depth-1, -np.inf, np.inf, False)
board.pop()
if current_eval > max_eval:
max_eval = current_eval
max_move = move
return max_move
board = chess.Board()
with chess.engine.SimpleEngine.popen_uci('C:\\Users\\coope\\Downloads\\Python\\Machine Learning\\Chess AI\\stockfish_15_win_x64_avx2\\stockfish_15_x64_avx2.exe') as engine:
while True:
move = get_ai_move(board, 3, True)
board.push(move)
print(f'\n{board}')
if board.is_game_over():
break
move = engine.analyse(board, chess.engine.Limit(time=1), info=chess.engine.INFO_PV)['pv'][0]
board.push(move)
print(f'\n{board}')
if board.is_game_over():
break
錯誤如下
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_1108/561116885.py in <module>
3 with chess.engine.SimpleEngine.popen_uci('C:\\Users\\coope\\Downloads\\Python\\Machine Learning\\Chess AI\\stockfish_15_win_x64_avx2\\stockfish_15_x64_avx2.exe') as engine:
4 while True:
----> 5 move = get_ai_move(board, 3, True)
6 board.push(move)
7 print(f'\n{board}')
~\AppData\Local\Temp/ipykernel_1108/3382320008.py in get_ai_move(board, depth, maximizing_player)
40 for move in board.legal_moves:
41 board.push(move)
---> 42 current_eval = minimax(board, depth-1, -np.inf, np.inf, False)
43 board.pop()
44 if current_eval > max_eval:
~\AppData\Local\Temp/ipykernel_1108/3382320008.py in minimax(board, depth, alpha, beta, maximizing_player)
28 current_eval = minimax(board, depth-1, alpha, beta, True)
29 board.pop()
---> 30 min_eval = min(min_eval, current_eval)
31 best_move = move
32 beta = min(beta, current_eval)
TypeError: '>' not supported between instances of 'float' and 'NoneType'
這似乎是我的問題,但如果不崩潰min(min_eval, current_eval),我不確定如何修復它。get_ai_move(board, 2, True)
uj5u.com熱心網友回復:
您的
return max_eval
是在 for 回圈里面,應該在外面。像這樣寫有一種情況,它不執行,因此整個函式回傳None(如果你在函式中不回傳任何東西,python中的默認回傳值)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480437.html
上一篇:我也可以將RandomUnderSampler用于分類資料嗎?
下一篇:如何利用其他股票的模式預測股價?
