0

我正在尝试建立一些关于元胞自动机的规则。在每个单元格中,我都没有一个元素(捕食者/猎物),我有很多人口。为了实现我的人口之间的移动,我可以每次都将每个单元格与其相邻的一个单元格进行比较吗?还是我必须将单元格与其所有邻居进行比较并添加一些条件。

我正在使用具有以下更新功能的摩尔社区

update[site,_,_,_,_,_,_,_,_]

我试图让他们根据他们所有的邻居移动,但这非常复杂,我想知道是否通过简化它并与所有邻居单独检查它会出错。

谢谢

4

2 回答 2

2

在我给出我最好的尝试答案之前,你必须意识到你的问题措辞很奇怪。您的元胞自动机的更新规则是您指定的,所以我不知道您是否需要执行附加条件。

我想你在问什么是选择社区的最佳方式,你可以用 Part 做到这一点:

(* We abbreviate 'nbhd' for neighborhood *)

getNbhd[A_, i_Integer?Positive, j_Integer?Positive] := 
    A[[i - 1 ;; i + 1, j - 1 ;; j + 1]];

这将选择适当的摩尔邻域,包括额外的中心单元,您可以在调用更新函数时将其过滤掉。

具体来说,要执行元胞自动机的更新步骤,必须同时更新所有单元。在现实世界中,这意味着创建一个单独的数组,并将更新后的值放在那里,然后废弃原始数组。

有关更多详细信息,请参阅我关于Cellular Automata的博客文章,其中包括在 Mathematica 中实现 Conway 的生命游戏。

于 2011-07-11T23:29:36.577 回答
2

作为一般建议,我建议不要使用 Mathematica 中的模式识别技术来指定 CA 中的规则表,它们往往很快就会失控。

用 CA 进行捕食者-猎物模拟有点棘手,因为在每一步中,(与传统 CA 不同)中心单元格的值会随着相邻单元格的值而变化!

这将导致问题,因为当将转换函数应用于邻居单元时,它将再次为自己计算一个新值,但它还需要“记住”之前在它是邻居时对其所做的更改。

在使用 CA 的流体动力学模拟中,他们遇到了这样的问题,他们使用了一个不同的邻域,称为 Margolus 邻域。在 Margolus 邻域中,CA 格被分成不同的块,更新规则应用于每个块。在下一步中,块边界被改变并且转换规则被应用到新的边界上,因此信息传输发生在块边界之间。

于 2011-07-13T00:29:40.510 回答