先上运行代码后的视频:
再上一个深度受限树搜索算法的伪代码表示:
最后贴上我的代码
def depthFirstSearch(problem):
"""
Search the deepest nodes in the search tree first.
Your search algorithm needs to return a list of actions that reaches the
goal. Make sure to implement a graph search algorithm.
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 ***"
def Recursive_DFS(node,problem,solution,closedSet):
# 测试当前送进来的节点是否满足目标要求,如果是一个可行解,就返回行动方案
if problem.isGoalState(node):
return solution
# 否则,就构造循环遍历这个节点的所有子节点
else:
for child,direction,cost in problem.getSuccessors(node):
# 如果子节点是还没有计算过的节点,就开始继续往下走
if child not in closedSet:
# 在行动方案中增加当前子节点的执行动作
solution.append(direction)
# 然后把这个子节点增加到计算过的节点集合中
closedSet.add(child)
# 调用递归函数继续从当前子节点往下计算
result = Recursive_DFS(child,problem,solution,closedSet)
# 判定一下计算结果
if result!=False:
# 如果找到了可行路线,则把行动方案返回出去吧
# 附带一句:return有停止当前函数继续运行的效果哟!
return solution
else:
# 如果从这个节点往下没有可行路线,就要撤销刚才的执行动作
solution.pop()
# 这个else和for对应,表示所有的子节点都遍历过了,没找到合适的行动方案,查找失败
else:
return False
solution = []
# 因为我们的数据结构是图,不是树,所以要构造一个集合用于判定某个节点是否已经算过了,否则会死循环
closedSet = set()
# 一开始把初始位置加入上述集合中,意味着Pacman不能经过这个节点了
closedSet.add(problem.getStartState())
# 调用递归函数进行问题求解,多一个参数就是上面的集合
solution = Recursive_DFS(problem.getStartState(),problem,solution,closedSet)
return solution
因为CSS188的作业要求尽量按照课堂幻灯的算法描述进行编程,所以下方的代码和上面的算法描述有一些不一致,但是我的注释可以帮助你理解这个程序,两个算法的基本思想还是类似的:
def
GitHub地址:
xuejing80/learnpythongithub.com