一、元胞自动机简介

1 元胞自动机发展历程
最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视.
1970 年, 剑桥大学的约翰 · 何顿 · 康威设计了一个电脑游戏 “生命游戏” 后, 元胞自动机才吸引了科学家们的注意.

1983 年 S.Wolfram 发表了一系列论文. 对初等元胞机 256 种 规则所产生的模型进行了深入研究, 并用熵来描述其演化行 为, 将细胞自动机分为平稳型, 周期型, 混沌型和复杂型.

2 对元胞自动机的初步认识
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。

3 元胞的变化规则&元胞状态
典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。

4 元胞自动机的应用
元胞自动机已被应用于物理模拟,生物模拟等领域。

5 元胞自动机的matlab编程
结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。

6 一维元胞自动机——交通规则
定义:
6.1 元胞分布于一维线性网格上.
6.2 元胞仅具有车和空两种状态.

7 二维元胞自动机——生命游戏
定义:
7.1 元胞分布于二维方型网格上.
7.2 元胞仅具有生和死两种状态.

元胞状态由周围八邻居决定.
规则:

骷髅:死亡;笑脸:生存
周围有三个笑脸,则中间变为笑脸
少于两个笑脸或者多于三个,中间则变死亡。

8 什么是元胞自动机
离散的系统: 元胞是定义在有限的时间和空间上的, 并且元 胞的状态是有限.
动力学系统: 元胞自动机的举止行为具有动力学特征.
简单与复杂: 元胞自动机用简单规则控制相互作用的元胞 模拟复杂世界.


9 构成要素

(1)元胞 (Cell)

元胞是元胞自动机基本单元:
状态: 每一个元胞都有记忆贮存状态的功能.
离散: 简单情况下, 元胞只有两种可能状态; 较复杂情况下, 元胞具有多种状态.
更新: 元胞的状态都安照动力规则不断更新.
(2)网格 (Lattice)
不同维网格

常用二维网格

(3)邻居 (Neighborhood)

(4)边界 (Boundary)

反射型:以自己作为边界的状态
吸收型:不管边界(车开到边界就消失)

(5)规则(状态转移函数)
定义:根据元胞当前状态及其邻居状况确定下一时刻该元胞状态的动力学函数, 简单讲, 就是一个状态转移函数.
分类 :
总和型: 某元胞下时刻的状态取决于且仅取决于它所有邻居 的当前状态以及自身的当前状态.
合法型: 总和型规则属于合法型规则. 但如果把元胞自动机 的规则限制为总和型, 会使元胞自动机具有局限性.
(6)森林火灾

绿色:树木;红色:火;黑色:空地。
三种状态循环转化:
树:周围有火或者被闪电击中就变成火。
空地:以概率p变为树木
理性分析:红为火;灰为空地;绿是树

元胞三种状态的密度和为1

火转化为空地的密度等于空地转换为树的密度(新长出来的树等于烧没的树)

f是闪电的概率:远远小于树生成的概率;T s m a x T_{smax}T smax
​是一大群树被火烧的时间尺度
程序实现
周期性边界条件
购进啊

其中的数字为编号
构建邻居矩阵

上面矩阵中的数字编号,对应原矩阵相同位置编号的上邻居编号,一 一对应
同样道理:

(7)交通概念
车距和密度

流量方程

守恒方程

时空轨迹(横轴是空间纵轴为时间)

红线横线与蓝色交点表示每个时间车的位置。
如果是竖线则表示车子在该位置对应的时间

宏观连续模型:

最常用的规则:

红色条表示速度是满的。

1 加速规则:不能超过v m a x ( 2 格 / s ) v_{max}(2格/s)v
max(2格/s)
2 防止碰撞:不能超过车距

理论分析:

结果分析: 密度与流量

第一个图:横坐标是归一化后的密度,纵坐标是车流量。第二个图:理论值与CA的结果

结果分析: 时空轨迹

中间的深色区域是交通堵塞的区域。

二、部分源代码

