寻路代码会产生意外结果

帕维尔奇克

首先,请不好称呼,但是我不知道该如何用一个句子来形容……

给定一个具有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)

我正在使用的示例地图:

############
# #      # #
#   ##     #
#   #   E# #
#       ## #
#          #
# #E    E###
############

完整代码(部分代码为德语,对此表示抱歉):http : //pastebin.com/3XUBbpkK

霜降

我怀疑您的问题是常见的Python陷阱。这行:

def alle_parents(knoten, parents = []):

加载模块时创建一个空数组,而不是每次调用该函数时。将来对alle_parents()的调用将重用相同的数组(可能会增加大小),而不是新的空数组!解决此问题的一种好方法是:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

否定instanceof会产生意外结果

来自分类Dev

CSS嵌套会产生意外结果

来自分类Dev

事先连接会产生意外结果

来自分类Dev

使用 "%" 操作会产生意外结果

来自分类Dev

使用char **指针的字符串操作代码会产生意外结果

来自分类Dev

在Go并行中处理数组会产生意外结果

来自分类Dev

为什么此MEX函数会产生意外结果?

来自分类Dev

按日期对数组排序会产生意外结果

来自分类Dev

到达void函数的结尾会产生意外结果

来自分类Dev

在PostgreSQL中与NULL进行比较会产生意外结果

来自分类Dev

打印双打数组会产生意外结果

来自分类Dev

减去numpy数组会产生意外结果

来自分类Dev

为什么在Excel中查找会产生意外结果?

来自分类Dev

Moment.js的简单功能会产生意外的(?)结果

来自分类Dev

尝试在别名中使用`pwd`会产生意外结果

来自分类Dev

写出文本框会产生意外的结果

来自分类Dev

在同一模型中注释会产生意外结果

来自分类Dev

迭代日期数组的函数会产生意外的结果

来自分类Dev

日历字段增加会产生意外结果

来自分类Dev

将NSDictionary附加到[NSDictionary]会产生意外结果

来自分类Dev

为什么“大于”数字比较会产生意外结果

来自分类Dev

replace()产生意外结果

来自分类Dev

“观看”卷曲会产生意外的输出

来自分类Dev

数组推送会产生意外的数组

来自分类Dev

preg_replace()产生意外结果

来自分类Dev

循环产生意外结果的Javascript

来自分类Dev

使用Repast Simphony产生意外结果

来自分类Dev

返回的数组产生意外结果

来自分类Dev

preg_replace()产生意外结果