实现Cellular Automaton? “规则110”

时间:2011-03-04 02:18:40

标签: c arrays cellular-automata automaton

我想知道如何使用规则110,包含55行和14个单元格。然后我必须在LED矩阵显示器中显示它。

无论如何我的问题是,我该如何实现这样的自动机?

我真的不知道从哪里开始,有人可以说明如何解决这个问题?

我必须遵循一个具体的方法吗?

由于

- 使用的程序是 - > ç

修改

char array[54][14];
for(v=0;v<55;v++){ 
  for(b=0;b<15;b++){ 
    if(org[v][b-1]==0 && org[v][b]==0 && org[v][b+1] == 0)                                                         
      {
        array[v][b]=0;
      }
      array[v][b]=org[v][b];
 }

}

这有意义吗? org代表原始

1 个答案:

答案 0 :(得分:5)

好的,每个元胞自动机都围绕“重复关系”构建,因此 t 时的状态取决于 t-1 时的状态。因此,每个元胞自动机都有一个基本结构,你有一些数据结构,如数组,代表状态。所以,抽象地说,你的程序看起来像

State t
/* initialize t */
while(/* end condition isn't satisfied */){
    t = rule(t);
    /* display state somehow */
}

其中rule(t)是计算下一个状态的函数。

下一步是提出一个表示状态的数据结构。这实际上很简单 - 基本1 d元胞自动机的状态只是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 */
}

现在,我不打算告诉你如何计算更新,因为那样你就没有任何乐趣了。但您可能会在Rule 110 interesting上找到维基百科的文章。

当你阅读它时,思考一下:这个简单的规则是“图灵完成” - 这意味着它能够代表任何计算,并且可能有很多烦恼。这个简单的规则本身就是理论意义上的“计算机”。

<强>更新

好的,关于规则的更多内容。查看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 == 0ix == 13时。

最后,您需要另一个for循环将t1复制回t