3

我有一些我决定用 Python 做的项目。简而言之:我有清单。它们每个都有列表,有时是一个元素,有时更多。它看起来像这样:

rules=[
[[1],[2],[3,4,5],[4],[5],[7]]
[[1],[8],[3,7,8],[3],[45],[12]]
[[31],[12],[43,24,57],[47],[2],[43]]
]

关键是将 numpy 数组中的值与此规则中的值(规则表的元素)进行比较。我们将一些 [x][y] 点与第一个元素进行比较(例如,第一个元素中的 1),然后,如果为真,则将数组中的值 [x-1][j] 与列表中的第二个值,依此类推。五个第一次比较必须为真才能更改 [x][y] 点的值。我是这样写的(主要函数是 SimulateLoop,顺序切换,因为simulate2函数是在第二个函数之后编写的):

def simulate2(self, i, j, w, rule):
        data = Data(rule)
        if w.world[i][j] in data.c:
            if w.world[i-1][j] in data.n:
                if w.world[i][j+1] in data.e:
                    if w.world[i+1][j] in data.s:
                        if w.world[i][j-1] in data.w:
                            w.world[i][j] = data.cc[0]
                        else: return
                    else: return
                else: return
            else: return
        else: return




def SimulateLoop(self,w):
    for z in range(w.steps):
            for i in range(2,w.x-1):
                for j in range(2,w.y-1):
                    for rule in w.rules:
                        self.simulate2(i,j,w,rule)

数据类:

class Data:
    def __init__(self, rule):
        self.c = rule[0]
        self.n = rule[1]
        self.e = rule[2]
        self.s = rule[3]
        self.w = rule[4]
        self.cc = rule[5]

NumPy 数组是 World 类的对象。规则是如上所述的列表,由从另一个程序(GPL 许可证)获得的函数解析。

老实说,它似乎工作正常,但事实并非如此。我正在尝试其他可能性,但没有运气。它正在工作,解释器不会返回任何错误,但数组中的值会以某种方式改变错误。规则很好,因为它是由我从中获得解析器的程序提供的(GPL 许可证)。

也许它会有所帮助 - 它是 Perrier's Loop,修改过的 Langton's loop(人造生命)。

将非常感谢您的帮助!)

4

1 回答 1

0

我对 Perrier 的循环不熟悉,但如果你编写类似著名的“游戏生活”之类的代码,你会犯一个简单的错误:将下一代存储在同一个数组中,从而破坏它。

通常,您将下一代存储在临时数组中,并在扫描后进行复制/交换,就像在这个草图中一样:

def do_step_in_game_life(world):
    next_gen = zeros(world.shape)    # <<< Tmp array here
    Nx, Ny = world.shape
    for i in range(1, Nx-1):
        for j in range(1, Ny-1):
            neighbours = sum(world[i-1:i+2, j-1:j+2]) - world[i,j]
            if neighbours < 3:
                next_gen[i,j] = 0
            elif ...
    world[:,:] = next_gen[:,:]       # <<< Saving computed next generation
于 2011-08-18T02:40:15.680 回答