以下解释来自 百度百科:
细胞自动机模型的基本思想是:自然界里许多复杂结构和过程,归根到底只是由大量基本组成单元的简单相互作用所引起。因此,利用各种细胞自动机有可能模拟任何复杂事物的演化过程。
分类:
1)最简一维细胞自动机: 黑色为1,白色为0. 那么任意一个方格和周围两个方格就有 111,110,101,100,011,010,001,000 8种状态。
2)编码规则: 当前细胞ci,在t时刻状态为 Si,t , 两个邻居状态为Si-1,t Si+1,t 则下一时刻状态 Si,t+1 = F(si-1,t Si,t Si+1,t)
假设有如下规则:输入的三个方格中有奇数个黑色,则下一个为黑色,表示为
si,t+1=1 ,如果si-1,t+si,t+si+1,t=1
si,t+1=0 ,如果si-1,t+si,t+si+1,t=2
si,t+1=1 ,如果si-1,t+si,t+si+1,t=3
si,t+1=0 ,如果si-1,t+si,t+si+1,t=0
其中,si,t∈{0,1},对于任意的i和t 。 则编码为0101.
3) 最简一维细胞自动机的动态行为:
I、 固定值型:细胞自动机经过若干步运算便停留在一个固定的状态;
II、 周期型:细胞自动机在几种状态之间周期循环;
III、 混沌型:细胞自动机处于一种完全无序随机的状态,几乎找不到任何规律;
IV、 复杂型:细胞自动机在运行的过程中可能产生复杂的结构,这种结构既不是完全的随机混乱,又没有固定的周期和状态。
产生黑白的格子
void RandomFillMap() {
if (useRandomSeed) {
seed = Time.time.ToString();
}
System.Random pseudoRandom = new System.Random(seed.GetHashCode());
for (int x = 0; x < width; x ++) {
for (int y = 0; y < height; y ++) {
if (x == 0 || x == width-1 || y == 0 || y == height -1) {
map[x,y] = 1;
}
else {
map[x,y] = (pseudoRandom.Next(0,100) < randomFillPercent)? 1: 0;
}
}
}
}
编写规则
int GetSurroundingWallCount(int gridX, int gridY) {
int wallCount = 0;
for (int neighbourX = gridX - 1; neighbourX <= gridX + 1; neighbourX ++) {
for (int neighbourY = gridY - 1; neighbourY <= gridY + 1; neighbourY ++) {
if (neighbourX >= 0 && neighbourX < width && neighbourY >= 0 && neighbourY < height) {
if (neighbourX != gridX || neighbourY != gridY) {
wallCount += map[neighbourX,neighbourY];
}
}
else {
wallCount ++;
}
}
}
根据规则重新写格子
void SmoothMap() {
for (int x = 0; x < width; x ++) {
for (int y = 0; y < height; y ++) {
int neighbourWallTiles = GetSurroundingWallCount(x,y);
if (neighbourWallTiles > 4)
map[x,y] = 1;
else if (neighbourWallTiles < 4)
map[x,y] = 0;
}
}
}
return wallCount;
}
参考: