目录

1.元胞自动机(Cellular Automation,CA)

2.森林火灾

3.伪代码

4.元胞自动机模拟森林火灾(Matlab实现)

(1)定义森林火灾函数

①空位生长树木 (0 --> 1)

②周围树木燃烧 (1-->-1)

③燃烧树木清除(-1-->0)

④雷电击中正常树木 (1-->-1)

(2)定义主函数

①遍历部分

②趋势曲线绘制部分

(3)执行命令

5.森林火灾动态仿真


1.元胞自动机(Cellular Automation,CA)

该部分详细内容请参考如下链接:

元胞自动机:森林火灾模拟(Python:numpy、seaborn)_Destiny坠明的博客-CSDN博客


2.森林火灾

该部分详细内容请参考如下链接:

元胞自动机:森林火灾模拟(Python:numpy、seaborn)_Destiny坠明的博客-CSDN博客


3.伪代码

该部分详细内容请参考如下链接:

元胞自动机:森林火灾模拟(Python:numpy、seaborn)_Destiny坠明的博客-CSDN博客


4.元胞自动机模拟森林火灾(Matlab实现)

(1)定义森林火灾函数

<Forest_Fire.m>

Forest_Fire函数如下,传入参数为:

(1)上一时刻的燃烧矩阵;

(2)空格位 树的生长概率p;

(3)正常位 树的燃烧概率f;

假定:空格位 --> 0 正常位 --> 1 燃烧位 --> -1

总量:空格位 --> C 正常位 --> G 燃烧位 --> R

输出参数为:规则演化后的燃烧矩阵;

该函数可分为4个操作部分:

function matrix=Forest_Fire(current_matrix,p,f)global area;matrix=current_matrix;% (1)空位生长树木 (0 --> 1)   储存位置i_C_indexes = [];j_C_indexes = [];for i = 1:1:area   % 行循环for j = 1:1:area   % 列循环if (matrix(i, j) == 0 & rand()<p)i_C_indexes(end+1)=i;j_C_indexes(end+1)=j;endendend% (2)周围树木燃烧   (1 --> -1)   储存位置,并存储上一时刻的燃烧数据fire_memory=find(matrix==-1);i_indexes=[];j_indexes=[];for i = 1:1:area   % 行循环for j = 1:1:area   % 列循环if (matrix(i,j)==-1)if((1<=i-1) & (i-1<=area) & (1<=j) & (j<= area))if (matrix(i-1,j)==1)i_indexes(end+1)=i-1;j_indexes(end+1)=j;endendif((1<=i+1) & (i+1<=area) & (1<=j) & (j<= area))if (matrix(i+1,j)==1)i_indexes(end+1)=i+1;j_indexes(end+1)=j;endendif((1<=i) & (i<=area) & (1<=j-1) & (j-1<= area))if (matrix(i,j-1)==1)i_indexes(end+1)=i;j_indexes(end+1)=j-1;endendif((1<=i) & (i<=area) & (1<=j+1) & (j+1<= area))if (matrix(i,j+1)==1)i_indexes(end+1)=i;j_indexes(end+1)=j+1;endendendendendfor k = 1:1: length(i_indexes)matrix(i_indexes(k),j_indexes(k))=-1;end% (3)燃烧树木清除 (-1 --> 0)matrix(fire_memory)=0;% (4)雷电击中正常树木 (1 --> -1)    储存位置i_indexes = [];j_indexes = [];for i = 1:1:area   % 行循环for j = 1:1:area   % 列循环if matrix(i, j) == 1if(1<=i-1 & i-1<=area & 1<=j & j<= area)if(matrix(i-1, j) == -1)continueendendif(1<=i+1 & i+1<=area & 1<=j & j<= area)if(matrix(i+1, j) == -1)continueendendif(1<=i & i<=area & 1<=j-1 & j-1<= area)if(matrix(i, j-1) == -1)continueendendif(1<=i & i<=area & 1<=j+1 & j+1<= area)if(matrix(i, j+1) == -1)continueendendif rand()<fi_indexes(end+1)=i;j_indexes(end+1)=j;endendendendfor k = 1:1: length(i_indexes)matrix(i_indexes(k),j_indexes(k))=-1;end% 完成空位生长树木的操作for k = 1:1: length(i_C_indexes)matrix(i_C_indexes(k),j_C_indexes(k))=1;end

