Matlab:元胞自动机

        元胞自动机是一种基于离散空间的动态系统,由许多简单单元按照某些规则进行相互作用和演化而形成的复杂结构。元胞自动机可以用于模拟物理、生物、社会等领域的现象,以及进行优化、图像处理、噪声生成等方面的应用。

例1:生命游戏

nextStateCalculation.m

% 下一个状态的计算函数
function nextState = nextStateCalculation(currentState)[m, n] = size(currentState);nextState = zeros(m, n);for i = 1:mfor j = 1:n% 统计邻居细胞的存活数liveNeighbours = sum(sum(currentState(max(i-1,1):min(i+1,m), max(j-1,1):min(j+1,n)))) - currentState(i, j);if currentState(i, j) == 1% 活细胞规则if liveNeighbours < 2 || liveNeighbours > 3nextState(i, j) = 0; % 孤立或拥挤死亡elsenextState(i, j) = 1; % 继续存活endelse% 死细胞规则if liveNeighbours == 3nextState(i, j) = 1; % 繁殖elsenextState(i, j) = 0; % 仍然死亡endendendend
end

主程序:

% 定义初始状态
initialState = randi([0 1], 50, 50); % 50x50 的随机初始状态% 显示初始状态
figure;
imagesc(initialState);
colormap(summer);
title('初始状态');% 模拟演化
numIterations = 100;
for t = 1:numIterations% 计算下一个状态nextState = nextStateCalculation(initialState);% 显示下一个状态imagesc(nextState);colormap(summer);title(['第', num2str(t), '代']);pause(0.1);% 更新状态initialState = nextState;
end

效果如下:

例2:森林火灾(完全烧毁)

simulateForestFire.m

% 定义森林火灾模拟函数
function simulateForestFire(rows, cols, pTree, pBurning, pIgnition, numIterations)% 初始化森林状态forest = zeros(rows, cols); % 0代表空地,1代表树木,2代表正在燃烧% 随机生成树木forest(rand(rows, cols) < pTree) = 1;% 随机选择一个树木点作为起火点burningTree = randi([1, rows], 1, 2);forest(burningTree(1), burningTree(2)) = 2;% 模拟森林火灾传播过程for t = 1:numIterationsforest = updateForest(forest, pBurning, pIgnition);% 可视化当前森林状态imagesc(forest);colormap([1 1 1; 0 1 0; 1 0 0]); % 白色-空地,绿色-树木,红色-着火title(['第', num2str(t), '代']);pause(0.1);end
end

updateForest.m

% 更新森林状态
function newForest = updateForest(forest, pBurning, pIgnition)[rows, cols] = size(forest);newForest = forest;for i = 1:rowsfor j = 1:colsif forest(i, j) == 1 % 树木% 根据周围树木着火情况更新当前点状态if any(neighbors(forest, i, j) == 2) || rand < pIgnitionnewForest(i, j) = 2; % 着火endelseif forest(i, j) == 2 % 着火newForest(i, j) = 0; % 燃尽endendend
end

neighbors.m

% 获取邻居状态
function neighborStates = neighbors(forest, i, j)[rows, cols] = size(forest);neighborStates = zeros(1, 8);for k = -1:1for l = -1:1if k == 0 && l == 0continue;endif i+k >= 1 && i+k <= rows && j+l >= 1 && j+l <= colsneighborStates((k+1)*3+l+2) = forest(i+k, j+l);endendend
end

调用函数

% 调用函数进行森林火灾模拟
simulateForestFire(50, 50, 0.7, 0.01, 0.4, 100); % 行数、列数、树木密度、树木燃烧概率、点燃概率、迭代次数

效果如下:

例3:种群繁殖模拟(以性别比例为例)

% 初始化参数
gridSize = 50; % 定义格子空间大小
nSteps = 100; % 模拟步数
initialDensity = 0.1; % 初始种群密度
reproductionRate = 0.05; % 繁殖率
mortalityRate = 0.02; % 死亡率
foodSupply = rand(gridSize); % 食物供应随机分布% 初始化格子空间
populationGrid = zeros(gridSize, gridSize, nSteps);
genderRatioGrid = zeros(gridSize, gridSize, nSteps); % 性别比例,假设初始时0.5(1代表全雄性,0代表全雌性)% 初始种群和性别比例
populationGrid(:,:,1) = rand(gridSize) < initialDensity;
genderRatioGrid(:,:,1) = 0.5 * ones(gridSize);% 元胞自动机主循环
for t = 2:nStepsfor x = 1:gridSizefor y = 1:gridSize% 获取邻居索引,考虑周期边界条件[neighX, neighY] = meshgrid(x-1:x+1, y-1:y+1);neighX = mod(neighX - 1, gridSize) + 1;neighY = mod(neighY - 1, gridSize) + 1;% 计算邻居的平均食物供应avgFoodSupply = mean(mean(foodSupply(neighX, neighY)));% 更新种群和性别比例currentPopulation = populationGrid(x, y, t-1);currentGenderRatio = genderRatioGrid(x, y, t-1);newPopulation = currentPopulation + reproductionRate * avgFoodSupply * currentPopulation - mortalityRate * currentPopulation;newGenderRatio = currentGenderRatio; % 可以添加基于食物供应或其他因素的性别比例调整规则% 更新状态populationGrid(x, y, t) = newPopulation;genderRatioGrid(x, y, t) = newGenderRatio;endend
end% 可视化最终步骤的种群密度
imagesc(populationGrid(:,:,end));
colorbar;
title('Final Population Density');
xlabel('X');
ylabel('Y');

