我不想问这样的问题,因为我觉得我应该自己找出解决方案,但我对这段代码究竟出了什么问题感到很茫然。我希望一双新鲜的眼睛能够揭示出一些我认为理所当然的功能缺陷。
这个程序的目标是执行图搜索以解决经典之谜。它以所有四个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
编辑:这是所要求的类定义:
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)
但它并没有改变我的任何东西,问题仍然存在。