Python 寻路代码产生意外的结果

Python 寻路代码产生意外的结果,python,path-finding,Python,Path Finding,首先,请原谅这个不好的标题,但我不知道如何用一句话来描述它 给定一个包含3种字段的网格,空字段、墙和出口,我编写了一个程序来检查每个空字段,该字段是否“安全”。 一个人穿过网格,但只能非对角行走,不能穿过墙壁。这个人从一个场地开始,随机选择一个方向,然后开始朝那个方向走。一旦它撞到墙上,它会再次随机选择一个方向,开始向那个方向移动,以此类推。 如果一个人如上文所述,从该字段开始,穿过网格,保证在某个点找到出口,则该字段被认为是安全的 我编写了一个Python程序来解决这个问题。它为它检查的每个字

首先,请原谅这个不好的标题,但我不知道如何用一句话来描述它

给定一个包含3种字段的网格,空字段、墙和出口,我编写了一个程序来检查每个空字段,该字段是否“安全”。 一个人穿过网格,但只能非对角行走,不能穿过墙壁。这个人从一个场地开始,随机选择一个方向,然后开始朝那个方向走。一旦它撞到墙上,它会再次随机选择一个方向,开始向那个方向移动,以此类推。 如果一个人如上文所述,从该字段开始,穿过网格,保证在某个点找到出口,则该字段被认为是安全的

我编写了一个Python程序来解决这个问题。它为它检查的每个字段构建一个“树”,包含来自该字段的所有可能路径。 我有一个函数,它只返回给定节点的“父节点”,递归地将当前节点的父节点添加到节点列表中,直到它到达最顶端的节点

当只检查一个字段(例如(1,4))时,程序按预期工作。但是,当检查示例网格的所有字段时,它不起作用

我已经研究过了,并意识到返回给定节点的所有父节点的alle_parents()函数在检查所有节点时会产生意外的结果。例如,当检查字段(1,4)时,该节点的一个子节点是(1,8)。(1,8)的父母应该是(1,4)。但事实并非如此。alle_parents((1,8))返回许多不应该存在的不同字段。但是我不明白为什么它会这样。我唯一的猜测是,这与“遗留”数据/GC不能按预期工作有关

相关代码:

class Knoten():
    def __init__(self, x, y, parent = None):
        self.x = x
        self.y = y
        self.parent = parent
        self.children = []

n = len(spielfeld)
m = len(spielfeld[0])
for k in range(n):
    for j in range(m):      
        if spielfeld[k][j] not in [None, '#', 'E']:
            baum = []
            i = 0
            ebene = []
            ebene.append(Knoten(k, j))
            baum.append(ebene)

            i += 1
            while i <= 100:
                ebene = []

                for knoten in baum[i - 1]:
                    children = []

                    if spielfeld[knoten.x][knoten.y] == 'E':
                        continue

                    for feld in next_feld(knoten.x, knoten.y):
                        knoten_neu = Knoten(feld[0], feld[1], knoten)

                        hinzufuegen = True
                        for parent in alle_parents(knoten_neu):
                            if knoten_neu.x == parent.x and knoten_neu.y == parent.y:
                                hinzufuegen = False

                        if hinzufuegen:
                            ebene.append(knoten_neu)
                            children.append(knoten_neu)

                    knoten.children = children

                    if children == []:
                        if spielfeld[knoten.x][knoten.y] != 'E':
                            spielfeld[k][j] = '%' # Field not safe

                baum.append(ebene)
                i += 1

def alle_parents(knoten, parents = []):
    if knoten.parent == None:
        return parents
    else:
        parents.append(knoten.parent)
        return alle_parents(knoten.parent, parents)

完整代码(部分为德语,对此表示抱歉):

我怀疑您的问题是一个常见的Python问题。这一行:

def alle_parents(knoten, parents = []):
在加载模块时创建空数组,而不是每次调用函数时。以后对alle_parents()的调用将重用相同的数组(其大小可能已增大),而不是新的空数组!解决此问题的一个好方法是:

def alle_parents(knoten, parents = None):
    parents = parents or []

如果有人需要任何进一步的信息/解释/代码,只管说出来。因为我不太确定问题出在我自己身上,我也不确定什么是相关的:)你的代码缩进被破坏了。请把它修好。问问你的老师或学习伙伴谢谢!至少我不会再犯那个错误了:D
def alle_parents(knoten, parents = None):
    parents = parents or []