【问题标题】:Implement a Cellular Automaton ? "Rule 110"实现元胞自动机? “规则 110”
【发布时间】:2011-07-08 12:28:29
【问题描述】:

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

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

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

是否有我必须遵循的特定方法?

谢谢

--使用的程序是 -> C

编辑

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 代表原创

【问题讨论】:

  • 我添加了“hpomewrk”标签;如果我错了,请告诉我们。
  • 好的,我删除了我的其他主题:)
  • 现在您进入了正确的社区。两件事:(1)你有一个规则步骤,所有三个单元格都是 0 - 但是还有七个规则,从 001 到 111。所以你总共需要八个 if。 (2) 想想最后一个赋值的效果,array[v][b]=org[v][b]; -- 它没有做你认为它做的事情。

标签: c arrays cellular-automata automaton


【解决方案1】:

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

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

其中rule(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 */
}

现在,我不会确切地告诉你如何计算更新,因为那样你就没有任何乐趣。但您可能会在 Rule 110 interesting 上找到 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 == 0ix == 13

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

【讨论】:

  • 嗯,我可以用 if 语句替换这些条件吗?例如,如果我输入: If array [0][0]=1, [0][1]=1, [0][2]=1, then [1][1]=0 ... or does这没有意义吗?
  • 你在正确的轨道上,但这是一个一维数组,所以左边总是 t[something] = something ;
  • 谢谢您,非常有用!如果我稍后在这里发帖时遇到问题:)
  • 感谢您的更新,既然我也有列,我必须添加另一个值,例如:t1[14][col] ...对吗?
  • 是的。如果您要一次显示它们,则需要第二个维度,正如您所展示的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多