元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。
元胞自动机的构建没有固定的数学公式,构成方式繁杂,变种很多,行为复杂。故其分类难度也较大,自元胞自动机产生以来,对于元胞自动机分类的研究就是元胞自动机的一个重要的研究课题和核心理论,在基于不同的出发点,元胞自动机可有多种分类,其中,最具影响力的当属S. Wolfram在80年代初做的基于动力学行为的元胞自动机分类,而基于维数的元胞自动机分类也是最简单和最常用的划分。除此之外,在1990年,Howard A.Gutowitz提出了基于元胞自动机行为的马尔科夫概率量测的层次化、参量化的分类体系(Gutowitz,H. A.,1990)。下面就上述的前两种分类作进一步的介绍。同时就几种特殊类型的元胞自动机进行介绍和探讨S. Wolfrarm在详细分析研究了一维元胞自动机的演化行为,并在大量的计算机实验的基础上,将所有元胞自动机的动力学行为归纳为四大类(Wolfram. S.,1986):
图片来源于连大数学建模
%%奇偶规则游戏
clear;clc;
n = 200;%指定边界长度
Se = zeros(n);
z = zeros(n);
Se(n/2-2:n/2+2,n/2-2:n/2+2)=1; %初始化中间的点
Ch = imagesc(Se);
axis square;
Sd = zeros(n+2); %边界
while(true) %死循环
Sd(2:n+1,2:n+1) = Se;
sumValue = Sd(1:n,2:n+1)+Sd(3:n+2,2:n+1)+Sd(2:n+1,1:n)+Sd(2:n+1,3:n+2);
Se = mod(sumValue,2);
set(Ch,'cdata',Se);
pause(0.03)
end
运行效果:
clear;clc;
%%生命游戏
n = 200;
p = 0.4;
z = zeros(n);
Se = rand(n)<p;
Sd = zeros(n+2);
Ph = imagesc(Se);
while(true)
Sd(2:n+1,2:n+1)=Se;
sumValue = Sd(1:n,1:n)+Sd(1:n,2:n+1)+Sd(1:n,3:n+2)+Sd(2:n+1,1:n)+Sd(2:n+1,3:n+2)+Sd(3:n+2,1:n)+Sd(3:n+2,2:n+1)+Sd(3:n+2,3:n+2);
for i=1:n
for j=1:n
if(sumValue(i,j)==3||(sumValue(i,j)==2&&Se(i,j)==1))
Se(i,j) = 1;
else
Se(i,j) = 0;
end
end
end
set(Ph,'cdata',Se);
pause(0.05);
end
运行效果:
clear;clc;
%火灾
n = 300; % 定义表示森林的矩阵大小
k = 30000; % 迭代次数
Pground = 0.8; % 从着火变成空地的概率
Plight = 5e-6; Pgrowth = 1e-3; % 定义闪电和生长的概率
P2=0.7; %旁边有火,树着火的概率
UL = [n,1:n-1]; DR = [2:n,1]; % 定义上左,下右邻居
veg=zeros(n,n)+2; % 初始化表示森林的矩阵
imh = image(cat(3,veg,veg,veg)); % 可视化表示森林的矩阵
Sd = zeros(n+2); %边界
% veg = 空地为0 着火为1 树木为2
for i=1:k
Sd(2:n+1,2:n+1) = veg;
sumValue = (Sd(1:n,2:n+1)==1)+(Sd(2:n+1,1:n)==1)+(Sd(2:n+1,3:n+2)==1)+(Sd(3:n+2,2:n+1)==1);
for p=1:n
for q=1:n
if(veg(p,q)==2 && ((sumValue(p,q)>0 && rand()<P2)||rand()<Plight))
%首先要是树,而且需要邻居有火,就会一定概率着火;或者被雷劈了,就会直接着火
veg(p,q)=1;
elseif(veg(p,q)==1&&rand()<Pground)
%如果是火且满足概率,则变为空地
veg(p,q) = 0;
elseif(veg(p,q)==0&&sumValue(p,q)==0&&rand()<Pgrowth)
%如果是空地,且周围没有火,那么以一定概率长成树
veg(p,q) = 2;
end
end
end
set(imh, 'cdata', cat(3,(veg==1),(veg==2),zeros(n)))
drawnow
end