area为全局变量。(森林的边长)

function matrix=Forest_Fire(current_matrix,p,f)global area;matrix=current_matrix;

全局变量声明规则:

如在主函数中,你要设置n为全局变量则需声明 global n;
然后在子函数里面你用到了n这个全局变量,则需在子函数中再次声明 global n;
这样在子函数中,就可以使用n这个全局变量了。


①空位生长树木 (0 --> 1)

    % (1)空位生长树木 (0 --> 1)   储存位置i_C_indexes = [];j_C_indexes = [];for i = 1:1:area   % 行循环for j = 1:1:area   % 列循环if (matrix(i, j) == 0 & rand()<p)i_C_indexes(end+1)=i;j_C_indexes(end+1)=j;endendend

每当一个新的演化时间点到来时,首先要执行 空位生长树木 (0 --> 1) 的操作。若这一操作滞后,则会导致前一时刻燃烧的树木在这一时刻烧尽后重新生长为树木,故这一演化的优先级较高。并且需要将符合条件的坐标存储(而不是直接将矩阵元素更改),若不如此处理,则会导致中心灰烬点重焕生机后再次被周围的余火吞噬,无法达到 空位生长树木 (0 --> 1) 的效果。

综上,该演化优先级最高并且需要储存符合要求的坐标位置。


②周围树木燃烧 (1-->-1)

    % (2)周围树木燃烧   (1 --> -1)   储存位置,并存储上一时刻的燃烧数据fire_memory=find(matrix==-1);i_indexes=[];j_indexes=[];for i = 1:1:area   % 行循环for j = 1:1:area   % 列循环if (matrix(i,j)==-1)if((1<=i-1) & (i-1<=area) & (1<=j) & (j<= area))if (matrix(i-1,j)==1)i_indexes(end+1)=i-1;j_indexes(end+1)=j;endendif((1<=i+1) & (i+1<=area) & (1<=j) & (j<= area))if (matrix(i+1,j)==1)i_indexes(end+1)=i+1;j_indexes(end+1)=j;endendif((1<=i) & (i<=area) & (1<=j-1) & (j-1<= area))if (matrix(i,j-1)==1)i_indexes(end+1)=i;j_indexes(end+1)=j-1;endendif((1<=i) & (i<=area) & (1<=j+1) & (j+1<= area))if (matrix(i,j+1)==1)i_indexes(end+1)=i;j_indexes(end+1)=j+1;endendendendendfor k = 1:1: length(i_indexes)matrix(i_indexes(k),j_indexes(k))=-1;end

在这一部分需要注意边界特殊情况导致的矩阵索引越界报错。

存储上一时刻的燃烧数据 fire_memory 的目的是为了在之后的树木烧尽操作中区分出上一时刻燃烧的树木,避免与当前时刻新燃烧的树木产生混淆。

储存符合条件坐标的原因是避免当前时刻新燃烧的树木引燃树木(这是一个很严重的bug),所以需要先存储所有坐标信息,再统一赋新值处理。

注意:Matlab在判断一个标量是否在一个区间内,要将两个边界的条件拆开写!


③燃烧树木清除(-1-->0)

    % (3)燃烧树木清除 (-1 --> 0)matrix(fire_memory)=0;

直接将上一操作存储的燃烧数据坐标 fire_memory对应位置的元素归零,实现燃烧树木清除 (-1 --> 0)效果。

注:fire_memory存储的是一个向量(而非矩阵),

每一个数值标量对应着一个索引(Matlab的存储结构特性)。


④雷电击中正常树木 (1-->-1)

    % (4)雷电击中正常树木 (1 --> -1)    储存位置i_indexes = [];j_indexes = [];for i = 1:1:area   % 行循环for j = 1:1:area   % 列循环if matrix(i, j) == 1if(1<=i-1 & i-1<=area & 1<=j & j<= area)if(matrix(i-1, j) == -1)continueendendif(1<=i+1 & i+1<=area & 1<=j & j<= area)if(matrix(i+1, j) == -1)continueendendif(1<=i & i<=area & 1<=j-1 & j-1<= area)if(matrix(i, j-1) == -1)continueendendif(1<=i & i<=area & 1<=j+1 & j+1<= area)if(matrix(i, j+1) == -1)continueendendif rand()<fi_indexes(end+1)=i;j_indexes(end+1)=j;endendendendfor k = 1:1: length(i_indexes)matrix(i_indexes(k),j_indexes(k))=-1;end

