Matlab:元胞自动机

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

例1:生命游戏

nextStateCalculation.m

% 下一个状态的计算函数
function nextState = nextStateCalculation(currentState)
    [m, n] = size(currentState);
    nextState = zeros(m, n);
    for i = 1:m
        for 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 > 3
                    nextState(i, j) = 0; % 孤立或拥挤死亡
                else
                    nextState(i, j) = 1; % 继续存活
                end
            else
                % 死细胞规则
                if liveNeighbours == 3
                    nextState(i, j) = 1; % 繁殖
                else
                    nextState(i, j) = 0; % 仍然死亡
                end
            end
        end
    end
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:numIterations
        forest = 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:rows
        for j = 1:cols
            if forest(i, j) == 1 % 树木
                % 根据周围树木着火情况更新当前点状态
                if any(neighbors(forest, i, j) == 2) || rand < pIgnition
                    newForest(i, j) = 2; % 着火
                end
            elseif forest(i, j) == 2 % 着火
                newForest(i, j) = 0; % 燃尽
            end
        end
    end
end

neighbors.m

% 获取邻居状态
function neighborStates = neighbors(forest, i, j)
    [rows, cols] = size(forest);
    neighborStates = zeros(1, 8);
    
    for k = -1:1
        for l = -1:1
            if k == 0 && l == 0
                continue;
            end
            
            if i+k >= 1 && i+k <= rows && j+l >= 1 && j+l <= cols
                neighborStates((k+1)*3+l+2) = forest(i+k, j+l);
            end
        end
    end
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:nSteps
    for x = 1:gridSize
        for 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;
        end
    end
end

% 可视化最终步骤的种群密度
imagesc(populationGrid(:,:,end));
colorbar;
title('Final Population Density');
xlabel('X');
ylabel('Y');

运行效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bicycles(变形dijkstra,动态规划思想)

Codeforces Round 918 (Div. 4) G. Bicycles G. Bicycles 题意&#xff1a; 斯拉夫的所有朋友都打算骑自行车从他们住的地方去参加一个聚会。除了斯拉维奇&#xff0c;他们都有一辆自行车。他们可以经过 n n n 个城市。他们都住在城市 1 1 1 &#xff0c;想去参加位于城市…

深入理解分库、分表、分库分表

前言 分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;所谓"分库分表"&#xff0c;根本就不是一件事儿&#xff0c;而是三件事儿&#xff0c;他们要解决的问题也都不一样&#xff0c;这三个事儿分别是"只…

SQL注入漏洞解析-less-8(布尔盲注)

我们来看一下第八关 当我们进行尝试时&#xff0c;他只有You are in...........或者没有显示。 他只有对和错显示&#xff0c;那我们只能用对或者错误来猜他这个数据库 ?id1%27%20and%20ascii(substr(database(),1,1))>114-- ?id1%27%20and%20ascii(substr(database(),1,…

express+mysql+vue,从零搭建一个商城管理系统3--user路由模块

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建routes文件夹二、新建routes/index.js和routes/user.js三、修改index.js四、修改routes/index.js五、修改routes/user.js六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所…

176基于matlab的自适应滤波法预测

基于matlab的自适应滤波法预测&#xff0c;自适应滤波预测实质上是一种加权滑动平均预测&#xff0c;通过迭代得到最佳权值&#xff0c;并给出了相对误差图和预测效果图&#xff0c;程序已调通&#xff0c;可直接运行。 176matlab自适应滤波法预测 时间序列预测 (xiaohongshu.c…

FL Studio 21 Mac汉化免费版 附安装教程

FL Studio 21 Mac是Mac系统中的一款水果音乐编辑软件&#xff0c;提供多种插件&#xff0c;包括采样器、合成器和效果器&#xff0c;可编辑不同风格的音乐作品&#xff0c;Pattern/Song双模式&#xff0c;可兼容第三方插件和音效包&#xff0c;为您的创意插上翅膀。FL Studio 2…

element el-date-picker 日期组件置灰指定日期范围、禁止日期范围日期选择

JS如何将当前日期或指定日期转时间戳_javascript技巧_脚本之家 小于指定日期前的日期置灰 比如这里 指定日期是 2024-02-20 10:48:15 disabledDate(time) time是一个函数提供的时间用于比较 他是一个时间戳↓ 理解为我们想要置灰的时间 time.getTime() < timeStamps- 1 *…

