我正在使用alpha beta算法用python编写游戏Caro而且我不明白为什么它在我的字母功能中不起作用请帮我!!
这是我的代码
def alphabeta(board, depth, alpha, beta, player):
x = 0
y = 0
if(depth == 0 or game_over(board)):
return x, y
if(player == COMP):
v = -infinity
for row in range(len(board)):
for col in range(len(board[row])):
if(valid_move(board, row, col)):
v = max(v, alphabeta(board, depth - 1, alpha, beta, HUMAN)[0])
if(v <= alpha):
x = row
y = col
alpha = max(alpha, v)
if(beta <= alpha):
break
return x, y
else:
v = +infinity
for row in range(len(board)):
for col in range(len(board[row])):
if(valid_move(board, row, col)):
v = min(v, alphabeta(board, depth - 1, alpha, beta, COMP)[0])
if(v > beta):
x = row
y = col
beta = min(beta, v)
if(beta <= alpha):
break
return x, y
return x, y
我的完整代码:https://github.com/ledutu/caro/blob/master/new.py
更新1:这是我的固定功能:
def alphabeta(board, depth, alpha, beta, player):
results = return_score(board, player)
value, x, y = results1[0], results1[1], results1[2]
if(depth == 0 or game_over(board)):
return value, x, y
if(player):
v = -infinity
for row in range(len(board)):
for col in range(len(board[row])):
if(valid_move(board, row, col)):
v = max(v, alphabeta(board, depth - 1, alpha, beta, HUMAN)[0])
if(v >= alpha):
x = row
y = col
alpha = max(alpha, v)
if(beta <= alpha):
break
return alpha, x, y
else:
v = +infinity
for row in range(len(board)):
for col in range(len(board[row])):
if(valid_move(board, row, col)):
v = min(v, alphabeta(board, depth - 1, alpha, beta, COMP)[0])
if(v < beta):
x = row
y = col
beta = min(beta, v)
if(beta <= alpha):
break
return beta, x, y
图片:picture for executing program
我尝试运行,但AI无法正常工作。当我编号为35时,AI编号为89。当我编号为36时,它没有阻塞但编号为88。我检查并只允许在不超过1的长度内比赛。
谢谢您的阅读!
主要问题是您的alphabeta
函数具有返回move(x和y坐标)的return
语句,而您对alphabeta
的递归调用将返回的对的第一个坐标视为评估。这是不对的。实际上,您的函数从不评估职位。
要采取的两个动作:
所以基本情况:
if (depth == 0 or game_over(board)):
return evaluate(board), None, None # value, x, y
相应地更改其他return
条语句:
return value, x, y
现在递归调用将正确地获取值(通过取返回值的[0]
。
仍然在那儿出错。将if(v <= alpha)
更改为if(v >= alpha)
,因为要跟踪best移动,而不是最坏的移动。同样,将if(v > beta)
更改为if(v < beta)
由于在if
和else
块中都执行了return
,所以最终的return
(在if...else
块之后)将永远不会执行。我将在return
和if
块的末尾删除这两个else
语句。只需进入最后的return
语句即可,这两种情况都相同。
最后,更改alphabeta
的主要调用,使其忽略该值而检索最佳移动-添加[1:]
:
move = alphabeta(board, 2, -infinity, +infinity, COMP)[1:]
备注:
您的评估非常基本(1、0或-1)。通过应用启发式方法,您将获得更好的结果,从而使董事会价值更具差异性。