%(1)树的状态有三种,空白(0),绿树(1),正在燃烧的树(2)
%(2)空白的部分以概率p生长成为绿树
%(3)绿树的部分,如果其相邻(包括对角线位置)有燃烧的树,则它以概率q变为正在燃烧的树。如果没有,则以概率f(闪电概率)变为正在燃烧的树
%(4)正在燃烧的树,下一步变为荒地(空白)。
仿真后运行图:
这个图实际效果是个动态的。
教学代码:
%(1)树的状态有三种,空白(0),绿树(1),正在燃烧的树(2)
%(2)空白的部分以概率p生长成为绿树
%(3)绿树的部分,如果其相邻(包括对角线位置)有燃烧的树,则它以概率q变为正在燃烧的树。如果没有,则以概率f(闪电概率)变为正在燃烧的树
%(4)正在燃烧的树,下一步变为荒地(空白)。
clear;clc;close all;
p=0.03;%树生长的概率
q=0.1;% 树变为燃烧状态的概率
f=6e-3;% 闪电概率
s=100;% 森林的尺寸
% 初始状态为随机状态
forest = round(rand(s)*2);
while 1
temp = forest;
% 燃烧的树在下一步变为空白
forest(temp==2) = 0;
% 空白格的部分以概率p生成新的树
grow_seed = rand(s); % 成长的种子
forest(temp==0 & grow_seed<p) = 1;
% 找到哪些是树
[row,col] = find(temp==1);
for i = 1:length(row)
x = row(i);
y = col(i);
neighbor = temp(max(x-1,1):min(x+1,s),max(y-1,1):min(y+1,s)); % 找到该树的邻居
if any(neighbor(:)==2)
% 如果有正在燃烧的树
if rand()<q
forest(x,y) = 2;
end
else
% 如果没有燃烧的树,但是被闪电击中,也会变成燃烧的树
if rand()<f
forest(x,y) = 2;
end
end
end
imagesc(forest);
drawnow;
end