美文网首页
酱汁 | 元胞自动机(数学建模算法)

酱汁 | 元胞自动机(数学建模算法)

作者: 原来是酱呀 | 来源:发表于2019-03-31 10:48 被阅读0次

    二维元胞自动机

    邻域

    两种类型邻域

    左边:冯诺依曼型 4个邻居;
    右边:摩尔类型 8个邻居

    森林火灾模型

    1.描述状态·
    红色:着火 绿色:树 黑色:空地
    2.制定规则
    某格点的状态只由它的邻居决定

    规则1
    • 当前是绿色,若周围有红色则变成红色


      规则2
    • 当前是红色,无论邻居什么颜色,下一时刻依旧是红色


      规则3
    • 当前是黑色,无论邻居什么颜色,下一时刻依旧是红色
      注:当前的格点是指中心格点,我们在编程中只考虑中心格点,就能遍历所有

    代码

    main.m

    注:此代码规则与上述有所差异

    %% 森林火灾
    % (1)正在燃烧的树变成空格位;
    % (2)如果绿树格位的最近邻居中有一个树在燃烧,
    %   则它变成正在燃烧的树;
    % (3)在空格位,树以概率p生长;
    % (4)在最近的邻居中没有正在燃烧的树的情况下树
    %   在每一时步以概率f(闪电)变为正在燃烧的树。
    clear
    clc
    clear all
    %地图大小
    n=100;
    %被闪电击中的概率
    Plightning =0.000005;
    %空地生长出树的概率
    Pgrowth = 0.01;
    z=zeros(n,n);
    o=ones(n,n);
    veg=z;%初始化森林矩阵
    sum=z;
    imh = image(cat(3,z,veg*0.02,z));
    set(imh, 'erasemode', 'none')
    axis equal
    axis tight
    
    %状态变换规则
    % burning -> empty 
    % green -> burning if one neigbor burning or with prob=f (lightning) 
    % empty -> green with prob=p (growth) 
    % veg = {empty=0 burning=1 green=2} 
    UL=[n 1:n-1];DR=[2:n,1]%定义上左,下右邻居
    
    
    for i=1:3000 
        %nearby fires? 
        sum=(veg(UL,:)==1)+...(veg(:,UL)==1)+(veg(:,DR)==1)+...
    (veg(DR,:)==1);%对上下左右四个邻居求和
        %...表示另起一行
        %==1 表示返回索引为1的下标
        veg = ... 
        2*(veg==2) - ((veg==2) & (sum>0 | (rand(n,n)<Plightning))) + ... 
        2*((veg==0) & rand(n,n)<Pgrowth) ; 
        %更新规则:树=树-着火的树+新生的树
        set(imh, 'cdata', cat(3,(veg==1),(veg==2),z) ) 
        drawnow %刷新
    end 
    

    相关文章

      网友评论

          本文标题:酱汁 | 元胞自动机(数学建模算法)

          本文链接:https://www.haomeiwen.com/subject/sslybqtx.html