yolov9 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

特别说明&#xff1a;参考官方开源的yolov9代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 之前写过yolov8检测、分割、关键点模型的部署的多篇博文&#xff0c;y…

时隔一年的测评:gpt3.5发展到什么程度了?

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍1、chatgpt是什么&#xff1f;2、主要特点3、工作原理4、应用限制5、使…

当Web3叙事寒冬到来,游戏是否是冬日里的“一把火”?

出品&#xff5c;欧科云链研究院 作者&#xff5c;Jason Jiang 以太坊创始人Vitalik在2019年曾说&#xff1a;金融与游戏会是区块链最先落地的场景。 在DeFi金融创新驱动上个周期后&#xff0c;沉寂近两年的Web3游戏板块&#xff0c;如今似乎也在复苏。无论是频繁获得融资&a…

unity初学问题:如何修改图片的坐标

如图&#xff0c;我们想要修改图片的轴心点坐标&#xff08;Pivot&#xff09; 选择图片组 打开编辑器在里面修改即可&#xff08;最下面的Custom Pivot&#xff09;

Git实用命令

撤销操作 # 撤销暂存&#xff0c;保留修改内容 git reset HEAD <file># 撤销修改 git checkout -- <file>远程仓库操作 #添加远程仓库git remote add demo https://gitee.com/dwp1216/demo.git拉取指定文件 git init git remote add -f origin https://172.16.0.…

小程序一键链接WIFI

1.小程序一键链接WIFI connectWifi: function() {var that this;//检测手机型号wx.getSystemInfo({success: function(res) {var system ;if (res.platform android) system parseInt(res.system.substr(8));if (res.platform ios) system parseInt(res.system.substr(4…

MetaGPT 1 安装与配置踩坑实录

安装 与 配置直接参考这里就行&#xff1a;Hugging Muti Agent&#xff08;二月学习&#xff09; - 飞书云文档 (feishu.cn) 这里按照教程安装的是metagpt 0.6.6 &#xff0c;经过跟0.7.0对比&#xff0c;个人认为0.7对其他llm接入可能更好&#xff0c;文档也更清晰。 0.6.6的…

自定义神经网络一之Tensor和神经网络

文章目录 前言Tensor神经网络深度神经网络DNN卷积神经网络CNN卷积神经网络有2大特点 循环神经网络RNN残差网络ResNetTransformer自我注意力机制并行效率 总结 前言 神经网络是AI界的一个基础概念&#xff0c;当下火热的神经网络例如RNN循环神经网络或者CNN卷积神经网络&#x…

GIS之深度学习03:Anaconda无法正常启动问题汇总(更新)

在安装完成anaconda后&#xff0c;总会出现一些问题&#xff0c;以下为遇到的问题及解决方案&#xff1a; &#xff08;有问题请私信&#xff0c;持续更新&#xff09; 01&#xff1a;anaconda navigator启动时一直卡在 loading applications 页面 解决&#xff1a; 找到anac…

抖音视频下载软件的优势|视频批量下载

抖音视频下载软件具有以下优势&#xff1a; 多种搜索方式&#xff1a;用户可以通过输入关键词进行批量视频提取&#xff0c;也可以通过分享链接进行单个视频的提取和下载。这样用户可以根据自己的需求选择最合适的搜索方式。 直观的界面设计&#xff1a;软件的界面分为五大块&…

Java集合基础梳理(集合体系+ArrayList)

目录 Java集合体系 为什么要使用集合类 ? 如何选用集合? 哪些集合类是线程安全的&#xff1f;哪些不安全&#xff1f; 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么&#xff1f; 遍历的同时修改一个List有几种方式 ArrayList 如何进行元素的遍历操作&#x…

Neoverse S3 系统 IP:机密计算和多芯片基础设施 SoC 的基础

第三代Neoverse系统IP Neoverse S3 产品推出了我们的第三代基础设施特定系统 IP&#xff0c;这是下一代基础设施 SOC 的理想基础&#xff0c;适用于从 HPC 和机器学习到 Edge 和 DPU 的各种应用。S3 机箱专注于为我们的合作伙伴提供 Chiplet、机密计算等关键创新以及 UCIe、DD…

react-组件基础

1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…
最新文章