前言
本文篇幅较长,希望各位小伙伴能够耐心看完。
元胞自动机模型可以用来模拟交通流、火灾蔓延情况、高速收费站交通情况,有利于我们更好地改善交通状况,更好地控制火灾蔓延,合理地设置收费站的数量等。
在文章初始,先喂自己袋盐。
以下是博主精心整理的两个matlab专栏,包含入门到精通及实战内容,需要的小伙伴可根据自己需求自行订阅。
MATLAB-30天带你从入门到精通
https://blog.csdn.net/wenyusuran/category_10614422.html
MATLAB深入理解高级教程(附源码)
https://blog.csdn.net/wenyusuran/category_2239265.html
在博主的资源中也有各种算法的应用实例源代码,需要的小伙伴自取哟。
文中涉及到的代码地址如下:
MATLAB工具箱大全-元胞自动机
https://download.csdn.net/download/wenyusuran/15171946
在我们为每个元胞的时间进化制定规则之前,我们最好先确定每个元胞的相邻元胞结构是什么,这里我们采用Von.Neumann模型。在二维元胞自动机模型中,元胞与其相邻元胞之间的直线距离通常是元胞长度的一个单位,但有时这个距离等于两个单位。在我们的模拟中,我们选择一个单元的长度作为相邻元胞的联系,如图1所示。
图1 Von.Neumann邻近模型
如图2所示,有三种不同颜色的网格。黑色网格表示裸露荒地元胞,红色网格表示燃烧元胞,绿色网格表示有植被的元胞。
图2 三种不同颜色的网格
燃烧元胞总是出现在边界处,这与实际情况中火在边界上是一致的。此外,我们还观察到,火灾的起源发生在角落,并最终汇聚在一个地方。我们认为随机性是导致火灾几种不同起源的原因。当样本量中等时,元胞的燃烧概率可能导致一个以上的野火起源。
数学模型
基础模型
在森林火灾蔓延的研究中,最常用的模型之一就是元胞自动机。元胞自动机是复杂系统研究的一个典型方法,特别适合于空间复杂系统的时空动态模拟研究。在元胞自动机模型中,空间被离散成网格,每一个网格被称为元胞。元胞具有有限的离散状态,遵循同样的作用规则, 依据确定的局部规则作同步更新。大量元胞通过简单的相互作用而构成动态系统的演化。
经典的森林火灾元胞自动机模型是由 Drossel 和 Schwabl 在1992年给提的。森林火灾元胞自动机模型定义在正方形网格上,元胞有三种状态:树(未燃烧的树),火(正在燃烧的树)和空(空地)状态。元胞下一时刻状态的更新规则如下:
以上三条规则中,着火规则中的闪电以及新生规则都涉及概率,体现了该模型在演化过程中 出现的随机性和不确定性。
改进模型
基础模型中给出的经典森林火灾元胞自动机有一些缺陷,例如大火向外漫延时并不是各向同性的,此外也无法考虑风的影响。这里我们引入邻居元胞着火概率,对于经典森林火灾元胞自动机,其邻居着火概率如图 4(a) 所示,即中间元胞状态为“火”,则下一时刻上、下、左、右四个邻居着火的概率均为 1。在此基础上,为了使火以各向同性的方式向外蔓延,我们将斜对角的四个元胞也作为邻居,并规定其着火概率为 ,具体如图 4(b) 所示。
在考虑风的作用时,只需要将顺风方向上的邻居着火概率适当加大,而逆风方向上的邻居着火概率适当减小,例如西风可以考虑为图 4(c) 所示的邻居着火概率。为了对比图 4 所示的三种情况,我们设置一个 的元胞空间,初始时刻所有元胞的状态全为“树”,并从最中间元胞开始点火。三种情况的模拟结果如图 5 所示。
图 5. 经典、改进和有风的三种模型测试。左 (a),右 (b),右 (c)
需要说明的是在图 5 的测试模拟中,我们删掉了闪电和生长机制。图 5(a) 表明经典森林火灾元胞自动机以矩形的方式向外蔓延,(b) 表明引入斜对角元胞着火概率能使火灾以圆的方式向外蔓延,(c) 表明通过设置特定的邻居着火概率,可以模拟有风的情况。
火灾蔓延的物种模式
情况一:无风情况下森林火灾的自然蔓延
无风情况下森林火灾的自然蔓延模拟结果如图4所示。
图3 无风情况下森林火灾的自然蔓延模拟结果
在模拟仿真过程中,我们发现了一些重要的规律。我们看到,火势在原点的基础上均匀蔓延,燃烧面积接近一个圆圈。另外,就火势距离而言,火势距离越短,植被密度越低。此外,在两股溪流的交汇处,火焰减少。实际上,其原因是汇流处植被等可燃物较少。
情况二:有风情况下森林火灾的自然蔓延
考虑风向朝右,以一个元胞为例,我们只检查它的左元胞是否在燃烧,或者它的上元胞是否在燃烧,或者它的下元胞是否在燃烧,而这两种情况中的任何一种发生,这个元胞都将在下一步时间燃烧。有风情况下森林火灾的元胞如图5所示。
图4有风情况下森林火灾的元胞
相反,如果它的右元胞正在燃烧,而它的左元胞、上元胞和下元胞都没有在燃烧,这个元胞在下一步就不会着火。这样,我们可以在模型中加入影响,得到更真实的仿真结果。
在风的作用下,火势向右延伸,燃烧的区域在穿过该区域时扇出。更重要的是,开始时,火很小,随着时间的推移,每个燃烧的元胞都会点燃附近的元胞。这是使火在很短的时间内变得猛烈的因素。正是雪崩效应,使得火势不仅沿着风向蔓延,而且还向风向两边蔓延。
图5 有风(吹向右边)情况下森林火灾的自然蔓延模拟结果
当风在右下方吹动时,结果如图6所示。
图6 有风(吹向右下方)情况下森林火灾的自然蔓延模拟结果
只有当植被密度足够高时,燃烧区域才能再次被点燃,如图7所示。下一场火灾不会对那些光秃秃的荒地造成影响。同时,火灾蔓延动态过程告诉我们,一些被烧毁的区域可以重新成为有植被的元胞,恢复的时间依赖于生长的参数。
图7 (左)燃烧区域可以被点燃 (右)被烧毁的区域内植被面积减少
图8 (左)火势绕过少数植被区的初始着火阶段 (右)火势绕过少数植被区的中间着火阶段
图9 (左)火势蔓延的一种地形图(右)火势蔓延的另一种地形图
在模拟过程中,我们观察到火灾可以绕过少数植被区。这种规律性有助于我们用低密度植被区代替高海拔地区。同样,我们可以用高密度的植被区代替低海拔地区。通过这种方法,我们可以模拟更精确的火灾行为,因为高海拔和低海拔地区交界处的斜坡(低密度植被和高密度植被区)将影响火灾的传播,因此,火势的蔓延也会相应变化的。
情况三:不同植被密度时森林火灾的自然蔓延
火势的蔓延随树木密度的变化而变化。密度越大,火蔓延得越快。而且,随着植被密度的增加,传播速度的也在增加。此外,如果树木密度太小,火就会停止蔓延。它可以在图10的左上方看到。如果密度足够大,火就会蔓延到整个地区,“星星之火,可以燎原”就是这个道理。
图10火以不同的可能向四面八方蔓延,六幅图片是在同一时间得到的。由于植被的密度不同,火势的蔓延情况不同。从左到右,从上到下,植被的密度从50%到100%按10%的步骤递增变化。
累计着火植被的数量在不同植被密度下随时间变化的趋势图如图11所示,从图11中我们看出,密度越大,火蔓延得越快。而且,随着植被密度的增加,传播速度的也在增加。
图11 累计着火植被的数量在不同植被密度下随时间变化的趋势图
情况四:不同时间阶段森林火灾的蔓延情况
着火面积随时间而增大,告诉我们,如果采取适当的灭火措施,燃烧的面积可以更小。为了计算燃烧面积,模拟森林火灾的蔓延。随着时间的推移,记录燃烧元胞的数量。由于火势的蔓延是随机的,燃烧面积每次都不同。下图展示了烧伤区域的例子。
这提醒我们:如果在着火初期阶段就迅速灭火,就能非常有效地遏制火势的蔓延。相反,如果不在早期灭火,火势在很短的时间内就会迅速蔓延,造成无法挽回的后果和损失。“星星之火,可以燎原”就是这个道理。
图12 不同时间阶段森林火灾的蔓延情况
情况五:火势不同扩散速度模拟火灾的蔓延情况
火以不同的可能向四面八方蔓延的速度和概率分布图如图13所示。
图13 火以不同的可能向四面八方蔓延的速度和概率分布图
图14 火势以不同的速度和概率向四面八方蔓延的示意图
在实际情况中,加上大风,更多易燃物,气候干燥等因素,火灾蔓延的速度更快,火势汹汹,星星之火可能在瞬间就变成熊熊烈焰。
结论
预测森林火灾蔓延情况是灭火指挥决策中的重要问题,传统的预测方法一般采用的椭圆模型不能反映出当火点确定时火头及火尾的位置。用本文提出基于元胞自动机模型来预测火场时,根据初始确定的火点位置,能预测出各部位火的蔓延位置。用于预估火场面积、周边长等火场参数时,同样具有简单易行的特点。
源码
-
P=[];
-
for m=
1:
10
-
clear D T fire_time_lightning fire_time_itself aspect tdata Index;
-
%% Orginal
-
%the first 3 dimension is RGB,R is the fire,G is the tree.
-
%Black is the meaning of no tree.
-
global n D T Y fire_time_lightning fire_time_itself fire_time_demend pull aspect count_1 tdata Pull_times
-
n=
500;
% the length of the forest matrix
-
D=zeros(n);
-
T=zeros(n);
-
Y=zeros(n,n,
3);
% draw the picture by matrix Y(RGB)
-
fire_time_lightning=
0;
-
fire_time_itself=
0;
-
fire_time_demend=
0;
-
times=
1;
-
pull=
1/times;
% the rate of pull the fire out
-
aspect=ceil(rand(
1)*
4);
% 1 is right,2 is up,3 is left and 4 is down.
-
count_1=
0;
-
tdata=[];
% the day by each fire happened.
-
Pull_times=
0;
-
f1=
1/
1000;
% f1 is the probability in ceil when it being struck by lightning.
-
f2=
1/
500;
% f2 is the probability in ceil when it being fired itself.
-
Z=Terrain();
-
[scale_b,S]=Forest(Z);
-
Tem=S;
-
Yi=imshow(Y);
-
set(gcf,
'DoubleBuffer',
'on');
-
% set up the double cache to prevent the flash in palying animation constantly
-
t=
0;
-
tp=title([
'T = ',num2str(t)]);
-
%ap=title(['aspect = ',num2str(aspect)]);
-
%while 1
-
% t=t+1;
-
for t=
1:
2400
-
%% Fire in the early time
-
if rem(t,
50)==
0&&t<
1000
-
Fire_Demand(S);
-
end
-
%% Lightning
-
if rand<f1
%Is there happen sth with lightning?
-
OriginFireLightning(S);
-
set(Yi,
'CData',Y);
-
end
-
%% Fire itself
-
if t>
10
-
OriginFireCritical(S,t,f2);
-
set(Yi,
'CData',Y);
-
end
-
%% FireRule1
-
[a,b]=FireRule1(S);
-
%% FireRule2
-
S=FireRule2(S,a,b);
-
-
set(Yi,
'CData',Y);
-
set(tp,
'string',[
'T = ',num2str(fix(t/(
24))),
'D = ',num2str(t),
'h '])
-
%set(ap,'string',['aspect = ',num2str(aspect)])
-
pause(
2e-6)
-
end
-
scale_n=sum(sum(Y(:,:,
2)));
-
fire_count=fire_time_itself+fire_time_lightning;
-
Lost_area=scale_b-scale_n;
-
Lost_rate_all=Lost_area/scale_b;
-
Lost_rate_average=Lost_rate_all/(fire_count);
-
Tem=Tem-S;
-
Tem=Tem.*Tem;
-
%Lost_Value=sum(sum(Tem));
-
%N=[pull Lost_rate_all Lost_rate_average fire_count]
-
P=[P;fire_time_demend Pull_times Lost_rate_all fire_time_itself fire_time_lightning]
-
%figure (2)
-
%plot(tdata(:,1),tdata(:,2));
-
end
-
转载:https://blog.csdn.net/wenyusuran/article/details/113832714