Python:程序保持循环但无处可去。我该如何解决?

时间:2013-10-02 01:13:35

标签: python loops tree

我不想问这样的问题,因为我觉得我应该自己找出解决方案,但我对这段代码究竟出了什么问题感到很茫然。我希望一双新鲜的眼睛能够揭示出一些我认为理所当然的功能缺陷。

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

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

这就是应该发生的事情,但是当我运行程序时,它会无限地继续下去。基于一些调试,我相信我的循环有一个问题,就是找到一个新的父节点。第一个父项工作正常,它是有效的父项,并获取创建的第一批子节点并将其添加到树列表中。一旦选择了第二个(根据我的计算并通过打印测试确认是'无效'节点),进度如下:

  1. 找不到新的孩子(这是无效父节点的预期功能)

  2. 父级未添加到树列表中,因为它已经存在(再次,预期的功能)

  3. 将父母添加到已探索的列表中,因为它尚未在那里找到(预期的功能,到目前为止一切都很好)

  4. 出现选择下一位家长的循环,这里出现问题

  5. 据我所知,选择新父母的循环只是不断地一遍又一遍地选择同一个第二父母。我已经调试了打印测试,发现整个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
    

    编辑:这是所要求的类定义:

    class node:
        def __init__(self):
            self.farmer, self.wolf, self.sheep, self.cabbage = False, False, False, False
            self.parent = None
            self.cost = 0
        def copy(self, child):
            child.farmer = self.farmer
            child.wolf = self.wolf
            child.sheep = self.sheep
            child.cabbage = self.cabbage
            child.parent = self
            child.cost = self.cost
    

    没有 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)
    

    但它并没有改变我的任何东西,问题仍然存在。

0 个答案:

没有答案