这一部分的算法实现过程与操作2类似,不再赘述。


    % 完成空位生长树木的操作for k = 1:1: length(i_C_indexes)matrix(i_C_indexes(k),j_C_indexes(k))=1;end

函数的最后完成第一步空位生长树木 (0 --> 1) 的操作,最终返回一个矩阵(二维数组)。


(2)定义主函数

<main.m>

main函数如下,传入参数为:

(1)森林边长area;

(2)演替次数N;

(3)空格位 树的生长概率p;

(4)正常位 树的燃烧概率f;

输出参数为:最终的燃烧矩阵;

该函数可分为2个操作部分:

function matrix=main(area,N,p,f)C_count=[];G_count=[];R_count=[];map = [239/255,29/255,31/255;165/255,165/255,165/255;28/255,172/255,76/255];matrix=ones(area,area);for time=1:1:Nmatrix=Forest_Fire(matrix,p,f);C_count(end+1)=length(find(matrix==0));G_count(end+1)=length(find(matrix==1));R_count(end+1)=length(find(matrix==-1));hfig=figure(1);set(hfig, 'position', get(0,'ScreenSize'));h=heatmap(matrix);colormap(map);%h.CellLabelFormat = '%d';%h.Title = 'Forest Fire';%h.XLabel = 'X';%h.YLabel = 'Y';h.CellLabelColor = 'none';endT=1:1:N;hfig=figure(2);set(hfig, 'position', get(0,'ScreenSize'));hold on;plot(T,C_count,'LineWidth',2,'Color',[165/255,165/255,165/255]);plot(T,G_count,'LineWidth',2,'Color',[28/255,172/255,76/255]);plot(T,R_count,'LineWidth',2,'Color',[239/255,29/255,31/255]);grid on;legend('Vacancy','Trees','Burning');hold off;

热力图自定义颜色:

map= [239/255,29/255,31/255;
           165/255,165/255,165/255;
           28/255,172/255,76/255
];

colormap(map);

function matrix=main(area,N,p,f)C_count=[];G_count=[];R_count=[];map = [239/255,29/255,31/255;165/255,165/255,165/255;28/255,172/255,76/255];matrix=ones(area,area);

①遍历部分

    for time=1:1:Nmatrix=Forest_Fire(matrix,p,f);C_count(end+1)=length(find(matrix==0));G_count(end+1)=length(find(matrix==1));R_count(end+1)=length(find(matrix==-1));hfig=figure(1);set(hfig, 'position', get(0,'ScreenSize'));h=heatmap(matrix);colormap(map);%h.CellLabelFormat = '%d';%h.Title = 'Forest Fire';%h.XLabel = 'X';%h.YLabel = 'Y';h.CellLabelColor = 'none';end

调整figure尺寸(铺满屏幕)

hfig=figure(1);
set(hfig, 'position', get(0,'ScreenSize'));


②趋势曲线绘制部分

    T=1:1:N;hfig=figure(2);set(hfig, 'position', get(0,'ScreenSize'));hold on;plot(T,C_count,'LineWidth',2,'Color',[165/255,165/255,165/255]);plot(T,G_count,'LineWidth',2,'Color',[28/255,172/255,76/255]);plot(T,R_count,'LineWidth',2,'Color',[239/255,29/255,31/255]);grid on;legend('Vacancy','Trees','Burning');hold off;

  这一段代码负责绘制出树木三种状态的数量变化趋势图。


(3)执行命令

<Cellular_Automation>

global area;
area=100;final_matrix=main(area,100,0.25,0.01);% figure(2);
%
% h=heatmap(final_matrix);
%
% h.CellLabelFormat = '%d';
% h.Title = 'Forest Fire';
% h.XLabel = 'X';
% h.YLabel = 'Y';
%
% %h.CellLabelColor = 'none';
%
% map = [239/255,29/255,31/255;
%     165/255,165/255,165/255;
%     28/255,172/255,76/255];
%
% colormap(map)


5.森林火灾动态仿真

Matlab森林火灾仿真

