一、简介
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
1 对元胞自动机的初步认识
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元
胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状
态。变化规则适用于每一个元胞并且同时进行。
2 元胞的变化规则&元胞状态
典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
3 元胞自动机的应用
元胞自动机已被应用于物理模拟,生物模拟等领域。
4 元胞自动机的matlab编程
结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。
二、源代码
clear all;
n=300;
H=cell2mat(struct2cell(load('Z-HIGH.mat'))); %读取数据
S=cell2mat(struct2cell(load('Z-SHI.mat')));
T=cell2mat(struct2cell(load('Z-TEM.mat')));
W=cell2mat(struct2cell(load('Z-WIN.mat')));
h=0.08441;
s=-0.07848;
t=0.08785;
w=0.08332;
load lll.dat
x=lll(:,1);y=lll(:,2);z=lll(:,3);
[X, Y, Z1]=griddata(x,y,z,linspace(min(x),max(x),n)',linspace(min(y),max(y)',n),'cubic');
A=max(max(Z1));B=min(min(Z1));%A=A(1,1);B=B(1,1);
Z=(Z1-B)./(A-B);
Z=Z.*1000;
figure(1)
cdata=cat(3,zeros(size(X)),ones(size(X)),zeros(size(X)));%绿色
surf(X,Y,Z,cdata);
T1=h.*H+s.*S+t.*T+w.*W;
T1=flipdim(T1,1);%二维到三维的变化中会形成矩阵列颠倒
T2=ones(n);%隔离带
R=0.85;
for j=1:5
T2(50*j,:)=R;
T2(50*j+1,:)=R;
T2(50*j-1,:)=R;
end
for j=1:5
T2(:,50*j)=R;
T2(:,50*j+1)=R;
T2(:,50*j-1)=R;
end
[XX,YY]=find(T2==0.85)
XX=X(1,XX);
YY=Y(YY,1);
T=mapminmax(T1,0.6,1).*T2;%影响因素归一化
pspread=0.63;
pgrowth=0;
ul=[n,1:n-1];
dr=[2:n,1];
hang=175;
lie=175;
veg=2*ones(n);
veg(hang,lie)=1
for i=1:300
e(i,1)=length(find(veg==0));
if(e(i,1)>81000)
break
else
h1=veg;
h2=h1;
h3=h2;
h4=h3;
h1(n,1:n)=0;
h2(1:n,n)=0;
h3(1:n,1)=0;
h4(1,1:n)=0;
sum=(h1(ul,:)==1)+(h2(:,ul)==1)+(h3(:,dr)==1)+(h4(dr,:)==1);
sum1=((sum==1).*(1-(1-pspread)));
sum2=((sum==2).*(1-(1-pspread)^2));
sum3=((sum==3).*(1-(1-pspread)^3));
sum4=((sum==4).*(1-(1-pspread)^4));
s=sum1+sum2+sum3+sum4;
veg=2*(veg==2)-((veg==2)&((sum>0)&(rand(n,n)<s.*T)))+2*((veg==0)&rand(n,n)<pgrowth);
[xx,yy]=find(veg==1);
zz=diag(Z(xx(:,1),yy(:,1)));
xx=X(1,xx);
yy=Y(yy,1);
% if((i>100)&(length(zz)<10))
% break;
% else
hold on;
plot3(yy,xx,zz,'r.');
% [xx,yy]=find(veg==1);
% [xx1,yy1]=find(veg==0);
% zz=Z(xx,yy);
% % zz1=Z(xx1,yy1);
% hold on;
% plot3(xx,yy,zz,'r.');
% % hold on;
% % plot3(xx1,yy1,zz1,'r.');
xlabel('横坐标');
ylabel('纵坐标');
zlabel('海拔');
% figure(2)
% contour(X,Y,Z,10)%画10条等高线
% plot()
drawnow
title(i)
end
end
% end
xlabel('经度');
ylabel('纬度');
zlabel('海拔');
figure(2)
surf(X,Y,T);%概率分布图
xlabel('经度');
ylabel('纬度');
title('蔓延率');
shading interp;
figure(3)