【元胞自動(dòng)機(jī)】基于元胞自動(dòng)機(jī)3D森林火災(zāi)模型matlab源碼
?一、簡介
元胞自動(dòng)機(jī)(CA)是一種用來仿真局部規(guī)則和局部聯(lián)系的方法。典型的元胞自動(dòng)機(jī)是定義在網(wǎng)格上的,每一個(gè)點(diǎn)上的網(wǎng)格代表一個(gè)元胞與一種有限的狀態(tài)。變化規(guī)則適用于每一個(gè)元胞并且同時(shí)進(jìn)行。典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
1 對元胞自動(dòng)機(jī)的初步認(rèn)識
元胞自動(dòng)機(jī)(CA)是一種用來仿真局部規(guī)則和局部聯(lián)系的方法。典型的元
胞自動(dòng)機(jī)是定義在網(wǎng)格上的,每一個(gè)點(diǎn)上的網(wǎng)格代表一個(gè)元胞與一種有限的狀
態(tài)。變化規(guī)則適用于每一個(gè)元胞并且同時(shí)進(jìn)行。
2 元胞的變化規(guī)則&元胞狀態(tài)
典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
3 元胞自動(dòng)機(jī)的應(yīng)用
元胞自動(dòng)機(jī)已被應(yīng)用于物理模擬,生物模擬等領(lǐng)域。
4 元胞自動(dòng)機(jī)的matlab編程
結(jié)合以上,我們可以理解元胞自動(dòng)機(jī)仿真需要理解三點(diǎn)。一是元胞,在matlab中可以理解為矩陣中的一點(diǎn)或多點(diǎn)組成的方形塊,一般我們用矩陣中的一點(diǎn)代表一個(gè)元胞。二是變化規(guī)則,元胞的變化規(guī)則決定元胞下一刻的狀態(tài)。三是元胞的狀態(tài),元胞的狀態(tài)是自定義的,通常是對立的狀態(tài),比如生物的存活狀態(tài)或死亡狀態(tài),紅燈或綠燈,該點(diǎn)有障礙物或者沒有障礙物等等。
二、源代碼
clear all;
n=300;
H=cell2mat(struct2cell(load('Z-HIGH.mat'))); %讀取數(shù)據(jù)
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);%二維到三維的變化中會(huì)形成矩陣列顛倒
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('橫坐標(biāo)');
ylabel('縱坐標(biāo)');
zlabel('海拔');
% figure(2)
% contour(X,Y,Z,10)%畫10條等高線
% plot()
drawnow
title(i)
end
end
% end
xlabel('經(jīng)度');
ylabel('緯度');
zlabel('海拔');
figure(2)
surf(X,Y,T);%概率分布圖
xlabel('經(jīng)度');
ylabel('緯度');
title('蔓延率');
shading interp;
figure(3)
三、運(yùn)行結(jié)果




