【发布时间】:2020-01-26 14:16:04
【问题描述】:
我想在 Julia 中实现一个元胞自动机 (CA)。尺寸应该被包裹,这意味着:最左边的单元格的左边是最右边的单元格等等。
一个关键问题是:如何让一个细胞的邻居计算它在下一代的状态?由于应该包装尺寸并且 Julia 不允许负索引(如在 Python 中),我有这个想法:
考虑一维CA,一代是一维数组:
0 0 1 0 0
如果我们创建一个二维数组,其中第一行右移,第三行左移,如下所示:
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
现在,第一列包含第一个单元的状态及其邻居等。
我认为这可以很容易地推广到二维和更多维度。
第一个问题:您认为这是个好主意,还是走错了路?
编辑:第一个问题的答案是否定的,第二个问题和代码示例被丢弃。
第二个问题:如果方法基本没问题,请看下图:
编辑:其他方法,这里是一维 CA 的精简版本,使用 mod1() 来获取邻域指数,正如 Bogumił Kamiński 建议的那样。
对于任何单元格: - 所有索引的数组 - 所有邻域状态的 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
下一步应该是把它扩展到二维,现在就试试……
【问题讨论】:
标签: arrays julia cellular-automata