一、什么是元胞自动机?
元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。
元胞自动机的构建没有固定的数学公式,构成方式繁杂,变种很多,行为复杂。故其分类难度也较大,自元胞自动机产生以来,对于元胞自动机分类的研究就是元胞自动机的一个重要的研究课题和核心理论,在基于不同的出发点,元胞自动机可有多种分类,其中,最具影响力的当属S. Wolfram在80年代初做的基于动力学行为的元胞自动机分类,而基于维数的元胞自动机分类也是最简单和最常用的划分。除此之外,在1990年,Howard A.Gutowitz提出了基于元胞自动机行为的马尔科夫概率量测的层次化、参量化的分类体系(Gutowitz,H. A.,1990)。下面就上述的前两种分类作进一步的介绍。同时就几种特殊类型的元胞自动机进行介绍和探讨S. Wolfrarm在详细分析研究了一维元胞自动机的演化行为,并在大量的计算机实验的基础上,将所有元胞自动机的动力学行为归纳为四大类(Wolfram. S.,1986):
- ⑴平稳型:自任何初始状态开始,经过一定时间运行后,元胞空间趋于一个空间平稳的构形,这里空间平稳即指每一个元胞处于固定状态。不随时间变化而变化。
- ⑵周期型:经过一定时间运行后,元胞空间趋于一系列简单的固定结构(Stable Patterns)或周期结构(Perlodical Patterns)。由于这些结构可看作是一种滤波器(Filter),故可应用到图像处理的研究中。
- ⑶混沌型:自任何初始状态开始,经过一定时间运行后,元胞自动机表现出混沌的非周期行为,所生成的结构的统计特征不再变止,通常表现为分形分维特征。
- ⑷复杂型:出现复杂的局部结构,或者说是局部的混沌,其中有些会不断地传播。
二、图解元胞自动机:
图片来源于连大数学建模
三、案例+Matlab代码实现:
1.奇偶规则
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.生命游戏
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.森林火灾
matlab代码:文章来源:https://www.toymoban.com/news/detail-502198.html
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
运行效果:
文章来源地址https://www.toymoban.com/news/detail-502198.html
到了这里,关于【数学建模】元胞自动机(CA)详解 + Matlab代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!