function Message_Spread_Mode
tic
load '.\Data\Link.txt';    %读入连接矩阵
% load 'C:\Users\user\Desktop\基于元胞自动机的短信网络病毒传播模拟\Data\Point_X.txt'; %读入横坐标
% load 'C:\Users\user\Desktop\基于元胞自动机的短信网络病毒传播模拟\Data\Point_Y.txt'; %读入纵坐标
%-------------------------------------------------------------------------%
%状态分布及状态转移概率SEIR
%0:易感状态S(Susceptible)  P_0_1; (P_0_3:预免疫系数)
%1:潜伏状态E(Exposed)      P_1_0;  P_1_2;P_1_3
%2:染病状态I(Infected)     P_2_0;  P_2_3
%3:免疫状态R(Recovered)    P_3_0
%-------------------------------------------------------------------------%
%计算各用户节点的度
De=sum(Link);                                                              %用户节点的度
%------------——————----参数设置与说明--------------------------------%
[M N]=size(Link);                                                          %连接矩阵的规模
I_E=0.6;                                                                   %潜伏期E用户的传染强度
I_I=0.9;                                                                   %发病期I用户的传染强度
lamda=sum(De)/M;                                                           %手机用户单位时间内平均发送信息的数量
%P_m1: 手机用户预免疫系数
%State:手机用户所处状态State=zeros(1,M);0:表示易感状态(Susceptible)
%---------------------------------1---------------------------------------%
%先讨论用户预免疫系数P_m1对病毒传播的影响
TimeStep=50;%input('短信网络内病毒传播模拟时间:');
P_m1=[0.1,0.5,0.9];         %用户预免疫系数
% State=zeros(TimeStep,M);  %手机用户的状态
G_t=5;                      %G_t:手机用户的免疫持续时间,反映了病毒的变异频率
F_t=5;                      %F_t:手机用户从发现病毒到杀毒并升级病毒库的时间
for i=1:length(P_m1)TimeLong_F=zeros(1,M); %用户处于染病期的时间长短TimeLong_E=zeros(1,M); %用户处于潜伏期的时间长短Sta=zeros(1,M);                                                      %手机用户的状态 %进行预免疫设定for j=1:Mif rand(1)<=P_m1(i)Sta(j)=3;         %进入免疫状态TimeLong_E(j)=1;  %出入潜伏期的时间为1elsecontinue;endend%状态转换%初始随机选择一个节点为病源点(此时不能选处于免疫状态的点)%问题:节点度大小存在差别,可能模拟出来的结果有出于%      为避免这个问题,我们取度最大的节点为病源节点,如果已免疫,则选次大的,一次下去[Number,Sta]=Select_Infected_Point(M,Sta,De);%Number:病源节点%State :确定病源节点以后的节点状态矩阵State=zeros(TimeStep,M);Number_State=zeros(4,TimeStep);  %用户处于个状态的统计数量for t=1:TimeStepif t==1State(t,:)=Sta;else%模拟每个用户节点的状态for j=1:M%判断用户节点处于什么状态,然后根据其状态确定其转变情况if State(t-1,j)==0                          %此时处于易感状态0,可能向潜伏期转移Num=Select_Number_Near(j,Link);         %找出节点j的邻居节点P=zeros(1,length(Num));                 %邻居节点感染该节点的概率for k=1:length(Num)if State(t-1,Num(k))==1             %节点处于潜伏期E(1)P(k)=I_E/De(Num(k))*sum((lamda.^([1:De(Num(k))]).*exp(-lamda))./...(factorial([1:De(Num(k))]-1)));elseif State(t-1,Num(k))==2          %节点处于染病期I(2)P(k)=I_I/De(Num(k))*sum((lamda.^([1:De(Num(k))]).*exp(-lamda))./(factorial([1:De(Num(k))]-1)));elsecontinue;endendendP_0_1=max(P);                       %节点感染病毒的概率if rand<=P_0_1                      %此时节点进入潜伏期State(t,j)=1;elseState(t,j)=State(t-1,j); endelseif State(t-1,j)==1         %此时处于潜伏状态E,可能向易感S,染病I和免疫R转移if rand<=1/(1+exp(-De(j)))                 %向染病状态I转移                State(t,j)=2;TimeLong_F(j)=TimeLong_F(j)+1;         %用户j处于染病状态的时间长短  elseif rand<=1/(1+exp(-De(j)))             %向易感状态S转移           State(t,j)=0;elseif rand<=1/(1+exp(-De(j)))         %向免疫状态R转移State(t,j)=3;TimeLong_E(j)=TimeLong_E(j)+1; %免疫时间增加1elseState(t,j)=State(t-1,j);       %状态不变,依然为潜伏期E(1)endendendelseif State(t-1,j)==2        %此时处于欺染病状态I,可能向易感S,免疫R转移if TimeLong_F(j)<=F_t         %表示此时用户不对手机病毒进行任何处理State(t,j)=State(t-1,j);           %此时手机用户维持在原状态ITimeLong_F(j)=TimeLong_F(j)+2;else%此时手机用户对手机进行杀毒并升级病毒库,进入免疫状态RState(t,j)=3;TimeLong_F(j)=0; %处于感染期(中毒状态)的时间长度TimeLong_E(j)=1; %进入免疫期的时间长度endelse%此时手机用户处于免疫期if TimeLong_E<=G_t   %病毒此时并未突变,维持原状态R(免疫状态)State(t,j)=State(t-1,j);TimeLong_E(j)=TimeLong_E(j)+1; %处于免疫期的时间增加elseif rand<=1/G_t  %病毒突变,状态转移为易感状态SState(t,j)=0;TimeLong_E(j)=0;else%此时用户状态依然不变State(t,j)=State(t-1,j);TimeLong_E(j)=TimeLong_E(j)+1; %处于免疫期的时间增加endendendendendendend%统计各状态的节点数量Number_State(1,t)=sum(State(t,:)==0);%处于易感状态S的总节点数量Number_State(2,t)=sum(State(t,:)==1);%处于易感状态E的总节点数量Number_State(3,t)=sum(State(t,:)==2);%处于易感状态I的总节点数量Number_State(4,t)=sum(State(t,:)==3);%处于易感状态R的总节点数量figure(i)if rem(t,3)==0plot([t-1 t],[Number_State(1,t-1) Number_State(1,t)],'md-'),hold onplot([t-1 t],[Number_State(2,t-1) Number_State(2,t)],'gh:'),hold onplot([t-1 t],[Number_State(3,t-1) Number_State(3,t)],'bs-.'),hold onplot([t-1 t],[Number_State(4,t-1) Number_State(4,t)],'k.-'),hold onelsecontinue;endlegend('易感状态Susceptible','潜伏状态Exposed','染病状态Infected','免疫状态Recovered')xlabel('模拟时间')ylabel('各状态的手机用户数量')end
end
P_m1=0.3;         %用户预免疫系数
% State=zeros(TimeStep,M);  %手机用户的状态
% G_t=5;                      %G_t:手机用户的免疫持续时间,反映了病毒的变异频率
G_t=[1,5,9];
F_t=5;                      %F_t:手机用户从发现病毒到杀毒并升级病毒库的时间
for i=1:length(G_t)TimeLong_F=zeros(1,M); %用户处于染病期的时间长短TimeLong_E=zeros(1,M); %用户处于潜伏期的时间长短Sta=zeros(1,M);                                                      %手机用户的状态 %进行预免疫设定for j=1:Mif rand(1)<=P_m1Sta(j)=3;         %进入免疫状态TimeLong_E(j)=1;  %出入潜伏期的时间为1elsecontinue;endend%状态转换%初始随机选择一个节点为病源点(此时不能选处于免疫状态的点)%问题:节点度大小存在差别,可能模拟出来的结果有出于%      为避免这个问题,我们取度最大的节点为病源节点,如果已免疫,则选次大的,一次下去[Number,Sta]=Select_Infected_Point(M,Sta,De);%Number:病源节点%State :确定病源节点以后的节点状态矩阵State=zeros(TimeStep,M);Number_State=zeros(4,TimeStep);  %用户处于个状态的统计数量for t=1:TimeStepif t==1State(t,:)=Sta;else%模拟每个用户节点的状态for j=1:M%判断用户节点处于什么状态,然后根据其状态确定其转变情况if State(t-1,j)==0                          %此时处于易感状态0,可能向潜伏期转移Num=Select_Number_Near(j,Link);         %找出节点j的邻居节点P=zeros(1,length(Num));                 %邻居节点感染该节点的概率for k=1:length(Num)if State(t-1,Num(k))==1             %节点处于潜伏期E(1)P(k)=I_E/De(Num(k))*sum((lamda.^([1:De(Num(k))]).*exp(-lamda))./...(factorial([1:De(Num(k))]-1)));elseif State(t-1,Num(k))==2          %节点处于染病期I(2)P(k)=I_I/De(Num(k))*sum((lamda.^([1:De(Num(k))]).*exp(-lamda))./...(factorial([1:De(Num(k))]-1)));elsecontinue;endendendP_0_1=max(P);                       %节点感染病毒的概率if rand<=P_0_1                      %此时节点进入潜伏期State(t,j)=1;elseState(t,j)=State(t-1,j); endelseif State(t-1,j)==1          %此时处于潜伏状态E,可能向易感S,染病I和免疫R转移if rand<=1/(1+exp(-De(j)))                 %向染病状态I转移                State(t,j)=2;TimeLong_F(j)=TimeLong_F(j)+1;         %用户j处于染病状态的时间长短  elseif rand<=1/(1+exp(-De(j)))             %向易感状态S转移           State(t,j)=0;elseif rand<=1/(1+exp(-De(j)))         %向免疫状态R转移State(t,j)=3;TimeLong_E(j)=TimeLong_E(j)+1; %免疫时间增加1elseState(t,j)=State(t-1,j);       %状态不变,依然为潜伏期E(1)endendendelseif State(t-1,j)==2           %此时处于欺染病状态I,可能向易感S,免疫R转移if TimeLong_F(j)<=F_t          %表示此时用户不对手机病毒进行任何处理State(t,j)=State(t-1,j);           %此时手机用户维持在原状态ITimeLong_F(j)=TimeLong_F(j)+2;else%此时手机用户对手机进行杀毒并升级病毒库,进入免疫状态RState(t,j)=3;TimeLong_F(j)=0; %处于感染期(中毒状态)的时间长度TimeLong_E(j)=1; %进入免疫期的时间长度endelse%此时手机用户处于免疫期if TimeLong_E<=G_t(i)   %病毒此时并未突变,维持原状态R(免疫状态)State(t,j)=State(t-1,j);TimeLong_E(j)=TimeLong_E(j)+1; %处于免疫期的时间增加elseif rand<=1/G_t(i)              %病毒突变,状态转移为易感状态SState(t,j)=0;TimeLong_E(j)=0;else%此时用户状态依然不变State(t,j)=State(t-1,j);TimeLong_E(j)=TimeLong_E(j)+1; %处于免疫期的时间增加endendendendendendend

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]孟逸凡,柳益君.基于PCA-SVM的人脸识别方法研究[J].科技视界. 2021,(07)
[6]张娜,刘坤,韩美林,陈晨.一种基于PCA和LDA融合的人脸识别算法研究[J].电子测量技术. 2020,43(13)
[7]陈艳.基于BP神经网络的人脸识别方法分析[J].信息与电脑(理论版). 2020,32(23)
[8]戴骊融,陈万米,郭盛.基于肤色模型和SURF算法的人脸识别研究[J].工业控制计算机. 2014,27(02)

