元胞自动机算法汇总含matlab代码_数学建模(十三)

2023-11-20

元胞自动机理论
许多复杂的问题都可以通过元胞自动机来建立模型,元胞自动机实质上是定义在一个具有离散、有限状态的元胞组成的元胞空间上,并按照一定的局部规则,在离散的时间维度上演化的动力学系统。
元胞又可称为单元、细胞,是元胞自动机的最基本的组成部分。
元胞具有以下特点:
1)元胞自动机最基本的单元。
2)元胞有记忆贮存状态的功能。
3)所有元胞状态都按照元胞规则不断更新。
演化规则
中心元胞的下一个状态由中心元胞的当前状态和其邻居的当前状态按照一定的规则确定。

对于这个专题,主要研究了两个问题,来学习元胞自动机,第一、森林火灾的模拟,第二、单车道交通流的模拟。
对于森林火灾的模拟:
森林火灾的元胞自动机模型有三种状态:空位,燃烧着的树木及树木。则某元胞下一时刻状态由该时刻本身的状态和周围四个邻居的状态以一定的规则确定,规则如下:
1)如果某树木元胞的4个邻居有燃烧着的,那么该元胞下一时刻的状态是燃烧着的。
2)一个燃烧着的元胞在下一时刻变成空位。
3)所有树木元胞以一个低概率开始燃烧(模拟闪电引起的火灾)
4)所有空元胞以一个低概率变成树木(以模拟新的树木的生长)
Matlab代码:

close;
clear;
clc;
n = 300;     %元胞矩阵大小
Plight = 0.000001; Pgrowth = 0.001;
UL = [n 1:n-1];
DR = [2:n 1];
veg = zeros(n,n);        %初始化
% The value of veg:
% empty == 0  
% burning == 1
% green == 2
imh = image(cat(3,veg,veg,veg));
m=annotation('textbox',[0.1,0.1,0.1,0.1],'LineStyle','-','LineWidth',1,'String','123');
for i = 1:100000
    sum = (veg(UL,:) == 1) + (veg(:,UL) == 1) + (veg(DR,:) == 1) + (veg(:,DR) == 1);
    %根据规则更新森林矩阵:树 =- 着火的树 + 新生的树
    veg = 2 * (veg == 2) - ( (veg == 2) & (sum > 0 | (rand(n,n) < Plight)) ) + 2 * ( (veg == 0) & rand(n,n) < Pgrowth);
    a=find(veg==2);
    b=find(veg==1);
    aa=length(a);
    bb=length(b);
    shu(i)=aa;
    fire(i)=bb*30;
    if (bb>=0&&bb<=10)
        str1='森林正常';
    elseif (bb>10&&bb<=100)
        str1='火灾发展';
    elseif (bb>100)
        str1='森林大火';
    end
    if ((aa>48000)||(bb>=10))
        str2='火灾预警:红色预警';
    elseif (aa>42000&&aa<=48000)
        str2='火灾预警:黄色预警';
    elseif (aa>35000&&aa<=42000)
        str2='火灾预警:蓝色预警';
    elseif (aa>=0&&aa<=35000)
        str2='火灾预警:安全';
    end 
    str=[str1 10 str2];
    set(imh, 'cdata', cat(3, (veg == 1), (veg == 2), zeros(n)) )
    drawnow
    figure(2)
    delete(m)
    plot(shu);
    hold on
    plot(fire);
    legend(['绿树的数量',num2str(aa)],['火的数量',num2str(bb)]);
    title(['时间T=',num2str(i),'天']);
    m=annotation('textbox',[0.15,0.8,0.1,0.1],'LineStyle','-','LineWidth',1,'String',str);
    hold off
%     pause(0.0001)
end

运行截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
matlab代码:

clc
clear;
%build the GUI
%define the plot button
plotbutton=uicontrol('style','pushbutton','string','Run', 'fontsize',12,'position',[100,400,50,20],'callback','run=1;');
%define the stop button
erasebutton=uicontrol('style','pushbutton','string','Stop','fontsize',12,'position',[200,400,50,20],'callback','freeze=1;');
%define the Quit button
quitbutton=uicontrol('style','pushbutton','string','Quit','fontsize',12,'position',[300,400,50,20],'callback','stop=1;close;');
number=uicontrol('style','text','string','1','fontsize',12,'position',[20,400,50,20]);
%CAsetup
n=1000; %数据初始化
z=zeros(1,n); %元胞个数
z=roadstart(z,200); %道路状态初始化,路段上随机分布200辆
cells=z;
vmax=5; %最大速度
v=speedstart(cells,vmax); %速度初始化x=1; %记录速度和车辆位置
x=1;
memor_cells=zeros(3600,n);
memor_v=zeros(3600,n);
imh=imshow(cells); %初始化图像白色有车,黑色空元胞
set(imh,'erasemode','none')
axis equal
axis tight
stop=0; %wait for a quit button push
run=0; %wait for a draw
freeze=0; %wait for a freeze (冻结)
while (stop==0 && x<1102)
if(run==1)
      %边界条件处理,搜素首末车,控制进出,使用开口条件
      a=searchleadcar(cells);
      b=searchlastcar(cells);
