Python:程序不断循环,但毫无进展。我怎样才能修好它?

Python:程序不断循环,但毫无进展。我怎样才能修好它?,python,loops,tree,Python,Loops,Tree,我不喜欢问这样的问题,因为我觉得我真的应该自己找出解决方案,但我真的不知道这段代码到底出了什么问题。我希望通过对它的重新审视,可以发现一些我认为理所当然的功能缺陷 这个程序的目标是执行一个图形搜索,以解决一个经典的谜语。它首先将所有四个bool的父节点设置为false,目标是将它们全部设置为true。这是通过基于验证函数查找节点的所有有效子节点并将它们放入节点的“树”列表中来完成的。父节点也被放入节点的“已探索”列表中 在查找下一个要使用的子节点时,循环会在树列表中查找成本最低的值,同时忽略列表

我不喜欢问这样的问题,因为我觉得我真的应该自己找出解决方案,但我真的不知道这段代码到底出了什么问题。我希望通过对它的重新审视,可以发现一些我认为理所当然的功能缺陷

这个程序的目标是执行一个图形搜索,以解决一个经典的谜语。它首先将所有四个bool的父节点设置为false,目标是将它们全部设置为true。这是通过基于验证函数查找节点的所有有效子节点并将它们放入节点的“树”列表中来完成的。父节点也被放入节点的“已探索”列表中

在查找下一个要使用的子节点时,循环会在树列表中查找成本最低的值,同时忽略列表中已经存在的任何节点。找到成本最低的下一个节点后,它将其作为新的父节点返回,循环再次开始。到达目标节点后,循环退出,构建到目标节点的路径,并以特殊格式打印

这就是应该发生的一切,但当我运行程序时,它只是无限地继续。根据一些调试,我认为查找新父节点的循环存在问题。第一个父节点工作正常,它是有效的父节点,并获取创建并添加到树列表的第一批子节点。根据我的计算并通过打印测试确认第二个节点为“无效”节点后,进度如下所示:

未找到新的子节点这是无效父节点的预期功能

父级未添加到树列表中,因为它已在树列表中,并且具有预期的功能

父项被添加到探索列表中,因为它还没有找到预期的功能,到目前为止都很好

选择下一个父项的循环出现,这里是出现问题的地方

据我所知,选择新父对象的循环只是不断地一次又一次地选择相同的第二个父对象。我已经通过打印测试进行了调试,发现整个while循环只会不断地拾取和拒绝完全相同的节点,即使它在添加到列表后不应该多次拾取该节点

我的名单上有什么我没看到的地方吗?这是代码供参考。谢谢所有能帮我的人

#for parent is not equal to goal
while not isGoal(parent):
    if validate(parent, explored):  
        getchildren(parent)
        #print parent.farmer

    #add parent to explored nodes
    if parent not in explored:
        explored.append(parent)
    if parent not in tree:
        tree.append(parent)
        #print parent.farmer

    #find next node to explore

    temp = node()
    temp.cost = sys.maxint  #this ensures that the first temp is always replaced by the first unexplored tree node
    for i in range(0, len(tree)):
            if tree[i] not in explored and tree[i].cost <= temp.cost:
                tree[i].copy(temp)
                #print temp.farmer, temp.wolf, temp.sheep, temp.cabbage
    temp.copy(parent)

#now return to the top of the while and do it again
没有eq功能

编辑:我添加了这个eq函数:

def __eq__(self, node):
        if self.farmer == node.farmer and self.wolf == node.wolf and self.sheep == node.sheep and self.cabbage == node.cabbage:
            return True
        return False
并在节点中更改了此代码:

for i in range(0, len(tree)):
        for j in range(0, len(explored)):
            if tree[i].__eq__(explored[j]) is False and tree[i].cost <= temp.cost:
                tree[i].copy(temp)
                #print temp.farmer, temp.wolf, temp.sheep, temp.cabbage
    temp.copy(parent)

但这对我来说没有任何改变,问题仍然存在。

这是一个SO问题的大量代码。你能把它剪下来吗?我想可能有点太多了。很抱歉。我继续往下看,把它删减到我认为最有可能导致我的问题的地方。我查看了完整的代码。我不清楚的是,如何确定两个节点是否相等。您的类节点没有_eq__self,other方法。这可能很重要,因为您可以通过克隆创建新节点。我假设,当检查列表中是否存在对象时,python正在检查是否相等。正如@aspiring.algorist所说,如果您的节点类中没有显式的_eq_____________________________________________。你能再次显示这部分代码吗?很抱歉消失了。我无法在此计算机上访问该代码。我将尝试在其他地方访问它。为什么Python需要一个特定的方法来实现这种行为?我不是要抨击它或其他什么,我只是对这种语言的新用户感到好奇。
for i in range(0, len(tree)):
        for j in range(0, len(explored)):
            if tree[i].__eq__(explored[j]) is False and tree[i].cost <= temp.cost:
                tree[i].copy(temp)
                #print temp.farmer, temp.wolf, temp.sheep, temp.cabbage
    temp.copy(parent)