元胞自动机及其MATLAB实例

元胞自动机及其实例

目录

  • 元胞自动机及其实例
    • 一、什么是元胞自动机
    • 二、 元胞自动机的基础简介
    • 三、边界条件
    • 四、特征
    • 五、实例
      • 5.1 奇偶规则
      • 5.2 森林大火

一、什么是元胞自动机

元胞自动机(Cellular Automata,简称CA,也有人译为细胞自动机、点格自动机、分子自动机或单元口动机)。是一时间和空间都离散的动力系统。

二、 元胞自动机的基础简介

  • 由元胞、元胞空间、元胞邻居、元胞规则四部分组成。
  • 元胞可分为多种类型,最常见的为正方形,可根据实际需要设定,选择正方形是因为正方形方便编程处理。
  • 元胞空间就是所有元胞构成的空间。
  • 元胞邻居即元胞周围的元胞,通常分为三种:冯·诺伊曼型(上下左右成为邻居)、Moor型、扩展Moor型。
  • 元胞自动机及其MATLAB实例_第1张图片

三、边界条件

  • 理论上是元胞空间是无限大,但是实际上处理时只可能做到有限。
  • 一般有四种边界:固定型边界(随便给啥都行的那种),周期型边界(相当于第一行的上边界就是最后一行),绝热性边界(边界就是自己旁边那个数字),映射型边界(就把最边上的当成对称轴)

四、特征

  1. 离散性:定义及其本质。
  2. 同质性:服从相同的规律分布。
  3. 并行性:更新同步进行。
  4. 高维性:可以是无穷维动力系统。

五、实例

5.1 奇偶规则

游戏规则如下:
元胞自动机及其MATLAB实例_第2张图片
规则很简单,我们进行元胞自动机模拟时,需给出初始状态。很明显元胞状态只有0和1。我们可以给它一个随机位置一个初始的1,观察状况如下:

clc,clear;
%% 定义元胞空间大小并初始化矩阵
n=100;
pic_num = 1;
Se=zeros(n);
% 随机位置置1
%也可多位置
%for i=1:10
    Se(randi([1,n],1,1),randi([1,n],1,1))=1;
%end
Ch=imagesc(Se);%绘图对象
axis square %弄成方形
axis off 
Se_plus=zeros(n+2);
%% 规则
for t=1:500
    Se_plus(2:n+1,2:n+1)=Se;%将中间部分变成实际的元胞空间
    rule=Se_plus(1:n,2:n+1)+Se_plus(3:n+2,2:n+1)+Se_plus(2:n+1,1:n)+Se_plus(2:n+1,3:n+2)
    Se=mod(rule,2);
    set(Ch,'cdata',Se)
    drawnow
    F=getframe(gcf);
   I=frame2im(F);
   [I,map]=rgb2ind(I,256);
   if pic_num == 1
        imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.2);
   else
        imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);
   end
    pic_num = pic_num + 1;
end


5.2 森林大火

基础的森林大火元胞自动机模型为:元胞状态有三种分别为0(空地),1(火),2(树)。

  • 当元胞状态为树时,冯诺依曼型邻居若有火,则变为火。
  • 空地不能发生火灾。
  • 火烧过后,元胞状态变为空地
  • 空地有一定小概率变为树
  • 树有有一定概率由于闪电等自然现象着火。

根据学习的奇偶规则写代码的方法尝试写一下基础森林大火的元胞自动机吧。
附上作者使用的参数:

参数
空地长出树的概率 5 × 1 0 − 3 5\times10^{-3} 5×103
元胞空间大小 300 × 300 300\times300 300×300
树由于自然条件着火概率 5 × 1 0 − 6 5\times10^{-6} 5×106


提示:注意并行性,不要用循环一个一个改动元胞空间里的元胞状态,会造成前面的改动影响了后面的运行,要么采用给个临时变量改动,以原本的元胞空间的状态为依据改动。建议利用矩阵运算的优势进行并行改动

你可能感兴趣的:(matlab,算法,概率论)