%       [cells,v]=border_control(cells,a,b,v,vmax);
      i=searchleadcar(cells); %搜索首车位置
      for j=1:i
      if (i-j+1==n)
      [z,v]=leadcarupdate(z,v);
            continue;
          else
      %==========================加速、减速、随机慢化
      if cells(i-j+1)==0 %判断当前位置是否非空
           continue;
      else
          v(i-j+1)=min(v(i-j+1)+1,vmax); %加速
      %=======================减速
      k=searchfrontcar((i-j+1),cells); %搜素前方首个非空元胞位置
      if(k==0) %确定与前车之间的元胞数
      d=n-(i-j+1);
      else
          d=k-(i-j+1)-1;
      end
      v(i-j+1)=min(v(i-j+1),d);%减速
      %随机慢化
      v(i-j+1)=randslow(v(i-j+1));
      new_v=v(i-j+1);
%更新车辆位置
      z(i-j+1)=0;
      z(i-j+1+new_v)=1;
      %更新速度
      v(i-j+1)=0;
      v(i-j+1+new_v)=new_v;
      end
      end
      end
      cells=z;
      memor_cells(x,:)=cells; %记录速度和车辆位置
      memor_v(x,:)=v;
      x=x+1;
      set(imh,'cdata',cells) %更新图像
      %update the step number diaplay
pause(0.0001);
stepnumber=1+str2num(get(number,'string'));
set(number,'string',num2str(stepnumber))
end
if (freeze==1)
run=0;
freeze=0;
end
drawnow
end
figure(2)
for l=1:1:200
for k=500:1:1000
if memor_cells(l,k)>0
    plot(k,l,'k.');
hold on;
end
end
end
xlabel('空间位置');
ylabel('时间(s)');
title('时空图');
      for i=1:1:500
      density(i)=sum(memor_cells(i,:)>0)/1000;
      flow(i)=sum(memor_v(i,:))/1000;
      end
      figure(3)
      plot(density,flow,'k.');
      title('流量密度图')
      xlabel('density')
      ylabel('flow')
 
 % 函数: speedstart.m程序代码      
function [v_matixcells]=speedstart(matrix_cells,vmax)
    %道路初始状态车辆速度初始化
    v_matixcells=zeros(1,length(matrix_cells));
    for i=1:length(matrix_cells)
        if matrix_cells(i)~=0
        v_matixcells(i)=round(vmax* rand(1));
        end
    end
end

%函数: searchleadcar.m程序代码
function [location_leadcar]=searchleadcar(matrix_cells)
    i=length(matrix_cells);
    for j=1:i
        if matrix_cells(i-j+1)~=0
            location_leadcar=i-j+1;
            break;
        else
            location_leadcar=0;
        end
    end
end

%函数: leadcarupdate.m程序代码
function [new_matrix_cells,new_v]=leadcarupdate(matrix_cells,v)
%第一辆车更新规则
    n=length(matrix_cells);
    if v(n)~=0
        matrix_cells(n)=0;
        v(n)=0;
    end
    new_matrix_cells=matrix_cells;
    new_v=v;
end

%函数: randslow.m程序代码
function[new_v]=randslow(v)
    p=0.3;%慢化概率
    rand('state',sum(100*clock)*rand(1));
    p_rand=rand; %产生随机概率
    if p_rand<=p
        v=max(v-1,0);
    end
    new_v=v;
end
 

%函数: roadstart.m 程序代码
function [matrix_cells_start]=roadstart(matrix_cells,n)
%道路上的车辆初始化状态,元胞矩阵随机为01, matrix_cells 初始矩阵,n初始车辆数
    k=length(matrix_cells);
    z=round(k*rand(1,n));
    for i=1:n
        j=z(i);
        if j==0
            matrix_cells(j)=0;
        else
            matrix_cells(j)=1;
        end
    end
    matrix_cells_start=matrix_cells;
end

% 函数:searchfrontcar.m 程序代码
function [location_frontcar]=searchfrontcar(current_location,matrix_cells)
    i=length(matrix_cells);
    if current_location==i
        location_frontcar=0;
    else
        for j=current_location+1:i
            if matrix_cells(j)~=0
            location_frontcar=j;
            break;
            else
            location_frontcar=0;
            end
         end
    end
end


