1

所以这是我的代码,它在该行中断:

 if (suc not in sFrontier) or (suc not in sExplored):

给出错误:TypeError:“实例”类型的参数不可迭代

 """
    The pseudocode I'm following
initialize the frontier using the initial state of the problem
initialize the explored set to be empty
loop do
    if the frontier is empty then return failure
    choose a leaf node and remove it from the frontier
    if the node contains a goal state then return the corresponding solution
    add the node to the explored set
    expand the chosen node, adding the resulting nodes to the frontier
        only if not in the frontier or explored set
"""

sFrontier = util.Stack()
sFrontier.push(problem.getStartState())
sExplored = util.Stack()
lSuccessors = []

while not sFrontier.isEmpty():
  leaf = sFrontier.pop()

  if problem.isGoalState(leaf):
    solution = []
    while not sExplored.isEmpty():
      solution[:0] = (sExplored.pop())[2]
      return solution
  sExplored.push(leaf)
  lSuccessors = problem.getSuccessors(leaf)
  for suc in lSuccessors:
      if (suc not in sFrontier) or (suc not in sExplored):
        sFrontier.push(suc)
return []

question.getSuccessors 返回一个后继状态列表、它们需要的操作以及成本 1。

所以之后

lSuccessors = problem.getSuccessors(leaf)

l 继任者印刷品

  [((5,4), 'South', 1), ((4,5), 'West', 1)]

之后

  for suc in lSuccessors:

成功打印

  ((5,4), 'South', 1)

为什么会断?是因为 sFrontier 和 sExplored 是堆栈,它不能在堆栈中查找吗?

我需要一个 contains() 方法还是只使用一个列表?

所有帮助表示赞赏:)

4

4 回答 4

2

我假设util.Stack是你的课。

提供一种__contains__(self, x)使对象支持a in obj检查的方法。

请参阅文档:模拟容器类型

于 2013-01-29T18:38:37.370 回答
2

如果您的堆栈不支持包含测试,它确实会引发错误。您需要向它们添加一个__contains__方法来支持in测试。

测试还有其他方法in可以找到堆栈中的项目,但不推荐使用它们,因为它们的效率低于__contains__方法;请参阅in表达式文档

于 2013-01-29T18:38:40.373 回答
1

SFrontier是一个包含列表的类。您在代码中检查 suc 是否在 sFrontier 类中,因为 sFrontier 不可迭代,所以您无法检查它。您必须编写(suc in sFrontier.list)以便检查 suc 是否在您的类 sFrontier 包含的列表中。

于 2017-10-19T17:06:31.590 回答
-1

问题出在 if 案例的第一方面:

if (succ not in sFrontier)

因此,您将 sFrontier 初始化为 Stack 但 Stack 是一个类,并且类不可迭代。您的类必须在其中包含一个列表,以便它可以用作容器。如果是这种情况,您需要做的是:

if (succ not in sFrontier.list)
于 2017-10-19T16:55:27.790 回答