我希望在Julia中实现元胞自动机(CA)。维度应该被包裹,这意味着:最左边的单元格的左邻居是最右边的单元格,依此类推。
一个关键问题是:如何获取一个单元格的邻居,以计算下一代的状态?由于维度应该被包裹,而Julia不允许负指数(如Python中),我有了这个想法:
考虑一个1D CA,一个世代是一个一维数组:
现在,第一列包含了第一个细胞及其邻居的状态等。
我认为这可以很容易地推广到两个或更多维度。 第一个问题: 你觉得这是一个好主意,还是错误的方向?
编辑:第一个问题的答案是否定的,第二个问题和代码示例都被舍弃了。 第二个问题:如果这个方法基本上是可行的,请看以下草图:
编辑:另一种方法是使用mod1()获取邻域索引的削减版本的1D CA。对于任何一个细胞: - A数组包含所有索引 - B数组包含所有邻居状态 - C状态转换为一个整数 - D查找下一个状态
下一步应该是将其扩展到二维,现在将尝试...
一个关键问题是:如何获取一个单元格的邻居,以计算下一代的状态?由于维度应该被包裹,而Julia不允许负指数(如Python中),我有了这个想法:
考虑一个1D CA,一个世代是一个一维数组:
0 0 1 0 0
如果我们创建一个二维数组,其中第一行向右移位,第三行向左移位,像这样:0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
现在,第一列包含了第一个细胞及其邻居的状态等。
我认为这可以很容易地推广到两个或更多维度。 第一个问题: 你觉得这是一个好主意,还是错误的方向?
编辑:第一个问题的答案是否定的,第二个问题和代码示例都被舍弃了。 第二个问题:如果这个方法基本上是可行的,请看以下草图:
编辑:另一种方法是使用mod1()获取邻域索引的削减版本的1D CA。对于任何一个细胞: - A数组包含所有索引 - B数组包含所有邻居状态 - C状态转换为一个整数 - D查找下一个状态
function digits2int(digits, base=10)
int = 0
for digit in digits
int = int * base + digit
end
return int
end
gen = [0,0,0,0,0,1,0,0,0,0,0]
rule = [0,1,1,1,1,0,0,0]
function nextgen(gen, rule)
values = [mod1.(x .+ [-1,0,1], size(gen)) for x in 1:length(gen)] # A
values = [gen[value] for value in values] # B
values = [digits2int(value, 2) for value in values] # C
values = [rule[value+1] for value in values] # D
return values
end
for _ in 1:100
global gen
println(gen)
gen = nextgen(gen, rule)
end
下一步应该是将其扩展到二维,现在将尝试...