实施元胞自动机? “规则110”
我想知道如何使用 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 代表原始
I was wondering how to use the Rule 110, with 55 lines and 14 cells. I have to then display that in an LED matrix display.
Anyway my question is, how can I implement such automaton ??
I dont really know where to start, can someone please shed some light on how can I approach this problem ?
Is there a specific METHOD I must follow ?
Thanks
--PROGRAM USED IS -> C
EDIT
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];
}
}
Does that make sense ?? org stands for original
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的,每个元胞自动机都是围绕“递归关系”构建的,因此时间 t 的状态取决于时间 t-1 的状态。因此,每个元胞自动机都有一个基本结构,其中有一些代表状态的数据结构,例如数组。因此,抽象地讲,您的程序将类似于
其中
rule(t)
是计算下一个状态的函数。下一步是提出一个数据结构来表示状态。这实际上很简单——基本一维元胞自动机的状态只是一个由 1 和 0 组成的向量。
所以你需要一个由 14 个小数字组成的数组。空间不会成为问题,因此使用 int:
结束条件很简单 - 您应该执行 55 行,因此您需要
注意,它为您提供第 0-54 行,即 55 行。 C 是从 0 开始,后递增,并测试小于。您用 C 编写的 10 个循环中可能有 9 个都会具有这种模式。
现在,最后的问题是如何实施您的规则。不幸的是,由于这是 C,所以你不能像我的描述那样简单地做到这一点;该规则必须更新向量。这看起来很像
现在,我不会确切地告诉您如何计算更新,因为那样您就不会获得任何乐趣。但您可能会发现关于规则 110 的维基百科文章很有趣。
当您阅读它时,请思考一下:这个简单的规则是“图灵完备的”——这意味着它能够(也许需要很多麻烦)表示任何计算。这个简单的规则本身就是理论意义上的“计算机”。
更新
好的,更多关于规则的内容。查看 Wiki 文章中的规则表。它显示的是您获取数组的三个单元格并确定三个单元格中中间一个的下一个值。
因此,在您的规则中,您需要传入的数组 t 和下一时刻的数组,将其称为 t1。
您想要遍历数组的每个单元格
并检查该单元格以及左侧和右侧的单元格
等等。您需要考虑边缘处发生的情况,即当
ix == 0
或ix == 13
时。最后,您需要另一个
for
循环将t1
复制回t
。Okay, every cellular automaton is built around a "recurrance relation", so that the state at time t depends on the state at time t-1. So every cellular automaton has a basic structure where you have some data structure, like an array, that represents the state. So, abstractly, your program will look like
where
rule(t)
is a function that computes that next state.The next step is to come up with a data structure to represent the state. That's actually easy -- the state of an elementary 1 d cellular automaton is just a vector of 1s and 0s.
So you need an array of 14 small numbers. Space is not going to be an issue, so use int:
The end condition is easy -- you're supposed to do 55 rows, so you need
Notice that gives you rows 0-54, which is 55. A good basic pattern in C is that you start at 0, post-increment, and test less-than. Probably 9 out of 10 loops you write in C will have that pattern.
Now, finally, the question is how to implement your rule. Unfortunately, since this is C, you can't do it quite as simply as in my description; the rule has to update the vector in place. That's going to look a lot like
Now, I'm not going to tell you exactly how to compute the update, because then you don't get any of the fun. But you might find the Wikipedia article on Rule 110 interesting.
When you read it, ponder this: This simple rule is "Turing complete" -- which means its capable, perhaps with lots of fussing about, of representing any computation. That simple rule, in itself, is a "computer" in the theoretical sense.
Update
Okay, a little more on the rules. Have a look at the rule table in the Wiki article. What it shows is that you take three cells of your array and determine the next value for the middle one of the three.
So in your rule, you need the array you pass in, t, and an array for the next instant, call it t1.
You want to go through each cell of the array
and check the cell, along with the cells to left and right
and so on. You'll need to think about what happens at the edges, ie, when
ix == 0
orix == 13
.Fincally, you'll need another
for
loop to copyt1
back intot
.