【元胞自动机】基于matlab元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】相关推荐

  1. 【元胞自动机】元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  2. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  3. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  4. 【Matlab树叶分类】BP神经网络植物叶片分类【含GUI源码 916期】

    一.代码运行视频(哔哩哔哩) [Matlab树叶分类]BP神经网络植物叶片分类[含GUI源码 916期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  5. 【Matlab水果蔬菜识别】形态学水果蔬菜识别【含GUI源码 919期】

    一.代码运行视频(哔哩哔哩) [Matlab水果蔬菜识别]形态学水果蔬菜识别[含GUI源码 919期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅. ...

  6. 【Matlab青草识别】形态学马唐草+牛筋草识别【含GUI源码 908期】

    一.代码运行视频(哔哩哔哩) [Matlab青草识别]形态学马唐草+牛筋草识别[含GUI源码 908期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  7. 【Matlab限速标志识别】形态学限速标志识别【含GUI源码 1142期】

    一.代码运行视频(哔哩哔哩) [Matlab限速标志识别]形态学限速标志识别[含GUI源码 1142期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  8. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  9. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

  10. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

最新文章

  1. (转)基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
  2. 十一、递归----迷宫问题
  3. LeaFlet学习之结合turf.js生成简单的等值线demo
  4. Streams全库复制
  5. TFT_LCD液晶屏驱动设计与验证
  6. java主类型_Java主类结构:基本数据类型
  7. 设置linux文件系统密码,busybox 文件系统设置 登陆 login 密码 password shadow
  8. jsp中post提交和get提交乱码解决_统一请求编码
  9. 【学习OpenCV4】图像像素数据类型的转换与归一
  10. zemax操作例子_光学软件使用实例:从Zemax导入光学系统
  11. 读研,选择高校 or 研究所?
  12. 麻省理工学院计算机硕士几年制,2020年麻省理工学院硕士读几年
  13. 【基础】Premultiplied Alpha Blending/Alpha预乘/透明图片黑边
  14. 基于FPGA驱动TLC5615模块
  15. 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框
  16. 50家大厂面试万字精华总结,面试的时候突然遇到答不上的问题怎么办?分享一点面试小经验
  17. 色彩心理学(转载)以后也许有用~
  18. GPUImage实现人脸实时识别
  19. 利用Glide 对设备上的图片进行压缩并保存
  20. 嵌入式系统设计电子书

热门文章

  1. flume大文件Bug
  2. Java_学生信息管理系统——数组版——尝试将main函数单独放了一个类,并加了文件...
  3. 目标检测方法总结(R-CNN系列)
  4. 项目管理和版本跟踪——Redmine和SVN的结合
  5. 2020-11-30 03_空域图像处理 笔记
  6. CCF虚拟现实与可视化技术专委会丨面向增强现实的可视计算技术研究进展概述
  7. 190314每日一句
  8. 传智播客 C/C++学习笔记 数组和指针的关系, 字符串学习
  9. Improving your productivity in the Visual Studio Editor
  10. HTC 一个基站老无法定位