如何解决随着搜索深度的增加,Alpha-beta 剪枝代理似乎选择了更糟糕的动作
我正在用 Python 为棋盘游戏 Quoridor 的 2 人版实现一个 AI 控制器,并且我正在使用 Negamax 算法的 Alpha-beta 修剪变体。 我希望增加搜索深度会导致代理采用更好的策略,但这在我的实现中不会发生。通过从深度 3 传递到 4(更大的深度现在具有不可接受的计算时间),代理从玩得足够好到玩真正糟糕的比赛。我很确定(根据找到的文献和游戏的逻辑)我使用的启发式方法是有效的,所以我无法弄清楚问题是什么。这是我的 alpha-beta 修剪实现
#self._h_type: heuristic type used by the agent
#self._env: board in a given status
def alphaBeta(depth,alpha,beta):
if self._env.isTerminal() or not depth:
return (self._env.getHeuristic(self._h_type),None)
else:
max_value=(-math.inf,None)
for a in self._env.getActions():
self._env.update(a)
x=alphaBeta(depth-1,(-beta[0],beta[1]),(alpha[0],alpha[1]))
if -x[0]>max_value[0]:
max_value=(-x[0],a)
elif -x[0]==max_value[0] and uniform(0,1)>0.5:
max_value=(-x[0],a)
self._env.undo()
if max_value[0]>alpha[0]:alpha=max_value
if alpha[0]>=beta[0]: return alpha
return max_value
move=alphaBeta(self._depth,(-math.inf,None),(math.inf,None))
self._env.update(move[1])
启发式函数计算两个玩家(当前回合的玩家和对手之间)到他目标行的最短路径长度之间的差异,这是对这场比赛优势的客观衡量
#shortest path heuristic.
#+/- 1000 for terminal state
#difference of shortest paths length to the goal rows
def getSpHeuristic(self):
if self.isTerminal(): return self.getWmHeuristic()
else:
p1=self.getMovingPawn()
p2=self.getopponentPawn()
len(self._graph.shortestPath(p2.getPosition(),p2.getGoalRow()))\
-len(self._graph.shortestPath(p1.getPosition(),p1.getGoalRow()))
解决方法
首先,就您的实施而言,有几个可能的问题:
- 当您在 for 循环中递归到 alphaBeta 时,alpha[0] 也应设置为负数(即 -alpha[0])
- 在 alpha>=beta 的情况下,您不应返回 alpha... 您应该中断或等效地返回 max_value
其次,您实际上是在为您的代理不断提出您想要问的问题:增加探索的收益是否会超过产生额外计算/时间的损失。
第三,对于对抗性搜索,特别是您遇到的问题是预料之中的。在更大的深度,您可能会用完时间,并且必须在完成遍历树之前返回答案。在这种情况下,答案通常比深度较小的完整答案差。
有各种各样的技巧可以在减少计算的同时增加搜索量。 Alpha-beta 剪枝就是这样一种方法。 negamax 也是如此。
chess-ai 上的这个 site 很好地收集了可以在 alpha-beta 中使用的各种技巧。 Iterative deepening 可能是您尝试的下一个技巧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。