当前位置: 首页 > news >正文

MATLAB做一个简单的元胞自动机:森林火灾模拟

MATLAB做一个简单的元胞自动机:森林火灾模拟

% 简单元胞自动机 - 森林火灾模拟
% 状态: 0=空地, 1=树木, 2=燃烧, 3=灰烬clear; clc; close all;% 参数设置
grid_size = 100;           % 网格大小
p_tree = 0.6;             % 初始树木概率
p_ignition = 0.0001;      % 自燃概率
p_regrowth = 0.01;        % 树木再生概率
num_steps = 500;          % 模拟步数% 初始化网格
forest = zeros(grid_size);
forest(rand(grid_size) < p_tree) = 1;  % 随机放置树木% 创建图形窗口
figure;
colormap([0 0 0; 0 1 0; 1 0 0; 0.5 0.5 0.5]); % 黑,绿,红,灰
h_image = imagesc(forest);
axis equal;
title('森林火灾模拟 - 元胞自动机');
xlabel('点击图形开始模拟');
colorbar('Ticks',[0.375,1.125,1.875,2.625],...'TickLabels',{'空地','树木','燃烧','灰烬'});% 等待用户点击开始
waitforbuttonpress;% 模拟循环
for step = 1:num_stepsnew_forest = forest;for i = 1:grid_sizefor j = 1:grid_size% 获取当前细胞状态current_state = forest(i,j);% 定义邻居位置(摩尔邻居,包括对角线)neighbors = forest(max(i-1,1):min(i+1,grid_size),...max(j-1,1):min(j+1,grid_size));% 计算燃烧邻居数量burning_neighbors = sum(neighbors(:) == 2) - (current_state == 2);switch current_statecase 0 % 空地% 以一定概率生长新树if rand < p_regrowthnew_forest(i,j) = 1;endcase 1 % 树木% 如果有燃烧邻居或自燃,则开始燃烧if burning_neighbors > 0 || rand < p_ignitionnew_forest(i,j) = 2;endcase 2 % 燃烧% 燃烧后变为灰烬new_forest(i,j) = 3;case 3 % 灰烬% 以一定概率变为空地if rand < p_regrowth/2new_forest(i,j) = 0;endendendend% 更新森林状态forest = new_forest;% 更新图形set(h_image, 'CData', forest);title(['步数: ' num2str(step) ' / ' num2str(num_steps)]);drawnow;% 计算统计数据stats(step,:) = [sum(forest(:)==0), sum(forest(:)==1), ...sum(forest(:)==2), sum(forest(:)==3)];% 如果没有燃烧的树木,可能提前结束if sum(forest(:)==2) == 0 && step > 50break;endpause(0.05); % 控制动画速度
end% 绘制统计图表
figure;
steps = 1:step;
plot(steps, stats(1:step,1), 'k-', 'LineWidth', 2); hold on;
plot(steps, stats(1:step,2), 'g-', 'LineWidth', 2);
plot(steps, stats(1:step,3), 'r-', 'LineWidth', 2);
plot(steps, stats(1:step,4), 'Color',[0.5 0.5 0.5], 'LineWidth', 2);
legend('空地', '树木', '燃烧', '灰烬', 'Location', 'best');
xlabel('时间步');
ylabel('细胞数量');
title('状态统计');
grid on;% 显示最终统计信息
fprintf('\n模拟结果统计:\n');
fprintf('总步数: %d\n', step);
fprintf('空地: %d (%.1f%%)\n', stats(end,1), 100*stats(end,1)/(grid_size^2));
fprintf('树木: %d (%.1f%%)\n', stats(end,2), 100*stats(end,2)/(grid_size^2));
fprintf('灰烬: %d (%.1f%%)\n', stats(end,4), 100*stats(end,4)/(grid_size^2));

http://www.dtcms.com/a/479253.html

相关文章:

  • 嵌入式开发培训机构排名seo自动推广工具
  • 百度网盘公益解析网站下载限速一边去
  • 站酷网首页蛋糕店微网站
  • 2025年--Lc183--198. 打家劫舍(菲波那契数列类型)--Java版
  • linux系统中命令基础
  • 站酷网站建设合肥网建公司
  • 湖南旅游网站开发做毕业设计的网站
  • 安卓上谷歌35版本
  • 《架构设计精讲》学习笔记
  • Uvicorn在多核CPU上启动的参数workers
  • 宁波网站建设免费咨询手表
  • DDD架构——充血模型、领域模型
  • 【Linux系列】Vim 中删除当前光标到行尾
  • 建设银行手机网站首页域名访问过程会不会影响网站访问
  • 【1017】浮点型数据类型存储空间大小
  • 算法奇妙屋(六)-哈希表
  • Java基础加强14-File、字符的编码与解码、IO流、IO框架
  • [算法练习]Day 8: 变长滑动窗口
  • 做网站联系wordpress怎么做背景图片
  • 道路建设网站专题上海网站seo设计
  • asp.net做网站系统wordpress 首页不显示
  • GESP2025年9月认证C++四级( 第三部分编程题(1)排兵布阵)
  • 论文解读 -- A FOUNDATION MODEL FOR MUSIC INFORMATICS
  • Redis-管道和发布订阅
  • 做网站最大可以做多少g代做网站多少钱
  • PostgreSQL 模式(Schema)详解
  • 网站网页制作及优化网站建设收费明细表
  • 网站建设的物流包装设计用什么软件
  • Java 大视界 -- Java 大数据流处理中的状态管理与故障恢复技术深度解析
  • 大型语言模型实战入门:从 API 到开源模型,掌握文本生成与对话核心技能