【数学建模】元胞自动机初识

A 元胞自动机要点

1元胞
元胞可称为单元或基元,是元胞自动机最基本的部分
例子:
在这里插入图片描述
每一个小块就是一个元胞,每个元胞都有一个状态(如生或死,有或无…,不同的状态在编程中用不同的数字表示)
元胞状态变化:

变化前:只有第六个元胞有虫子 在这里插入图片描述
变化后:只有第五个元胞有虫子 在这里插入图片描述

元胞可以是任意形状。如:
在这里插入图片描述

2 元胞空间
红框内就是一个元胞空间,红框内的元胞与外界之间互不影响。
在这里插入图片描述
3邻居
常用两个邻居模型:
在这里插入图片描述

也可以自己定义:
在这里插入图片描述
元胞下一时刻的状态决定于本身状态和它邻居元胞的状态。

4规则
元胞自动机根据进行局部元胞间的相互作用而引起全局变化。

B 例子

1 生命游戏
(1)元胞:每个元胞有生与死两个状态
(2)元胞空间:
在这里插入图片描述
(3)邻居:
在这里插入图片描述
(4)规则:如果一个元胞周围有3个元胞为生(一个元胞周围共有8个元胞),则该元胞为生(即该元胞若原先为死,则转为生,若原先为生,则保持不变。)
在这里插入图片描述
如果要给元胞周围有两个元胞为生,则该元胞的生死状态不变。

在这里插入图片描述
在这里插入图片描述

在其他情况下,该元胞为死(即该元胞若原先为生,则转为死,若原先为死,则保持不变)。
代码:

%function  ca 
m=50;n=50;p=.7;h=100;    %  定义初始变量
for x=1:m
    for y=1:n 
        r=rand(1);       %  生成一个随机数
        if r>p           % 判断一下
           a(x,y)=1;     % 要是小了就是1  就是“生”
        else a(x,y)=0; 
        end
    end
end      %这个是定义初始的状态

for x=1:m 
    for y=1:n 
        if a(x,y)==1   % 这就是在全局去寻找的为1的元胞了
            fx=[x-1,x-1,x,x];fy=[y-1,y,y,y-1];fill(fx,fy,'y'),hold on    % 这两个在一起拼接就是一个冯罗伊曼的邻居模型了
        end
    end
end 


for k=1:h 
    fx=[0,m,m,0];fy=[0,0,n,n];fill(fx,fy,'k'),hold on   
    for x=2:m-1 
        for y=2:n-1 
            b(x,y)=a(x-1,y-1)+a(x-1,y)+a(x-1,y+1)+a(x,y-1)+a(x,y+1)+a(x+1,y-1)+a(x+1,y)+a(x+1,y+1); % 这个是把找出了8个位置的元胞
            if b(x,y)==2,c(x,y)=a(x,y);    % 如果满足条件的话 就把元胞a的值赋给c 。而c同样也是
            elseif b(x,y)==3,c(x,y)=1;     % 如果满足条件的话 就把c的值赋值为 1 
            else c(x,y)=0; 
            end
        end
    end
    c(1:m,1)=a(1:m,1);c(1:m,n)=a(1:m,n);   % 
    for x=1:m 
        for y=1:n 
            if c(x,y)==1 
                fx=[x-1,x-1,x,x];fy=[y-1,y,y,y-1];fill(fx,fy,'y'),hold on 
            else 
            end
        end
    end
pause(2) 
 a=c;    %   最后把c 的值赋给a 然后在重新回去在去循环  再次进行整体的变化,。。
end 

猜你喜欢

转载自blog.csdn.net/weixin_44378835/article/details/107494531
今日推荐