基于元胞自动机的森林火灾matlab模拟

先建立一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值