元胞自动机代码超通俗解释(MATLAB)

clc;clear;
%元胞自动机(奇偶规则)
n=200;%指定边界(大正方形)长度
Se=zeros(n);%想象成一个正方形,里面有很多小格子
Se(n/2-2:n/2,n/2-2:n/2+2)=1;
%初始化中间的点,这里是行为98~102,列为98~102的5X5正方形
Ch=imagesc(Se);
%可视化元胞自动机,doc imagesc查看使用规则(使用缩放颜色显示图像)
axis square
%axis设置坐标轴范围和纵横比;square使用相同长度的坐标轴线。相应调整数据单位之间的增量
Sd=zeros(n+2);%边界上留出2格不让改变,目的在计算邻居时防止超出索引报错
%Sd单纯为了方便计算邻居用的,元胞状态是看Se
while(true)  %一直循环,目的是一直重复整个元胞自动机蔓延过程
    Sd(2:n+1,2:n+1)=Se;%Sd中行2~201与列2~201是Se的范围200X200
    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);
    %假设中心点为(a,a),因此它的邻居就是(a-1,a),(a+1,a),(a,a-1),(a,a+1),相加求和即邻居之和
    %最终sumValue矩阵每个点的值都是它的邻居之和(元胞自动机的重点,确定邻居)
    Se=mod(sumValue,2);%执行元胞状态改变规则,Se里面的值只有0和1
    %mod取余,若邻居之和为偶数,则余数为0,若邻居之和为奇数,则余数为1,刚好满足元胞状态改变规则
    set(Ch,"cdata",Se)
    %set设置图形对象属性
    pause(0.03)%暂停执行程序0.03s后继续执行,为了可视化不断重复元胞状态改变的过程
end

运行结果:

 

 

clc;clear;
%元胞自动机(生命游戏0代表死,1代表生)
n=200;%指定边界(大正方形)
p=0.4;%每个小格子为0或1的概率
Se=rand(n)<p;%设置初始的元胞状态,返回的是逻辑值0或1
Sd=zeros(n+2);%边界上留出2格不让改变,目的在计算邻居时防止超出索引报错
%Sd单纯为了方便计算邻居用的,元胞状态是看Se
Ph=imagesc(Se);
%可视化元胞自动机,doc imagesc查看使用规则(使用缩放颜色显示图像)
while(true)   %一直循环,目的是一直重复整个元胞自动机蔓延过程
    Sd(2:n+1,2:n+1)=Se;%Sd中行2~201与列2~201是Se的范围200X200(被替换)
    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);
    %假设中心点为(a,a),因此它的邻居就是(a-1,a-1),(a-1,a),(a-1,a+1),(a,a-1),(a,a+1),(a+1,a-1),(a+1,a),(a+1,a+1)相加求和即邻居之和
    %最终sumValue矩阵每个点的值都是它的邻居之和(元胞自动机的重点,确定邻居)
    for i =1:n %因为sumValue是200X200的矩阵
        for j=1:n
             if sumValue(i,j)==3||(sumValue(i,j)==2&&Se(i,j)==1)
             %为生(1)的情况有2个,
             % 1、无论是什么格子,只要邻居有3个生即变为生
             %2、对于是生的格子,只要邻居有2个生即可继续保持生
                 Se(i,j)=1;
             else %其它任何情况格子都是死
                 Se(i,j)=0;
             end
        end
    end
    set(Ph,"cdata",Se);
    %set设置图形对象属性
    pause(0.05);%暂停执行程序0.05s后继续执行,为了可视化不断重复元胞状态改变的过程
end

运行结果:

 

 

 

clc;clear;
%元胞自动机(山火蔓延)
%0代表空地,1代表火,2代表树
n=200;%表示森林的矩阵大小
k=30000;%总迭代次数
P0=0.8;%火变成空地的概率
Plight=5*10^(-6);Pgrowth=10^(-3);%闪电和树生长的概率
P1=0.7;%旁边有树,树着火的概率
veg=zeros(n,n)+2;%初始化森林的矩阵,刚开始全为树
imh=image(cat(3,veg,veg,veg));%可视化表示森林的矩阵
%image从数组显示图像;cat串联数组。cat(3,veg,veg,veg)为一个200X200X3的数组
%三维数组可以看成是3片矩阵叠在一起,共3层
Sd=zeros(n+2);%边界上留出2格不让改变,目的在计算邻居时防止超出索引报错
%Sd单纯为了方便计算邻居用的,元胞状态是看veg
for i=1:k
    Sd(2:n+1,2:n+1)=veg;%Sd中行2~201与列2~201是veg的范围200X200(被替换)
    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);
    %Sd(1:n,2:n+1)==1是判断,返回逻辑值,如果是火即返回1,如果不是火即返回0
    %所以当sumValue>0时,说明邻居至少有一个是火,反之,则邻居没有火
    for p=1:n
        for q=1:n   %因为sumValue是200X200的矩阵
            if veg(p,q)==2&&((sumValue(p,q)>0&&rand()<P1)||rand()<Plight)
                %让方格着火的情况有:
                %1、闪电即rand()<Plight,闪电不需要有树就可以着火
                %2、当方格为树时即veg(p,q)==2,且邻居是火才有概率着火即sumValue(p,q)>0&&rand()<P1
                veg(p,q)=1;
            elseif veg(p,q)==1&&rand()<P0
                %让方格变为空地的情况有
                %在方格是火的前提下,才能有概率的变为空地
                veg(p,q)=0;
            elseif veg(p,q)==0&&sumValue(p,q)==0&&rand()<Pgrowth
                %让方格变为树的情况有
                %在方格是空地的前提下,且周围没有火,才有概率的变成树,要同时满足这3个条件
                veg(p,q)=2;
            end
        end
    end
    set(imh,"cdata",cat(3,(veg==1),(veg==2),zeros(n)));
    %set设置图形对象属性,给不同状态方格上不同颜色,方便区分以及观察变化
    drawnow%更新图窗并处理回调
end

运行结果:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PlatinumA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值