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 (Depth First Algorithm) を適用することにより、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 が後で例外を引き起こしています。

壊れたループを修正したとしても、目的の状態へのパスが見つからない場合、関数の最後から脱落する可能性があります。これを検出して適切に対応するコードを追加することをお勧めします。(通常の状況では発生しないため) 例外を発生させるか、空のリストを返すことができます。

新しく訪れた状態が既に探索されているかどうかを確認していないという別の問題があります。これは、ある状態から隣接する状態まで検索してから戻るため、無限ループにつながる可能性があります。Aはforsetよりも優れています。で確認できます(リストでも機能しますが、効率は低下します)。listexploredif state in explored

副次的な問題として、いくつかの変数の名前は非常に不十分です。stateさまざまな時間にさまざまな型があり、2 番目の変数statesがあると、特にインデックスが挿入されると、さらに混乱します。

コードを使用してスタックにプッシュしたタプルをアンパックすることをお勧めしますstate, path = stack.pop()。これにより、問題の一部が解決されます。次に、名前を別の名前に変更statesするだけです(または、のようなもので解凍することもfor neighbor, direction in problem.getSuccessor(state)できます)。

セットアップ コードで隣接するものに対して余分なループを実行するのではなく、開始状態をスタックにプッシュすることで、数行のコードを節約することもできます。

于 2012-10-13T14:46:37.857 に答える