%函数: searchlastcar.m程序代码
function [location_lastcar]=searchlastcar(matrix_cells)
%搜索尾车位置
for i=1:length(matrix_cells)
    if matrix_cells(i)~=0
        location_lastcar=i;
        break;
      else %如果路上无车,则空元胞数设定为道路长度
          location_lastcar=length(matrix_cells );
    end
end
end
  


运行结果:
在这里插入图片描述
参考文献:
[1] CSDN. MATLAB演示元胞自动机算法.
https://blog.csdn.net/qq_40287093/article/details/88095531.2019.8.3. 14:40
[2]百度文库.2014美赛NaSch模型.
https://wenku.baidu.com/view/9047de71e45c3b3567ec8b66.html.2019.8.3.14:42
[3]叶冬,樊镭.一维单车道交通流元胞自动机模型综述[J].物联网技术,2013,3(05):23-25.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

元胞自动机算法汇总含matlab代码_数学建模(十三) 的相关文章

  • Matlab 中的多行匿名函数? [复制]

    这个问题在这里已经有答案了 是否可以在 Matlab 中创建多行匿名函数 没有合适的例子在文档中 http www mathworks com help matlab matlab prog anonymous functions html
  • Matlab-如何在曲线上绘制切线

    我在 matlab 中绘制了一个图表 plot x y 我的图表有不同的斜率 我如何在每个斜率上绘制切线并计算斜率的系数 如果您没有用于绘制点的显式函数 您可以使用有限差分 http en wikipedia org wiki Finite
  • 如何在 MATLAB 中可视化球体的交集?

    似乎这个问题在一些地方被问过 包括SO https stackoverflow com questions 35130336 draws the intersecting volume of two spheres in matlab 我最
  • 在 Excel 中打印 MATLAB 图窗并调整其大小

    我在 MATLAB 中有两个带有手柄的图形hFig1 and hFig2 我想将它们打印到 Excel 中的特定单元格 单元格 E3 和 I3 并将它们重新调整为 2 英寸 x 3 英寸 我尝试过使用 AddPictures对象处理程序和使
  • Matlab:掩码/创建一个知道其原点且具有一定半径的圆形 roi

    只是一个简单的问题 我有一张图像 并且提取了某个点 特征 我知道每个帧中该点的坐标 说 x1 和 y1 我需要一个圆形 ROI 形式 该点在图像上具有我选择的半径 我尝试了 impoly 和 roipoly 当我知道图像中的要点时 不知道如
  • matlab mex 文件和 C++ dll (Windows)

    我有一个带有 Test 类的 DLL 标题 class MY EXPORT Test public int doit const string str 和来源 int Test doit const string str return in
  • MATLAB中如何画水平线和垂直线?

    我目前正在尝试在 MATLAB 中绘制简单的垂直线和水平线 例如 我想绘制线 y 245 我该怎么做呢 MATLAB 根据您提供的向量逐点进行绘图 因此 要创建一条水平线 您需要改变x同时保持y对于垂直线恒定 反之亦然 xh 0 10 yh
  • MATLAB 中时间戳过滤器的优化 - 处理非常大的数据集

    我正在 MATLAB 中编写一个程序 必须使用 MATLAB 并且不能真正使用 MEX 来过滤大量数据 我需要实现的过滤器之一要求我将时间戳向量与其他时间戳不会出现的已知 不良 时间列表进行比较 一个典型的时间戳向量有大约 2 000 00
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • 不等间隔时间序列的移动平均线

    我有一个证券交易所股票价格的数据集 时间 价格 但数据点之间的间隔并不相等 从 1 到 2 分钟不等 在这种情况下计算移动平均值的最佳实践是什么 如何在Matlab中实现呢 我倾向于认为 点的权重应该取决于自上一个点以来的最后时间间隔 Ma
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 黑白随机着色的六角格子

    我正在尝试绘制一个 10 000 x 10 000 随机半黑半白的六边形格子 我不知道如何将该格子的六边形随机填充为黑色和白色 这是我真正想要从这段代码中得到的示例 但我无法做到 https i stack imgur com RkdCw
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列

