NLe*_*Led 2 c arrays cellular-automata automaton
我想知道如何使用规则110,55行和14个单元格.然后我必须在LED矩阵显示器中显示它.
无论如何我的问题是,我怎样才能实现这样的自动机?
我真的不知道从哪里开始,有人可以说明如何处理这个问题?
我必须遵循一个具体的方法吗?
谢谢
--PROGRAM使用IS - > 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];
}
}
Run Code Online (Sandbox Code Playgroud)
那有意义吗 ??org代表原创
好的,每个元胞自动机都是围绕"重复关系"构建的,因此时间t的状态取决于时间t-1的状态.因此,每个元胞自动机都有一个基本结构,你有一些数据结构,如数组,代表状态.所以,抽象地说,你的程序看起来像
State t
/* initialize t */
while(/* end condition isn't satisfied */){
t = rule(t);
/* display state somehow */
}
Run Code Online (Sandbox Code Playgroud)
where rule(t)是一个计算下一个状态的函数.
下一步是提出一个表示状态的数据结构.这实际上很简单 - 基本1 d元胞自动机的状态只是1和0的向量.
所以你需要一个由14个小数组组成的数组.空间不会成为问题,所以使用int:
int t[14] ; /* state vector*/
Run Code Online (Sandbox Code Playgroud)
结束条件很简单 - 你应该做55行,所以你需要
int count = 0;
while(count++ < 55)
Run Code Online (Sandbox Code Playgroud)
请注意,为行提供0-54行,即55. C中的一个好的基本模式是从0开始,后增量,并且测试少于.你在C中编写的10个循环中有9个可能会有这种模式.
现在,最后,问题是如何实施您的规则.不幸的是,由于这是C,你不能像我的描述一样简单地做到这一点; 规则必须更新矢量.这看起来很像
void rule(int t[]){
/* compute the update here */
}
Run Code Online (Sandbox Code Playgroud)
现在,我不会告诉你究竟如何计算更新,因为那样你就没有任何乐趣.但是你可能会发现关于规则110的维基百科文章很有意思.
当你阅读它时,思考一下:这个简单的规则就是"图灵完成" - 这意味着它能够代表任何计算,或许有很多烦恼.这个简单的规则本身就是理论意义上的"计算机".
更新
好的,关于规则的更多一点.查看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
Run Code Online (Sandbox Code Playgroud)
您想要遍历数组的每个单元格
for(ix=0; ix < 14; ix++){
Run Code Online (Sandbox Code Playgroud)
并检查细胞,以及左右两侧的细胞
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;
Run Code Online (Sandbox Code Playgroud)
等等.你需要考虑边缘发生的事情,即何时ix == 0或ix == 13.
Fincally,你需要另一个for循环来复制t1回来t.