A 元胞自动机要点
1元胞
元胞可称为单元或基元,是元胞自动机最基本的部分
例子:
每一个小块就是一个元胞,每个元胞都有一个状态(如生或死,有或无…,不同的状态在编程中用不同的数字表示)
元胞状态变化:
变化前:只有第六个元胞有虫子 | |
变化后:只有第五个元胞有虫子 | |
元胞可以是任意形状。如:
2 元胞空间
红框内就是一个元胞空间,红框内的元胞与外界之间互不影响。
3邻居
常用两个邻居模型:
也可以自己定义:
元胞下一时刻的状态决定于本身状态和它邻居元胞的状态。
4规则
元胞自动机根据进行局部元胞间的相互作用而引起全局变化。
B 例子
1 生命游戏
(1)元胞:每个元胞有生与死两个状态
(2)元胞空间:
(3)邻居:
(4)规则:如果一个元胞周围有3个元胞为生(一个元胞周围共有8个元胞),则该元胞为生(即该元胞若原先为死,则转为生,若原先为生,则保持不变。)
如果要给元胞周围有两个元胞为生,则该元胞的生死状态不变。
在其他情况下,该元胞为死(即该元胞若原先为生,则转为死,若原先为死,则保持不变)。
代码:
%function ca
m=50;n=50;p=.7;h=100; % 定义初始变量
for x=1:m
for y=1:n
r=rand(1); % 生成一个随机数
if r>p % 判断一下
a(x,y)=1; % 要是小了就是1 就是“生”
else a(x,y)=0;
end
end
end %这个是定义初始的状态
for x=1:m
for y=1:n
if a(x,y)==1 % 这就是在全局去寻找的为1的元胞了
fx=[x-1,x-1,x,x];fy=[y-1,y,y,y-1];fill(fx,fy,'y'),hold on % 这两个在一起拼接就是一个冯罗伊曼的邻居模型了
end
end
end
for k=1:h
fx=[0,m,m,0];fy=[0,0,n,n];fill(fx,fy,'k'),hold on
for x=2:m-1
for y=2:n-1
b(x,y)=a(x-1,y-1)+a(x-1,y)+a(x-1,y+1)+a(x,y-1)+a(x,y+1)+a(x+1,y-1)+a(x+1,y)+a(x+1,y+1); % 这个是把找出了8个位置的元胞
if b(x,y)==2,c(x,y)=a(x,y); % 如果满足条件的话 就把元胞a的值赋给c 。而c同样也是
elseif b(x,y)==3,c(x,y)=1; % 如果满足条件的话 就把c的值赋值为 1
else c(x,y)=0;
end
end
end
c(1:m,1)=a(1:m,1);c(1:m,n)=a(1:m,n); %
for x=1:m
for y=1:n
if c(x,y)==1
fx=[x-1,x-1,x,x];fy=[y-1,y,y,y-1];fill(fx,fy,'y'),hold on
else
end
end
end
pause(2)
a=c; % 最后把c 的值赋给a 然后在重新回去在去循环 再次进行整体的变化,。。
end