微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

随着搜索深度的增加,Alpha-beta 剪枝代理似乎选择了更糟糕的动作

如何解决随着搜索深度的增加,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()))

解决方法

首先,就您的实施而言,有几个可能的问题:

  1. 当您在 for 循环中递归到 alphaBeta 时,alpha[0] 也应设置为负数(即 -alpha[0])
  2. 在 alpha>=beta 的情况下,您不应返回 alpha... 您应该中断或等效地返回 max_value

其次,您实际上是在为您的代理不断提出您想要问的问题:增加探索的收益是否会超过产生额外计算/时间的损失。

第三,对于对抗性搜索,特别是您遇到的问题是预料之中的。在更大的深度,您可能会用完时间,并且必须在完成遍历树之前返回答案。在这种情况下,答案通常比深度较小的完整答案差。

有各种各样的技巧可以在减少计算的同时增加搜索量。 Alpha-beta 剪枝就是这样一种方法。 negamax 也是如此。

chess-ai 上的这个 site 很好地收集了可以在 alpha-beta 中使用的各种技巧。 Iterative deepening 可能是您尝试的下一个技巧。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。