运行效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/513439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES入门八:Mapping的详细讲解

什么是Mapping&#xff1f;**Mapping定义了索引中的文档有哪些字段及其类型、这些字段是如何存储和索引的。**每个文档都是一个字段的集合&#xff0c;每个字段都有自己的数据类型&#xff0c;例如我们定义的books索引&#xff0c;其中有book_id、name等字段。所以Mapping的作用…

自动驾驶预测与决策规划(基于运动模型的预测)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文为深蓝学院《自动驾驶预测与决策规划》 的学习笔记 目录 1 Constant Velocity模型 2 Constant Turn 模型 1 Constant Velocity模型 Constan…

DDS笔记

1.DDS 直接数字式频率合成器&#xff08;Direct Digital Synthesizer,DDS&#xff09;是通过相位和幅值 的映射实现任意频率的正弦曲线样本的方法 系统时钟CLK频率为fclk&#xff0c;输出信号频率为fout&#xff0c;频率字输入K的位宽为N位。 相位累加器通常由一个N位加法器和…

安森美 推出首款 TOLL 封装中低压 MOS 650V SiC MOSFET,碳化硅二极管

新器件封装尺寸缩小 60%&#xff0c;性能增强&#xff0c;损耗减少 Onsemi 在 PCIM Europe 上宣布了世界上第一个 TO-Leadless (TOLL) 封装的 SiC MOSFET。该晶体管满足了对适用于高功率密度设计的高性能开关器件快速增长的需求。直到最近&#xff0c;SiC 器件一直采用 D2PAK …

基于openKylin与RISC-V的MindSpore AI项目实践

项目目标&#xff1a; 在openKylin系统上安装和配置MindSpore框架。开发一个简单的图像分类模型&#xff0c;并在RISC-V平台上进行训练和推理。根据RISC-V的特性&#xff0c;对MindSpore框架进行必要的优化。 目录 项目目标&#xff1a; 训练模型 编写训练代码&#xff0c;设…

一键生成超好用的简历设计模板

对于缺乏工作经验和职业规划的应届生而言&#xff0c;使用简历设计平台&#xff0c;辅助我们完成简历分区、排版和美化流程&#xff0c;早就成为简历设计环节的 “潜规则”。这里我们挑选了 5 个能够实现免费下载、一键生成的简历设计平台&#xff0c;供大家参考借鉴。 即时设…

Java毕业设计 基于SpringBoot vue 社团管理系统

Java毕业设计 基于SpringBoot vue 社团管理系统 SpringBoot vue 社团管理系统 功能介绍 社团成员: 登录 首页 社团列表 加入社团申请 我的社团 在线留言 社长: 登录 首页 用户信息管理 入团申请管理 社团活动管理 社团成员管理 社团新闻管理 社团费用管理 系统管理员: 登录…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能&#xff1a; 提供用户名和密码输入框。当用户提交表单时&#xff0c;阻止默认提交行为。使用正则表达式验证用户输入的内容&#xff0c;判断输入的是有效的邮箱地址还是身份证号码。根据验证结果&#xff0c;在输入框下方显示相应的提示信息。 实现逻辑&a…

vue3 图片/视频 加载失败重试

vue3 图片/视频 加载失败重试 需求背景 用户手机上传图片走oss &#xff0c;在pc端在线客服连接socket 需要实时推送消息&#xff0c;接受到消息后&#xff0c;由于oss还回没有回调成功&#xff0c;所以图片/视频不能及时展示&#xff0c;所以做了一个失败重试的功能 效果图 技…

千帆AppBuilder使用指南-创建应用

概述 百度智能云千帆AppBuilder使用指南&#xff08;以下简称为AppBuilder&#xff09;提供了多个预置应用框架的零代码创建能力或代码态开发能力&#xff0c;降低AI原生应用开发门槛。 1、知识问答应用&#xff08;RAG框架&#xff09; 高效的大模型知识检索增强框架&#…

二分以及练习题目

二分模板 判断是否可以二分 &#xff08;1&#xff09;单调性 备选答案集是有序的 &#xff08;2&#xff09;二段性 在检查了mid是否符合要求之和&#xff0c;我可以舍弃左右某一边的答案 两个模板 关键词&#xff1a;满足条件的最小值&#xff0c;最大值最小&#xff0…

掌握 MySQL 的数据类型

知道了表是由不同数据类型的列组成的&#xff0c;然后填充了一行一行的数据。 当我们要创建表的时候&#xff0c;就要根据业务需求&#xff0c;选择合适的数据类型。比如在实战项目中&#xff0c;文章表就是由下面这些不同数据类型的字段定义的。 目前用到了 bigint、tinyint、…