我正在尝试建立一些关于细胞自动机的规则。在每个细胞中我没有一个元素(捕食者/猎物)我有许多人口。为了实现我的人口之间的移动,我每次都可以将每个细胞与其中一个邻居进行比较吗?或者我必须将细胞与其所有邻居进行比较并添加一些条件。
我正在使用具有以下更新功能的Moore社区
update[site,_,_,_,_,_,_,_,_]
我试图让他们根据他们所有的邻居移动,但它非常复杂,我想知道如果通过简化并单独检查所有邻居它将是错误的。
由于
答案 0 :(得分:2)
在我尽力回答之前,你必须意识到你的问题是奇怪的。您的元胞自动机的更新规则由您指定,因此我不知道您是否还需要实施其他条件。
我认为你问的是选择社区的最佳方式是什么,你可以用Part来做到这一点:
(* We abbreviate 'nbhd' for neighborhood *)
getNbhd[A_, i_Integer?Positive, j_Integer?Positive] :=
A[[i - 1 ;; i + 1, j - 1 ;; j + 1]];
这将选择适当的Moore社区,包括额外的中央单元格,您可以在调用更新功能时将其过滤掉。
具体地,为了执行元胞自动机的更新步骤,必须同时更新所有单元。在现实世界中,这意味着创建一个单独的数组,并将更新的值放在那里,然后废弃原始数组。
有关详细信息,请参阅Cellular Automata上的博文,其中包括Conway在Mathematica中的生命游戏的实现。
答案 1 :(得分:2)
作为一般性建议,我建议不要在Mathematica中使用模式识别技术来指定CA中的规则表,它们往往会很快失控。
使用CA进行捕食者 - 猎物类型的模拟有点棘手,因为在每个步骤中(与传统CA不同),中心单元格的值会随着邻近区域的值而变化!
这将导致问题,因为当转移函数应用于相邻单元时,它将再次为其自身计算新值,但它还需要“记住”先前在它作为邻居时对其所做的更改。
在使用CA的流体动力学模拟中,他们遇到这样的问题,他们使用了一个名为Margolus邻域的不同邻域。在Margolus邻域中,CA晶格被分解为不同的块,并且更新规则应用于每个块。在下一步中,块边界被更改,转换规则应用于新边界,因此信息传输跨块边界发生。