元胞自动机(CA)及Matlab代码实现

目录

1. 元胞自动机基础概念:       

1.1 构成

1.2 常用的邻居边界条件类型

2.  MATLAB代码实现:

2.1 奇偶规则

2.2 澳洲火灾


1. 元胞自动机基础概念:       

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

1.1 构成

        元胞自动机由元胞元胞空间元胞邻居元胞规则四部分组成。

  •  元胞: 就是一个单元或者基元,是元胞自动机最基本的部分
  • 元胞空间:就是元胞在空间分布上的集合
  • 邻居:某一元胞状态更新时所要搜索的空间区域就是该元胞的邻居
  • 边界条件:考虑了元胞空间边界上的元胞在元胞空间不是无限的情况下拥有规则所需要的邻居,就需要构造出一些虚拟的邻居
  • 规则: 根据元胞当前状态及邻居的状态来决定下一时刻该元胞的状态。元胞自动机根据规则进行局部元胞间的相互作用从而引起全局的变化。

1.2 常用的邻居边界条件类型

        固定型,周期型,绝热型和映射型四种类型。

固定型:固定给某一个数值,没有规则来确定。

                例如图中左下角这个3没有左邻居和下邻居,所以我们任意给值作为其邻居的值

周期型:

                左上角的3放置最下侧作为3的下邻居 右下角的5放置左下角作为3的左邻居

绝热型:

                将缺少邻居的中心元胞的值赋给邻居

                

 映射型:

                由中心元胞相邻的邻居进行赋值,类似于跳棋

                

2.  MATLAB代码实现:

2.1 奇偶规则

%%奇偶规则游戏
clear;clc;

%指定边界长度
n = 200;
Se = zeros(n);
z = zeros(n);

%将中间5*5=25个点初始化为1
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;
    %4邻居型计算通用式 进行邻居数值求和 
    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.2 澳洲火灾

规则:

(1)树————>火

  • 邻居着火,该树有一定概率着火
  • 树一定概率受雷劈着火

(2)火————>空地

  • 着火的地方有一定概率变为空地

(3)空地————>树

  • 空地有一定概率变成树
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;
    %8邻居通用表达式 判断邻居是否着火
    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代码实现_WSKH0929的博客-CSDN博客_matlab元胞自动机

猜你喜欢

转载自blog.csdn.net/qq_54543084/article/details/128298116