元胞自动机:森林火灾模拟(Matlab:heatmap、colormap)相关推荐

  1. 元胞自动机-森林火灾模拟

    引入: 元胞自动机,英文名及缩写:cellular automata,CA.最初是由冯诺依曼在二十世纪五十年代为模拟生物自保的自我复制而提出的,但是当时并未受到重视.后来才逐渐发展起来,著名的&quo ...

  2. 【元胞自动机】元胞自动机地铁火灾疏散模型【含Matlab源码 246期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  3. 【元胞自动机】元胞自动机传染病传播模拟【含Matlab源码 1680期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  4. 【元胞自动机】元胞自动机森林大火【含Matlab源码 235期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  5. 【元胞自动机】元胞自动机交通流模拟仿真【含Matlab源码 1252期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  6. 【元胞自动机】元胞自动机图像处理【含Matlab源码 234期 】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  7. 【元胞自动机】元胞自动机城市规划【含Matlab源码 125期】

    ⛄一.案例简介(附课程报告) 城市规模设计 雄安新区占地总面积约为2000平方公里,涉及河北省雄县.容城.安新3个县及周边部分区域,地处北京.天津.保定腹地,通过ArcGIS地图软件搜索该区域并从中提 ...

  8. matlab元胞自动机学风演化,利用MATLAB和VC60混合编程技术研究元胞自动机动态演化过程...

    利用MATLAB和VC60混合编程技术研究元胞自动机动态演化过程 第! !卷!第期 ! 成都理工大学学报! 自然科学版 !# $ % - 2: 5 34- 1 -6;!9 ? : A ? $ % $ ...

  9. 元胞自动机交通模型【matlab实现】

    Matlab元胞自动机交通模型案例分享 模型介绍 算例设计 matlab使用元胞自动机进行仿真(部分代码) 结果展示(部分结果) 模型介绍 交通模型空间示意图(T字路口+人行道) 算例设计 根据上述模 ...

  10. 【元胞自动机】基于元胞自动机的人口疏散仿真matlab源码

    1 简介 为了消除礼堂的安全隐患,制定 行之有效的应急预案,有必要对礼堂人群疏散运动进行研究,掌握礼堂人群疏散的一般特点和规律.采用基于二维元胞自动机模型对某高校礼堂发生人群疏散运动进 行仿真,找出影 ...

最新文章

  1. 路由器配置与管理完全手册(Cisco篇)学习感想
  2. 只用一分钟,给你的宽带加速
  3. 工欲善其事必先利其器——web调试工具firebug
  4. shell bash判断文件或文件夹是否存在
  5. 【后两个测试点】地下迷宫探索 (30 分)
  6. python面向对象设计管理系统_python面向对象之单例设计模型
  7. 寒窗苦读十多年,我的毕业论文只研究了一个「屁」
  8. 北理工爬虫课程学习记录
  9. arcgisengine计算线要素总长度_ArcGIS |如何利用一个工具快速计算城市道路网密度...
  10. kettle 数据提取效率提升
  11. 一套完整自定义工作流的实现
  12. 修改系统文件内容的经典错误总结
  13. android java 调试快捷键_最强Android studio 使用快捷键和调试技巧
  14. java企业绩效_员工绩效管理系统,基于SSM框架下的JAVA系统
  15. 网络授时设备(NTP时钟服务器)助力智能交通管控平台
  16. python 经验模态分解_心电信号去噪4--经验模态分解法(EMD)
  17. 如何提高团队的工作效率
  18. 修复WiFi网卡驱动异常导致WiFi图标消失报错代码(56)
  19. jquery实现点击小图片查看大图片
  20. OPENCV 寻找图形最大内接矩形

热门文章

  1. java 对照 术语_JAVA的部分术语中英文对照(
  2. 两个开关电源可以并联使用吗开关电源有均流功能,只有开关电源有均流功能的才可以并联使用。没有的切记不可并联使用。电工之家百度快照课复制(可以把网址复制到百度搜索栏,不是http网址搜索栏)
  3. 微软NewBing的申请和实测体验
  4. Java leetcode 相交链表
  5. dataframe按照某列排序
  6. 采用16线激光雷达调用cartographer室内建图
  7. Mac版Ps、AE、PR不能突然使用?Adobe全家桶关闭自动更新的方法
  8. BZOJ3926: [Zjoi20150]诸神眷顾的幻想乡
  9. TypeScript 使用手册
  10. python简单小动画