一个一个的格子看做是一个个的元胞,他们按照自己的规则自动进行状态改变就是元胞自动机。
定义:是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。
元胞自动机由元胞、元胞空间、元胞邻居、元胞规则组成。
元胞可以称为单元或基元,是元胞自动机最基本的部分。每个元胞有一个状态,比如说将元胞看做人,拥有生和死两种状态,元胞的状态按照规则不断进行更新。元胞空间就是元胞在空间分布撒上的集合,元胞空间的类型根据其形状命名。
用的最多的还是正方形,因为代码实现简单。
邻居:某一元状态更新时所要搜索的空间域。也就是能够影响该元胞的其他元胞,如果不能产生影响就不是邻居。
常见的有这三种邻居类型,橙色的为绿色的邻居。
边界条件:理论上,元胞空间是无限的,实际应用中无法达到这一理想条件,为了让元胞空间边界上的元胞拥有规则所需要的邻居,就需要构造出一些虚拟的邻居,构造的过程就用到了边界条件。常用的邻居边界条件类型有:固定型、周期型、绝热型、映射型。
固定型:边界元胞的数值想给多少就给多少。下图中令左下角3的左邻居为2。
周期型:相当于首位相连。第一个做最后一个的邻居。
绝热型:自己是多少,邻居就是多少。
映射型:将数据对称过去。比如下图将左下角的3右邻居映射到左边。
规则:根据元胞当前状态及邻居的状态来决定下一时刻该元胞状态。元胞自动机根据规则进行局部元胞间的相互作用从而引起全局的变化。
元胞特征:①离散型:空间、时间(隔一段时间检查一遍状态)、状态都是离散的。②同质性:服从相同的规律,分布方式也是相同的。③并行性:元胞的状态更新规则变化是同步进行的。④高纬度:元胞自动机可以有很多维。
初等元胞自动机:一维元胞自动机的元胞邻居半径为1,元胞有且只有两种状态(只有0和1)。因此一个元胞加上其邻居状态就有了8种状态:
根据不同的变化规则,每种情况的中心元胞都会变成0或者1,即有两种情况。
代码应用到的函数:
imagesc(C)
将数组C
中的数据显示为一个图像,该图像使用颜色图中的全部颜色。C
的每个元素指定图像的一个像素的颜色。生成的图像是一个m
×n
像素网格,其中m
和n
分别是C
中的行数和列数。这些元素的行索引和列索引确定了对应像素的中心axis square;产生正方形的坐标系
matlab中set语句用于给某对象的属性进行赋值。具体到set(A,'CData',B): A代表一个对象,'CData'是对象A的其中一个属性,B是准备赋给'CData'的值
A([5,1:4],:)将A的第5行、第1到4行的所有列按顺序组合成一个新的数组,相当于将第5行放在第一行
C = cat(dim,A,B)
沿维度dim
将B
串联到A
的末尾。drawnow用于刷新屏幕
image是最基本的图像显示函数。在MATLAB中用到的所有显示图像的函数都显式或者不显式地调用了这个函数。
imagesc是把图像矩阵中的值缩放到一个它认为合适的范围再使用image。这样使得图像矩阵中的值过小/过大/过集中时,仍然可以看到一个视觉效果还可以的图像。而对这样的矩阵直接用image则不行。
实例:
一、 奇偶规则:元胞只有两种状态(0和1),冯诺依曼型邻居之和为奇数,则中心元胞变为1,若邻居之和为偶数,则中心元胞变为0。
clc,clear
n = 200;
Se = zeros(n);
Se(1:4,1:4) = 1;
Ch = imagesc(Se);%可视化
axis square;
Sd = zeros(n+2);
while(1)
Sd(2:n+1,2:n+1) = Se;%相当于给Se矩阵加了一个全0边框,变为Sd
sum = 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(sum,2);%满足变换规则
set(Ch,'cdata',Se);
pause(0.03);
end
二、森林火灾:元胞有三种状态(树、火、空地),树变为火有两种情况(冯诺依曼型邻居有一个是火,则中心元胞为火,或者被闪电击中变为火),火一段时间后会变为空地,空地有一定几率长出树。
clc,clear
n = 300;%定义森林的大小
Plight = 5e-6;Pgrowth = 1e-2;%定义闪电和生长的概率
UL = [n,1:n-1];%用来实现左和上邻居
DR = [2:n,1];%用来实现右和下邻居
veg = zeros(n);%初始化森林的矩阵
imh = image(cat(3,veg,veg,veg));%可视化森林,cat用以改变颜色
%veg 空地时为0.着火为1,树为2
while(1)
sum = (veg(UL,:)==1)+(veg(:,UL)==1)+(veg(:,DR)==1)+(veg(DR,:)==1);%判断中心元胞周围是否有着火
veg = 2*(veg==2) - ((veg==2)&(sum>0 | (rand(n)
ps:cat将不同颜色层叠加,产生新的颜色。