
元胞自动机
|
79
5.12 CA 表
到目前为止,如果 CA 是“ totalitic”,那么我们的函数是有效的,这意味着
规则只依赖于邻居的和。但是大多数规则也取决于哪个邻居是开着的,哪个
邻居是关着的。例如,100 和 001 有相同的和,但是对于许多 CA 来说,它们
会产生不同的结果。
我们可以使用带有元素 [4,2,1] 的窗口,step2 通用,该窗口将邻域视为二进
制数。例如,邻域 100 产生 4,010 产生 2,001 产生 1。然后我们可以获取
这些结果并在规则表中查找它们。
下面是 step2 的更一般步骤:
def step3(array, i, window=[4,2,1]):
row = array[i-1]
c = np.correlate(row, window, mode='same')
array[i] = table[c]
前两行是相同的。最后一行从表中的 c 中查找每个元素,并将结果赋给
array [i]。
这是计算表的函数:
def make_table(rule):
rule = np.array([rule], dtype=np.uint8)
table = np.unpackbits(rule)[::-1]
return table
参数 rule 是 0 到 255 之间的整数。第一行将 rule 放入一个包含单个元素
的数组中,因此我们可以使用 unpackbits,它将规则编号转换为二进制表
示。例如,这是规则 150 的表:
>>> table = ...