好的,每个元胞自动机都是围绕“递归关系”构建的,因此时间t的状态取决于时间t-1的状态。所以每个元胞自动机都有一个基本结构,其中有一些数据结构,比如一个数组,代表状态。所以,抽象地说,你的程序看起来像
State t
/* initialize t */
while(/* end condition isn't satisfied */){
t = rule(t);
/* display state somehow */
}
whererule(t)
是计算下一个状态的函数。
下一步是提出一个数据结构来表示状态。这实际上很简单——一个基本的一维元胞自动机的状态只是一个 1 和 0 的向量。
所以你需要一个由 14 个小数字组成的数组。空间不会成为问题,所以使用 int:
int t[14] ; /* state vector*/
结束条件很简单——你应该做 55 行,所以你需要
int count = 0;
while(count++ < 55)
请注意,它为您提供了 0-54 行,即 55 行。C 中一个好的基本模式是您从 0 开始,后递增,并测试小于。您用 C 编写的 10 个循环中可能有 9 个具有这种模式。
现在,最后,问题是如何实施您的规则。不幸的是,因为这是 C,所以你不能像我描述的那样简单;该规则必须更新适当的向量。这看起来很像
void rule(int t[]){
/* compute the update here */
}
现在,我不会确切地告诉你如何计算更新,因为那样你就不会得到任何乐趣。但是您可能会发现关于规则 110的 Wikipedia 文章很有趣。
当你阅读它时,思考一下:这个简单的规则是“图灵完备的”——这意味着它能够代表任何计算,也许有很多大惊小怪。这条简单的规则本身就是理论上的“计算机”。
更新
好的,关于规则的更多信息。查看 Wiki 文章中的规则表。它显示的是您获取数组的三个单元格并确定三个单元格中中间一个的下一个值。
因此,在您的规则中,您需要传入的数组t和下一个瞬间的数组,称为t1。
void rule(int t[]){ // there's the original
int t1[14]; // there's the new array
int ix ; // an index for the loop that's coming up
您想遍历数组的每个单元格
for(ix=0; ix < 14; ix++){
并检查单元格,以及左右两侧的单元格
if(t[ix-1] == 0 && t[ix] == 0 && t[ix+1] == 0)
t1[ix] = 0;
else if(t[ix-1] == 0 && t[ix] == 0 && t[ix+1] == 1)
t1[ix] = 1;
等等。您需要考虑边缘会发生什么,即何时ix == 0
或ix == 13
。
最后,您需要另一个for
循环来复制t1
回t
.