我一直在努力开始这项关于细胞自动机的大学任务。给定波纹管形式的数组,其前提非常简单,其中1代表黑色方块(或活细胞),0代表白色方块(或死细胞)。
world1 = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
[0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
[0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
[0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0]
[0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
[0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
[0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
在每个时间步骤(“刻度”),所有单元同时发生以下转换:
具有少于两个活邻居的任何活细胞死亡,似乎是由于人口不足造成的。
任何有两个或三个活邻居的活细胞都可以存活到下一代。
任何一个有三个以上活邻居的活细胞都会死亡,好像是人口过剩。
具有完全三个活邻居的任何死细胞都变成活细胞,好像通过繁殖。这里的邻居指的是每个元素周围的8个正方形
现在,作为一名物理专业的学生,我可以看到数学很简单,但是我真的不知道如何构造代码并如此做,以便以后可以将其转换为动画。我还可以看到边缘的元素应该有一些例外。到目前为止,贝娄是我的尝试...它可以运行,但是什么也没有返回。可以肯定的是,您可以在编程时告诉我相当新的东西!
import numpy as np
world1 = np.loadtxt('data/Pulsar.txt',dtype=np.int8) #loading data
def tick(world):
north = world[i,i-1] #defining neighboughs as se, ne , n etc ..
south = world[i,i+1]
west = world[i+1,i]
east = world[i-1,i]
se = world[i+1,i+1]
sw = world[i+1,i-1]
ne = world[i-1,i+1]
nw = world[i-1,i-1]
neibours = (north, south, west, east, se, sw, ne, nw) #list of neighbough values
np.where(world.all==0 and sum(neibours)==3, 1, world ) #replacing elements in array
np.where(world.all==1 and sum(neibours)<=2, 0, world )
np.where(world.all==1 and sum(neibours)==2 or 3, 1, world )
np.where(world.all==1 and sum(neibours)>=4, 0, world )
print(tick(world1))
[我认为主要的问题是您将tick
函数中单个单元格和整个矩阵的处理混合在一起。
[它开始似乎是处理单个单元格(我认为引用i
是'当前'单元格的索引,尽管在任何地方都没有真正定义...),但是随后您似乎正在尝试使用一些numpy将其作为矢量化操作应用于所有单元格的魔力。可能是有可能的,但是为了简单起见,我将首先更加明确。
您可能应该考虑的其他几件事:
因此,非常粗略(在伪python中:)>
for tick in range(ticks):
new_state = <matrix>
for i in range(X):
for j in range(Y):
# this is where most of your `tick` function comes in,
# adjusted to compute new state for a single given cell
new_state[i][j] = handle_tick_for_cell(i,j,matrix)
matrix = new_state
print(matrix)