为什么我的 Alpha-Beta 修剪会扩展不必要的节点?

如何解决为什么我的 Alpha-Beta 修剪会扩展不必要的节点?

我目前正在为极大极小函数实现 alpha-beta 剪枝算法。本练习对应于伯克利大学 PacMan 项目的多代理部分。

我的实现:

class AlphaBetaAgent(MultiAgentSearchAgent):
    """
    Your minimax agent with alpha-beta pruning (question 3)
    """

    def getAction(self,gameState):
        """
        Returns the minimax action using self.depth and self.evaluationFunction
        """
        "*** YOUR CODE HERE ***"
        def maxValue(state,depth: int,alpha: int,beta: int):
            depth += 1
            if state.isWin() or state.isLose() or depth == self.depth:
                return self.evaluationFunction(state)
            else:
                value: int = -sys.maxsize - 1
                legalActions: list = state.getLegalActions(0)
                for action in legalActions:
                    value = max(value,minValue(
                        state.generateSuccessor(0,action),1,depth,alpha,beta))
                    if beta <= value:
                        return value
                    alpha = max(alpha,value)
            return value

        def minValue(state,ghostIndex: int,beta: int):
            if state.isWin() or state.isLose():
                return self.evaluationFunction(state)
            else:
                value: int = sys.maxsize * 2 + 1
                legalActions: list = state.getLegalActions(ghostIndex)
                if ghostIndex == state.getNumAgents() - 1:
                    for action in legalActions:
                        value = min(value,maxValue(
                            state.generateSuccessor(ghostIndex,beta))
                else:
                    for action in legalActions:
                        value = min(value,minValue(state.generateSuccessor(
                            ghostIndex,ghostIndex + 1,beta))
                        if alpha >= value:
                            return value
                        beta = min (beta,value)
                return value

        pacManMoves: list = gameState.getLegalActions(0)
        value: int = -sys.maxsize - 1
        alpha: int = -sys.maxsize - 1
        beta: int = sys.maxsize*2+1
        move: str = Directions.STOP
        for currentMove in pacManMoves:
            currentValue = minValue(
                gameState.generateSuccessor(0,currentMove),beta)
            if (currentValue > value):
                value = currentValue
                move = currentMove
        return move

输出:

Question q3
===========

*** PASS: test_cases\q3\0-eval-function-lose-states-1.test
*** PASS: test_cases\q3\0-eval-function-lose-states-2.test
*** PASS: test_cases\q3\0-eval-function-win-states-1.test
*** PASS: test_cases\q3\0-eval-function-win-states-2.test
*** FAIL: test_cases\q3\0-lecture-6-tree.test
***     Incorrect generated nodes for depth=2
***         Student generated nodes: A B C D E F G H I max min1 min2 min3
***         Correct generated nodes: A B C D E F G H max min1 min2 min3
***     Tree:
***                max
***           /-/   |   \--\
***          /      |       \
***         /       |        \
***      min1      min2      min3
***       /|\      /|\       /|\
***      / | \    / | \     / | \
***     A  B  C  D  E  F   G  H  I
***     3 12  8  5  4  6  14  1  11
*** FAIL: test_cases\q3\0-small-tree.test
***     Incorrect generated nodes for depth=3
***         Student generated nodes: A B C D deeper minLeft minRight root
***         Correct generated nodes: A B C minLeft minRight root
***     Tree:
***             root
***            /    \
***      minLeft  minRight
***       / \       /    \
***      A   B     C   deeper
***      4   3     2     |
***                      D
***                    1000
*** FAIL: test_cases\q3\1-1-minmax.test
***     Incorrect generated nodes for depth=3
***         Student generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***         Correct generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \                 |
***        c1        c2             cx
***       /  \      /  \             |
***      d1   d2  d3   d4           dx
***     -3    -9  10    6         -3.01
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b1 is -3.
*** FAIL: test_cases\q3\1-2-minmax.test
***     Incorrect generated nodes for depth=3
***         Student generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***         Correct generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \                 |
***        c1        c2             cx
***       /  \      /  \             |
***      d1   d2  d3   d4           dx
***     -3    -9  10    6         -2.99
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b1 is -3.
*** FAIL: test_cases\q3\1-3-minmax.test
***     Incorrect generated nodes for depth=3
***         Student generated nodes: a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***         Correct generated nodes: a b1 b2 c3 cx d5 d6 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***              |                /    \
***             cx             c3        c4
***              |            /   \     /   \
***             dx           d5   d6   d7   d8
***            4.01          4    -7   0    5
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b2 is 4.
*** PASS: test_cases\q3\1-4-minmax.test
*** FAIL: test_cases\q3\1-5-minmax.test
***     Incorrect generated nodes for depth=4
***         Student generated nodes: A B C D E F G H Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***         Correct generated nodes: A B C D E F G Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***     Tree:
***                  /-----a------\
***                 /              \
***                /                \
***              b1                  b2
***            /    \                |
***         c1        c2             cx
***        /  \      /  \            |
***       d1   d2  d3   d4           dx
***      / \  / \  / \  / \          |
***      A B  C D  E F  G H          Z
***     -3 13 5 9 10 3 -6 8        3.01
***
***     a - max
***     b - min
***     c - max
***     d - min
***
***     Note the minimax value of b1 is 3.
*** FAIL: test_cases\q3\1-6-minmax.test
***     Incorrect generated nodes for depth=4
***         Student generated nodes: A B C D E F G H Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***         Correct generated nodes: A B C D E F G Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***     Tree:
***                  /-----a------\
***                 /              \
***                /                \
***              b1                  b2
***            /    \                |
***         c1        c2             cx
***        /  \      /  \            |
***       d1   d2  d3   d4           dx
***      / \  / \  / \  / \          |
***      A B  C D  E F  G H          Z
***     -3 13 5 9 10 3 -6 8        2.99
***
***     a - max
***     b - min
***     c - max
***     d - min
***
***     Note the minimax value of b1 is 3.
*** FAIL: test_cases\q3\1-7-minmax.test
***     Incorrect generated nodes for depth=4
***         Student generated nodes: I J K L M O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***         Correct generated nodes: I J K M O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***             |                 /    \
***             cx             c3        c4
***             |             /   \     /   \
***             dx           d5   d6   d7   d8
***             |           / \  / \  / \  / \
***             Z           I J  K L  M N  O P
***          -1.99        -1 -9  4 7  2 5 -3 -2
***
***     a - max
***     b - min
***     c - min
***     d - max
***
***     Note that the minimax value of b2 is -2
*** FAIL: test_cases\q3\1-8-minmax.test
***     Incorrect generated nodes for depth=4
***         Student generated nodes: I J K L M O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***         Correct generated nodes: I J K M O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***             |                 /    \
***             cx             c3        c4
***             |             /   \     /   \
***             dx           d5   d6   d7   d8
***             |           / \  / \  / \  / \
***             Z           I J  K L  M N  O P
***          -2.01        -1 -9  4 7  2 5 -3 -2
***
***     a - max
***     b - min
***     c - min
***     d - max
***
***     Note that the minimax value of b2 is -2.01
*** PASS: test_cases\q3\2-1a-vary-depth.test
*** FAIL: test_cases\q3\2-1b-vary-depth.test
***     Incorrect generated nodes for depth=2
***         Student generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***         Correct generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \                 |
***     -4 c1        c2 9           cx -4.01
***       /  \      /  \             |
***      d1   d2  d3   d4           dx
***     -3    -9  10    6         -4.01
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b1 is -3,but the depth=1 limited value is -4.
***     The values next to c1,c2,and cx are the values of the evaluation function,not
***     necessarily the correct minimax backup.
*** PASS: test_cases\q3\2-2a-vary-depth.test
*** FAIL: test_cases\q3\2-2b-vary-depth.test
***     Incorrect generated nodes for depth=2
***         Student generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 d4 dx
***         Correct generated nodes: a b1 b2 c1 c2 cx d1 d2 d3 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \                 |
***     -4 c1        c2 9           cx -3.99
***       /  \      /  \             |
***      d1   d2  d3   d4           dx
***     -3    -9  10    6         -3.99
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b1 is -3,not
***     necessarily the correct minimax backup.
*** PASS: test_cases\q3\2-3a-vary-depth.test
*** FAIL: test_cases\q3\2-3b-vary-depth.test
***     Incorrect generated nodes for depth=2
***         Student generated nodes: a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***         Correct generated nodes: a b1 b2 c3 cx d5 d6 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***              |                /    \
***      5.01   cx          8  c3        c4   5
***              |            /   \     /   \
***             dx           d5   d6   d7   d8
***            5.01          4    -7   0    5
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b1 is 4,but the depth=1 limited value is 5.
***     The values next to c3,c4,not
***     necessarily the correct minimax backup.
*** PASS: test_cases\q3\2-4a-vary-depth.test
*** FAIL: test_cases\q3\2-4b-vary-depth.test
***     Incorrect generated nodes for depth=2
***         Student generated nodes: a b1 b2 c3 c4 cx d5 d6 d7 d8 dx
***         Correct generated nodes: a b1 b2 c3 cx d5 d6 dx
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***              |                /    \
***      4.99   cx          8  c3        c4   5
***              |            /   \     /   \
***             dx           d5   d6   d7   d8
***            4.99          4    -7   0    5
***
***     a - max
***     b - min
***     c - max
***
***     Note that the minimax value of b1 is 4,not
***     necessarily the correct minimax backup.
*** FAIL: test_cases\q3\2-one-ghost-3level.test
***     Incorrect generated nodes for depth=3
***         Student generated nodes: a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8
***         Correct generated nodes: a b1 b2 c1 c2 c3 d1 d2 d3 d5 d6
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \              /     \
***        c1        c2        c3        c4
***       /  \      /  \      /   \     /   \
***      d1   d2  d3   d4    d5   d6   d7   d8
***      3    9   10   6     4    7    0    5
***
***     a - max
***     b - min
***     c - max
*** FAIL: test_cases\q3\3-one-ghost-4level.test
***     Incorrect generated nodes for depth=4
***         Student generated nodes: A B C D E F G H I J K L M N O P a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8
***         Correct generated nodes: A B C D E F I K a b1 b2 c1 c2 c3 d1 d2 d3 d5 d6
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \              /     \
***        c1        c2        c3        c4
***       /  \      /  \      /   \     /   \
***      d1   d2  d3   d4    d5   d6   d7   d8
***     / \  / \  / \  / \   / \  / \  / \  / \
***     A B  C D  E F  G H   I J  K L  M N  O P
***     3 13 5 9 10 11 6 8   1 0  4 7 12 15 2 14
***
***     a - max
***     b - min
***     c - max
***     d - min
*** FAIL: test_cases\q3\4-two-ghosts-3level.test
***     Incorrect generated nodes for depth=3
***         Student generated nodes: a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8
***         Correct generated nodes: a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \              /     \
***        c1        c2        c3        c4
***       /  \      /  \      /   \     /   \
***      d1   d2  d3   d4    d5   d6   d7   d8
***      3    9   10   6     4    7    0    5
***
***     a - max
***     b - min
***     c - min
*** FAIL: test_cases\q3\5-two-ghosts-4level.test
***     Incorrect generated nodes for depth=4
***         Student generated nodes: A B C D E G H I J K L M O a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8
***         Correct generated nodes: A B C D E G H I J a b1 b2 c1 c2 c3 d1 d2 d3 d4 d5
***     Tree:
***                 /-----a------\
***                /              \
***               /                \
***             b1                  b2
***           /    \              /     \
***        c1        c2        c3        c4
***       /  \      /  \      /   \     /   \
***      d1   d2  d3   d4    d5   d6   d7   d8
***     / \  / \  / \  / \   / \  / \  / \  / \
***     A B  C D  E F  G H   I J  K L  M N  O P
***     3 13 5 9 10 11 6 8   1 0  4 7 12 15 2 14
***
***     a - max
***     b - min
***     c - min
***     d - max
*** PASS: test_cases\q3\6-tied-root.test
*** PASS: test_cases\q3\7-1a-check-depth-one-ghost.test
*** PASS: test_cases\q3\7-1b-check-depth-one-ghost.test
*** PASS: test_cases\q3\7-1c-check-depth-one-ghost.test
*** PASS: test_cases\q3\7-2a-check-depth-two-ghosts.test
*** PASS: test_cases\q3\7-2b-check-depth-two-ghosts.test
*** PASS: test_cases\q3\7-2c-check-depth-two-ghosts.test
*** Running AlphaBetaAgent on smallClassic 1 time(s).
Pacman died! Score: 84
Average Score: 84.0
Scores:        84.0
Win Rate:      0/1 (0.00)
Record:        Loss
*** Finished running AlphaBetaAgent on smallClassic after 15 seconds.
*** Won 0 out of 1 games. Average score: 84.000000 ***
*** FAIL: test_cases\q3\8-pacman-game.test
***     Bug: Wrong number of states expanded.
*** Tests failed.

有很多练习固有的功能已经给出,我没有修改。唯一为练习目的而修改的函数就是上面提到的那个。

源代码: https://github.com/MaAlonsoA/AI-Class/tree/feature/AlphaBetaAgent

使用 python autograder.py -q q3 运行自动分级器

在 python 3.9.4 上运行

解决方法

解决方案:

我之前的实现中有两个错误:

  1. 以前在 minValue 函数中,如果只剩下一个幽灵,则计算所有'合法行为'的价值。这是不正确的,您只需计算一次。

            legalActions: list = state.getLegalActions(ghostIndex)
            if ghostIndex == state.getNumAgents() - 1:
                for action in legalActions:
                    value = min(value,maxValue(
                        state.generateSuccessor(ghostIndex,action),depth,alpha,beta))
            else:
    

固定:

        legalActions: list = state.getLegalActions(ghostIndex)
        for action in legalActions:
            if ghostIndex == state.getNumAgents() - 1:
                value = min(value,maxValue(
                        state.generateSuccessor(ghostIndex,beta))
                if alpha > value:
                    return value
                beta = min (beta,value)
            else:
  1. 需要检查 currentValue 是否大于 beta

        for currentMove in pacManMoves:
        currentValue = minValue(
            gameState.generateSuccessor(0,currentMove),1,beta)
        if (currentValue > value):
            value = currentValue
            move = currentMove
    return move
    

固定:

        for currentMove in pacManMoves:
        currentValue = minValue(
            gameState.generateSuccessor(0,beta)
        if currentValue > value:
            value = currentValue
            move = currentMove
        if currentValue > beta:
            return move
        alpha = max(alpha,value)
    return move

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

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res