当前位置:   article > 正文

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

元胞自动机模型代码

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

运行结果:

 

 

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

运行结果:

 

 

 

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

运行结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/177413
推荐阅读
相关标签
  

闽ICP备14008679号