【数学建模】元胞自动机(CA)详解 + Matlab代码实现

文章目录

  • 一、什么是元胞自动机?
  • 二、图解元胞自动机:
  • 三、案例+Matlab代码实现:
    • 1.奇偶规则
    • 2.生命游戏
    • 3.森林火灾


一、什么是元胞自动机?

元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。

元胞自动机的构建没有固定的数学公式,构成方式繁杂,变种很多,行为复杂。故其分类难度也较大,自元胞自动机产生以来,对于元胞自动机分类的研究就是元胞自动机的一个重要的研究课题和核心理论,在基于不同的出发点,元胞自动机可有多种分类,其中,最具影响力的当属S. Wolfram在80年代初做的基于动力学行为的元胞自动机分类,而基于维数的元胞自动机分类也是最简单和最常用的划分。除此之外,在1990年,Howard A.Gutowitz提出了基于元胞自动机行为的马尔科夫概率量测的层次化、参量化的分类体系(Gutowitz,H. A.,1990)。下面就上述的前两种分类作进一步的介绍。同时就几种特殊类型的元胞自动机进行介绍和探讨S. Wolfrarm在详细分析研究了一维元胞自动机的演化行为,并在大量的计算机实验的基础上,将所有元胞自动机的动力学行为归纳为四大类(Wolfram. S.,1986):

  • ⑴平稳型:自任何初始状态开始,经过一定时间运行后,元胞空间趋于一个空间平稳的构形,这里空间平稳即指每一个元胞处于固定状态。不随时间变化而变化。
  • ⑵周期型:经过一定时间运行后,元胞空间趋于一系列简单的固定结构(Stable Patterns)或周期结构(Perlodical Patterns)。由于这些结构可看作是一种滤波器(Filter),故可应用到图像处理的研究中。
  • ⑶混沌型:自任何初始状态开始,经过一定时间运行后,元胞自动机表现出混沌的非周期行为,所生成的结构的统计特征不再变止,通常表现为分形分维特征。
  • ⑷复杂型:出现复杂的局部结构,或者说是局部的混沌,其中有些会不断地传播。
    【数学建模】元胞自动机(CA)详解 + Matlab代码实现_第1张图片

二、图解元胞自动机:

图片来源于连大数学建模


三、案例+Matlab代码实现:

1.奇偶规则

【数学建模】元胞自动机(CA)详解 + Matlab代码实现_第2张图片
matlab代码:

%%奇偶规则游戏
clear;clc;
n = 200;%指定边界长度
Se = zeros(n);
z = zeros(n);
Se(n/2-2:n/2+2,n/2-2:n/2+2)=1;  %初始化中间的点
Ch = imagesc(Se);
axis square;
Sd = zeros(n+2);  %边界
while(true) %死循环
    Sd(2:n+1,2:n+1) = Se;
    sumValue = Sd(1:n,2:n+1)+Sd(3:n+2,2:n+1)+Sd(2:n+1,1:n)+Sd(2:n+1,3:n+2);
    Se = mod(sumValue,2);
    set(Ch,'cdata',Se);
    pause(0.03)
end

运行效果:

2.生命游戏

【数学建模】元胞自动机(CA)详解 + Matlab代码实现_第3张图片
matlab代码:

clear;clc;
%%生命游戏
n = 200;
p = 0.4;
z = zeros(n);
Se = rand(n)<p;
Sd = zeros(n+2);
Ph = imagesc(Se);
while(true)
    Sd(2:n+1,2:n+1)=Se;
    sumValue = Sd(1:n,1:n)+Sd(1:n,2:n+1)+Sd(1:n,3:n+2)+Sd(2:n+1,1:n)+Sd(2:n+1,3:n+2)+Sd(3:n+2,1:n)+Sd(3:n+2,2:n+1)+Sd(3:n+2,3:n+2);
    for i=1:n
        for j=1:n
            if(sumValue(i,j)==3||(sumValue(i,j)==2&&Se(i,j)==1))
                Se(i,j) = 1;
            else
                Se(i,j) = 0;
            end
        end
    end
    set(Ph,'cdata',Se);
    pause(0.05);
end

运行效果:

3.森林火灾

【数学建模】元胞自动机(CA)详解 + Matlab代码实现_第4张图片
matlab代码:

clear;clc;
%火灾
n = 300;                           % 定义表示森林的矩阵大小
k = 30000;                         % 迭代次数
Pground = 0.8;                     % 从着火变成空地的概率
Plight = 5e-6; Pgrowth = 1e-3;      % 定义闪电和生长的概率  
P2=0.7; %旁边有火,树着火的概率
UL = [n,1:n-1]; DR = [2:n,1];      % 定义上左,下右邻居
veg=zeros(n,n)+2;                    % 初始化表示森林的矩阵
imh = image(cat(3,veg,veg,veg));   % 可视化表示森林的矩阵
Sd = zeros(n+2);                 %边界
% veg = 空地为0 着火为1 树木为2
for i=1:k
    Sd(2:n+1,2:n+1) = veg;
    sumValue = (Sd(1:n,2:n+1)==1)+(Sd(2:n+1,1:n)==1)+(Sd(2:n+1,3:n+2)==1)+(Sd(3:n+2,2:n+1)==1);
    for p=1:n
        for q=1:n
            if(veg(p,q)==2 && ((sumValue(p,q)>0 && rand()<P2)||rand()<Plight))
                %首先要是树,而且需要邻居有火,就会一定概率着火;或者被雷劈了,就会直接着火
                veg(p,q)=1;
            elseif(veg(p,q)==1&&rand()<Pground)
                %如果是火且满足概率,则变为空地
                veg(p,q) = 0;
            elseif(veg(p,q)==0&&sumValue(p,q)==0&&rand()<Pgrowth)
                %如果是空地,且周围没有火,那么以一定概率长成树
                veg(p,q) = 2;
            end
        end
    end
    set(imh, 'cdata', cat(3,(veg==1),(veg==2),zeros(n)))
    drawnow  
end

运行效果:
【数学建模】元胞自动机(CA)详解 + Matlab代码实现_第5张图片


你可能感兴趣的:(数学建模,元胞自动机,matlab,数学建模,蒙特卡罗模拟,算法)