二维元胞自动机
邻域
两种类型邻域左边:冯诺依曼型 4个邻居;
右边:摩尔类型 8个邻居
森林火灾模型
1.描述状态·
红色:着火 绿色:树 黑色:空地
2.制定规则
某格点的状态只由它的邻居决定
-
当前是绿色,若周围有红色则变成红色
规则2 -
当前是红色,无论邻居什么颜色,下一时刻依旧是红色
规则3 - 当前是黑色,无论邻居什么颜色,下一时刻依旧是红色
注:当前的格点是指中心格点,我们在编程中只考虑中心格点,就能遍历所有
代码
main.m
注:此代码规则与上述有所差异
%% 森林火灾
% (1)正在燃烧的树变成空格位;
% (2)如果绿树格位的最近邻居中有一个树在燃烧,
% 则它变成正在燃烧的树;
% (3)在空格位,树以概率p生长;
% (4)在最近的邻居中没有正在燃烧的树的情况下树
% 在每一时步以概率f(闪电)变为正在燃烧的树。
clear
clc
clear all
%地图大小
n=100;
%被闪电击中的概率
Plightning =0.000005;
%空地生长出树的概率
Pgrowth = 0.01;
z=zeros(n,n);
o=ones(n,n);
veg=z;%初始化森林矩阵
sum=z;
imh = image(cat(3,z,veg*0.02,z));
set(imh, 'erasemode', 'none')
axis equal
axis tight
%状态变换规则
% burning -> empty
% green -> burning if one neigbor burning or with prob=f (lightning)
% empty -> green with prob=p (growth)
% veg = {empty=0 burning=1 green=2}
UL=[n 1:n-1];DR=[2:n,1]%定义上左,下右邻居
for i=1:3000
%nearby fires?
sum=(veg(UL,:)==1)+...(veg(:,UL)==1)+(veg(:,DR)==1)+...
(veg(DR,:)==1);%对上下左右四个邻居求和
%...表示另起一行
%==1 表示返回索引为1的下标
veg = ...
2*(veg==2) - ((veg==2) & (sum>0 | (rand(n,n)<Plightning))) + ...
2*((veg==0) & rand(n,n)<Pgrowth) ;
%更新规则:树=树-着火的树+新生的树
set(imh, 'cdata', cat(3,(veg==1),(veg==2),z) )
drawnow %刷新
end
网友评论