0
[SearchAgent] using function depthFirstSearch
[SearchAgent] using problem type PositionSearchProblem
Path found with total cost of 999999 in 0.0 seconds
Search nodes expanded: 1
Traceback (most recent call last):
  File "C:\Documents and Settings\vpn\My Documents\Aptana Studio 3 Workspace\Project 1 - Search\pacman.py", line 672, in <module>
    runGames( **args )
  File "C:\Documents and Settings\vpn\My Documents\Aptana Studio 3 Workspace\Project 1 - Search\pacman.py", line 638, in runGames
    game.run()
  File "C:\Documents and Settings\vpn\My Documents\Aptana Studio 3 Workspace\Project 1 - Search\game.py", line 662, in run
    action = agent.getAction(observation)
  File "C:\Documents and Settings\vpn\My Documents\Aptana Studio 3 Workspace\Project 1 - Search\searchAgents.py", line 121, in getAction
    if i < len(self.actions):
TypeError: object of type 'NoneType' has no len()

我正在做一个项目,在该项目中我必须通过应用 DFS(深度优先算法)测试我的 pacman 代理以尽可能少的空间和时间复杂度到达其目的地

我的代码是

stack = util.Stack()
    explored = list()
    start = problem.getStartState()

    for item in problem.getSuccessors(start):
        state = item[0]
        path = list()
        path.append(item[1])
        stateInfo = (state, path)
        stack.push(stateInfo)
    explored.append(start)

    while stack.isEmpty():
        state = stack.pop()

        if problem.isGoalState(state[0]):
            return state[1]

        for states in problem.getSuccessor(state[0]):
            newstate = states[0]
            newpath = list(state[1])
            newpath.append(states[1])
            newstateInfo = (newstate, newpath)
            stack.push(newstateInfo)
        explored.append(state[0]) 

我现在应该怎么做.. 我的 pacman 代理卡在与目的地相对的东方向的起始位置。https://www.edx.org/courses/BerkeleyX/CS188.1x/2012_Fall/courseware/Week_2/Project_1_Search/中提到了运行代理的支持文件

4

1 回答 1

0

我想我知道发生了什么(尽管鉴于问题中的代码数量有限,我无法确定)。

我的猜测是,您发布的代码被调用来设置self.actions您遇到错误的变量。发生错误是因为您None从函数返回,而不是您期望的列表。

潜在的错误是您的主循环向后测试。你想要while not stack.isEmpty()的,而不是你拥有的。因为您刚刚将几个值压入堆栈,所以写入的循环立即退出。在循环之后,您到达函数的末尾,这相当于None在 Python 中返回。那 None 稍后会导致异常。

即使您修复了损坏的循环,如果无法找到到达目标状态的路径,也可能会从函数的末尾脱落。我建议添加代码来检测这一点,并做出适当的响应。您可以引发异常(因为它不应该在正常情况下发生),或者可能返回一个空列表。

还有一个问题是您没有检查是否已经探索了新访问的状态。当您从一个状态搜索到邻居然后返回时,这可能会导致无限循环。Aset也将优于 a listfor explored。您可以检查它if state in explored(这也适用于列表,但效率较低)。

作为一个附带问题,您的一些变量的命名非常糟糕。state在不同的时间有不同的类型,并且有第二个变量states会使它更加混乱,尤其是在引入索引的情况下。

我建议用代码解压你推入堆栈的元组state, path = stack.pop(),这将解决部分问题。然后只需重命名states为其他名称(或者也可以将其解压缩,使用类似的名称for neighbor, direction in problem.getSuccessor(state)),您就可以开始使用了。

您还可以通过将启动状态推送到堆栈来节省几行代码,而不是在设置代码中对其邻居进行额外的循环。

于 2012-10-13T14:46:37.857 回答