元胞自动机
定义:是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。
应用:社会学: 元胞自动机经常用于研究个人行为的社会性, 流行 现象. 例如人口迁移, 公共场所内人员的疏散, 流行病传播。
图形学: 元胞自动机以其特有的结构的简单性, 内在的并行 性以及复杂计算的能力成为密码学中研究的热点方向之一。物理学:
在物理学中, 元胞自动机已成功的应用于流体, 磁 场, 电场, 热传导等的模拟
组成:元胞,元胞空间,元胞邻居,元胞边界,规则。
冯诺依曼邻居(4邻居) 摩尔型邻居(8邻居型)
元胞规则:根据元胞当前状态及邻居状态决定下一时刻该元胞状态。演化规则是元胞自动机的灵魂所在(最重要!!!)。
为什么设置元胞边界? 元胞自动机对每个元胞施加同样的规则,因此需要设置边界条件,使边界上的细胞与其他细胞具有相同的邻居数目
cat 是把RGB三通道结合在一起(合并矩阵)最后成为一个真彩图像
drawnow 更新图窗
clc;clear;close; % 清除命令窗口,清除工作空间变量,关闭所有图形窗口
n=200; % 定义网格大小
z=zeros(n); % 创建一个全零矩阵
p=0.4; % 定义生存概率
se=rand(n)<0.4; % 创建一个随机矩阵,小于0.4的元素为1,大于0.4的元素为0,表示初始生命分布
sd=zeros(n+2); % 创建一个比原始网格大的矩阵,用于计算邻居
imagesc(cat(3,se,z,z)); % 显示初始生命分布
while 1>0 % 无限循环,直到用户停止
sd(2:n+1,2:n+1)=se; % 将生命分布复制到大矩阵中
sum=sd(1:n,2:n+1)+sd(1:n,1:n)+sd(1:n,3:n+2)+sd(3:n+2,2:n+1)+sd(3:n+2,1:n)+sd(3:n+2,3:n+2)+sd(2:n+1,1:n)+sd(2:n+1,3:n+2); % 计算每个单元格的邻居数量
for i=1:n
for j=1:n
if sum(i,j)==3||sum(i,j)==2 % 如果一个单元格有2个或3个邻居,那么它在下一代中将是“生”的
se(i,j)=1;
else % 否则,它在下一代中将是“死”的
se(i,j)=0;
end
end
end
imagesc(cat(3,se,z,z)); % 显示新的生命分布
drawnow; % 更新图形窗口
end
clc;clear;close;
n=300;
p_light=5e-6;
p_grow=1e-2;
UL=[n,1:n-1];
DR=[2:n,1];
veg=zeros(n);
imh=image(cat(3,veg,veg,veg));
for i = 1:3000
sum=(veg(UL,:)==1)+(veg(DR,:)==1)+(veg(:,UL)==1)+(veg(:,DR)==1);
veg=2*(veg==2)-((veg==2)&(sum>0|p_light>rand(n)))+2*((veg==0)&(p_grow>rand(n)))
set(imh,'cdata',cat(3,(veg==1),(veg==2),zeros(n)));
drawnow;
end