gpt4 book ai didi

arrays - Julia /元胞自动机 : efficient way to get neighborhood

转载 作者:行者123 更新时间:2023-12-01 11:12:34 24 4
gpt4 key购买 nike

我想在 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

下一步应该是将其扩展到二维,现在将尝试...

最佳答案

我通常使用的方式是使用 mod1用于包装索引的函数。

在这种方法中,无论数组的维数如何a那么当你想从位置 x 移动时由 delta dxmod1(x+dx, size(a, 1))就够了如果 x是数组的第一维。

这是一个在 2D 环面上随机游走的简单示例,计算给定单元被访问的次数(这里我另外使用广播来处理一个表达式中的所有维度):

function randomwalk()
a = zeros(Int, 8, 8)
pos = (1,1)
for _ in 1:10^6
# Von Neumann neighborhood
dpos = rand(((1,0), (-1,0), (0,1), (0,-1)))
pos = mod1.(pos .+ dpos, size(a))
a[pos...] += 1
end
a
end

关于arrays - Julia /元胞自动机 : efficient way to get neighborhood,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58114462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com