先建立一个300*300的矩阵,模拟森林的各种状态,其中矩阵的每个元素有3个状态,分别是0、1、2,其中0代表此处没有树木生长,1代表此处的树木正在燃烧,2代表此处有树木。 这个模型的规则是, A、如果矩阵中的一个树木上下左右有燃烧的树木,那么它会被点燃,也就是说如果一个元素的状态为 2,它的“上下左右”相邻的元素中有值为1的话,那么这个元素在下一次的循环中会变成1,; B、如果一个树木正处于燃烧中,那么它会熄灭,也就是说如果一个元素的值为1,那么它在下一次循环中会变成0; C、在没有树的土地上有几率长成树木,也就是说如果一个元素为0,那么它在下一次循环之中有一定的几率变成2; D、树木有几率被点燃,也就是说如果一个元素值为2,那么它在下一次循环之中有几率会变成1。 其中程序编写的思路是,先创建一个300X300的状态矩阵,然后再每次循环的时候将上述的模型的4条规则加入其中,针对规则A,找出矩阵中每个元素的上下左右的元素,这样会构成4个矩阵,然后利用判别表达式求出4个逻辑矩阵,将4个逻辑矩阵相加,然后利用相加得到的值是否大于1来判断此元素是否在下次循环中是否被置为1;针对规则B,在每次状态矩阵取值的过程之时,总是会将矩阵中的每个元素全部置为0,然后对每个元素进行相应的赋值,如果矩阵中的某元素在这轮循环赋值结束之时为0,那么它处于无树木的状态;针对规则C,利用matlab内置的随机函数产生一个概率矩阵,如果矩阵中的元素小于树木生长的概率,那么生成的逻辑矩阵中对应的元素置1;针对规则D,同规则C,利用内置的随机函数及布尔表达式生成一个概率矩阵。 其代码如下:
%0为空位
%1为燃烧的树
%2为正常的树
n = 300; %构造森林大小
Plight = 5e-6; %被雷击中的概率
Pgrowth = 1e-2;%生长的概率
UL = [n,1:n-1]; %上左邻居
DR = [2:n,1];%下右邻居
veg=zeros(n,n);%森林
imh = image(cat(3,veg,veg,veg));
% veg = empty=0 burning=1 green=2
for i=1:3000 %循环
%观察每一个空位其上下左右邻居正在燃烧的树的个数(sum为300*300矩阵,每一个值对应森林的每一个空位)
sum = (veg(UL,:)==1) + ...
(veg(:,UL)==1) + (veg(:,DR)==1) + ...
(veg(DR,:)==1);
%veg(UL,:)==1这是每个点的上邻居
% (veg(:,UL)==1)这是每个点的左邻居
% (veg(:,DR)==1)这是每个点的 右邻居
% (veg(DR,:)==1)这是每个点的下邻居
%现存的树=树-被烧毁的树+新生的树
veg = 2*(veg==2) - ...
( (veg==2) & (sum>0 | (rand(n,n)<Plight)) ) + ...
2*((veg==0) & rand(n,n)<Pgrowth) ;
set(imh, 'cdata', cat(3,(veg==1),(veg==2),zeros(n)))%画图
drawnow
i
end
运行效果如下图,其中黑色的点的值为0,代表此处没有树木,红色的点的值为1,代表此处的树木正在燃烧,绿色的点对应的值为2,代表此处有树木
代码参考地址https://blog.csdn.net/qq_43434831/article/details/100146269
|