Skip to main content
 首页 » 编程设计

python之能够使用 DFS 找到路径但不能指定 Pacman _ Python 的正确方向

2025年05月04日19tintown

为了好玩,我正在 berkley 网站的 AI 类(class)页面上找到一项作业。我需要为 pacman 游戏编写深度优先搜索,以便它可以找到它的路径。问题是 pacman 卡住了。我将首先粘贴代码以使我说的更清楚:

import util 
 
class SearchProblem: 
  """ 
  This class outlines the structure of a search problem, but doesn't implement 
  any of the methods (in object-oriented terminology: an abstract class). 
 
  You do not need to change anything in this class, ever. 
  """ 
 
  def getStartState(self): 
     """ 
     Returns the start state for the search problem  
     """ 
     util.raiseNotDefined() 
 
  def isGoalState(self, state): 
     """ 
       state: Search state 
 
     Returns True if and only if the state is a valid goal state 
     """ 
     util.raiseNotDefined() 
 
  def getSuccessors(self, state): 
     """ 
       state: Search state 
 
     For a given state, this should return a list of triples,  
     (successor, action, stepCost), where 'successor' is a  
     successor to the current state, 'action' is the action 
     required to get there, and 'stepCost' is the incremental  
     cost of expanding to that successor 
     """ 
     util.raiseNotDefined() 
 
  def getCostOfActions(self, actions): 
     """ 
          actions: A list of actions to take 
 
     This method returns the total cost of a particular sequence of actions.  The sequence must 
     be composed of legal moves 
     """ 
     util.raiseNotDefined() 
 
 
def tinyMazeSearch(problem): 
  """ 
      Returns a sequence of moves that solves tinyMaze.  For any other 
  maze, the sequence of moves will be incorrect, so only use this for tinyMaze 
  """ 
  from game import Directions 
  s = Directions.SOUTH 
  w = Directions.WEST 
  return  [s,s,w,s,w,w,s,w] 
 
def depthFirstSearch(problem): 
 
  """ 
  Search the deepest nodes in the search tree first [p 74]. 
 
  Your search algorithm needs to return a list of actions that reaches 
  the goal.  Make sure to implement a graph search algorithm [Fig. 3.18]. 
 
  To get started, you might want to try some of these simple commands to 
  understand the search problem that is being passed in: 
 
  print 'Start:', problem.getStartState() 
  print 'Is the start a goal?', problem.isGoalState(problem.getStartState()) 
  print 'Start's successors:', problem.getSuccessors(problem.getStartState()) 
 
  """ 
 
  # *** YOUR CODE HERE *** 
 
 
  start = [problem.getStartState()] 
  for item in start: 
      Open=[item] 
  State=[] 
  Closed=[] 
  Path=[] 
 
  if problem.isGoalState(Open[0]) is True: 
      return State 
  else: 
       while Open: 
                visit= Open.pop() 
                Closed.append(visit) 
                if State:  
                  Path.append(State.pop()) 
 
                if problem.isGoalState(visit) is True: 
                    print Closed 
                    return Path 
                else: 
                    Successors= problem.getSuccessors(visit) 
                    for index in Successors: 
                            it=iter(index) 
                            data=it.next() 
 
                            if data not in Closed : 
                              Open.append(data) 
                              State.append(it.next()) 
                            else: 
                              print Path 

现在,如果您在 dfs 下阅读我的代码,您会看到 open 列表包含我访问和扩展的所有点。

Path 文件包含为 pacman 设置的方向。当我遇到我得到的两个后继者都未被访问的情况时,问题就出现了,我的 pacman 走了一条通往死胡同的路径,所以它需要回溯。我的 Open 做到了并找到了解决方案,但我无法找到如何在我的路径列表中提供回溯方向的方法。如果你要去http://inst.eecs.berkeley.edu/~cs188/sp09/projects/search/search.html并下载 zip 并将我的代码粘贴到 dfs 搜索下的 search.py​​ 中,您将了解我的问题。

请您参考如下方法:

一些提示:

  • 您检查的每个节点都应该封装您如何到达那里的数据。
  • DFS 就像一个堆栈;您首先按下启动状态。您弹出堆栈,然后推回可以跟随您弹出的节点的节点。
  • 由于您最终要尝试找到一条路径,因此节点数据必须包含您的位置以及您到达那里所采用的路径。