随机推荐

  • onlyoffice报 error self signed certificate导致download failed错误处理

    安装nextcloud onlyoffice 打开onlyoffice报错 进入容器看out log报错信息 root nextcloud docker ps a Emulate Docker CLI using podman Create
  • HTTP请求详解

    HTTP概念 HTTP全称是HyperText Transfer Protocal 即超文本传输协议 是应用层协议 当你上网浏览网页的时候 浏览器和web服务器之间就会通过HTTP在Internet上进行数据的发送和接收 HTTP是一个基于
  • PHP 两个二维数组求不同

    public function arrcha arr1 0 id gt 1 name gt name arr1 1 id gt 2 name gt name2 arr1 2 id gt 3 name gt name3 arr1 3 id g
  • JNI入门基础

    环境安装 想要使用jni进行ndk开发 我们首先要安装下面这些工具 否则直接从入门到放弃 下载ndk支持 在Android studio中下载上图中框选的两个工具 版本号自己任意选一个 下载完成之后 Android Studio就拥有了进行
  • 类模板函数特化(专用化)specialization of …… after instantiation

    http stackoverflow com questions 7774188 explicit specialization after instantiation http blog csdn net xcysuccess3 arti
  • [ASP.NET MVC 小牛之路]05 - 使用 Ninject

    在 ASP NET MVC 小牛之路 系列上一篇文章 依赖注入 DI 和Ninject 的末尾提到了在ASP NET MVC中使用Ninject要做的两件事情 续这篇文章之后 本文将用一个实际的示例来演示Ninject在ASP NET MV
  • Spring Boot框架

    目录 一 Spring Boot 1 Spring Boot优点 2 创建Spring Boot 3 Spring Boot配置文件 1 配置文件的作用 2 properties文件格式 3 yml文件的格式 4 properties vs
  • 程序员升职记 全关卡攻略&通俗思路 Human Resource Machine

    程序员升职记 全过关方法 通俗思路 博主本着能过就过的思想 写出的解答必然不是最优解 但是可以给大家提供一点思路来参考 其中17和22的解答整理自网络 特别是17的解答 要比博主的原解答巧妙不少 1 收发室 模拟程序输入输出 HUMAN R
  • 深度学习大模型训练--分布式 deepspeed PipeLine Parallelism 源码解析

    deepspeed PipeLine Parallelism 源码解析 basic concept PipeDream abstract 1F1B 4 steps Code comprehension in deepspeed prepar
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • powervm虚拟化分析

    powervm是IBM推出的适用于power系列服务器的虚拟化技术 有其独特的功能和技术 本文和大家一起探讨一下 首先power是ibm处理器的名字 也常常用来标识ibm服务器的型号 常见的power7 power8小型机就是指期cpu是p
  • 启锐 588 打印机每次打印都流出一部分,没有重新切换纸张

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 588 488识别纸张 一 打印机关机 数据线拔掉 二 把纸拿出来 开机之后盖上盖子 三 然后把纸从机器后面塞进去让机器自动吸纸 四 然后长按打印机上面蓝色的按键 听到滴的
  • Java基础之随机生成数字和字母

    原文地址 http blog csdn net yaodong y article details 8115250 字母与数字的ASCII码 目 前计算机中用得最广泛的 字符集及其编码 是由美国国家标准局 ANSI 制定的ASCII码 Am
  • OpenGL视图变换及gluLookAt

    视图变换 即相机变换 其作用是把相机放在指定位置并使其对准场景 该变换是针对相机的变换 不会影响到模型 视图变换决定了相机的位置与方向 因此可以通过视图变换来改变相机位置与方向 从而达到从各个不同的位置与角度来观察同一个物体的情形 进行视图
  • SHAP显示原始特征

    1 问题描述 SHAP用于特征解释 对于机器学习方法往往需要对原始特征进行编码 而SHAP在绘制单个样本时 会显示每个特征及其取值 而这个取值已经是编码后的 通常无法确定其含义 如 下图所示的拍卖公司 城市和作者信息 预期达到的效果 2 实
  • 【西瓜书】4-决策树

    文章目录 4 1 基本流程 4 2 划分 4 2 1 信息增益 ID3 4 2 2 信息增益率 C 45 4 2 3 基尼指数 CART 4 3 剪枝处理 4 4 连续与缺失值 4 4 2 连续值处理 4 4 1 缺失值处理 4 5 多变量
  • Anchor是什么?

    1 选择性搜索 Selective Search 先介绍一下传统的人脸识别算法 是怎么检测出图片中的人脸的 以下图为例 如果我们要检测图中小女孩的人脸位置 一个比较简单暴力的方法就是滑窗 我们使用不同大小 不同长宽比的候选框在整幅图像上进行
  • crmeb重新安装_手动安装教程 · CRMEB 知识付费版 帮助文档 · 看云

    手动安装 1 创建数据库 倒入数据库文件 数据库文件目录 public install zhishifufei sql 2 修改数据库连接文件 配置文件路径 application database php 数据库类型 type gt my
  • vagrant启动openshift

    1 Install Vagrant 2 Install VirtualBox Ex yum install VirtualBox from the RPM Fusion repository 3 In your bashrc file or
  • 元胞自动机算法汇总含matlab代码_数学建模(十三)

    元胞自动机理论 许多复杂的问题都可以通过元胞自动机来建立模型 元胞自动机实质上是定义在一个具有离散 有限状态的元胞组成的元胞空间上 并按照一定的局部规则 在离散的时间维度上演化的动力学系统 元胞又可称为单元 细胞 是元胞自动机的最基本的组成