【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】

时间:2022-10-16 21:57:24


一、元胞自动机简介

1 元胞自动机发展历程
最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视.1970 年, 剑桥大学的约翰 · 何顿 · 康威设计了一个电脑游戏 “生命游戏” 后, 元胞自动机才吸引了科学家们的注意.1983 年 S.Wolfram 发表了一系列论文. 对初等元胞机 256 种 规则所产生的模型进行了深入研究, 并用熵来描述其演化行 为, 将细胞自动机分为平稳型, 周期型, 混沌型和复杂型.

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

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

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

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

6 一维元胞自动机——交通规则

定义:

6.1 元胞分布于一维线性网格上.

6.2 元胞仅具有车和空两种状态.

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


7 二维元胞自动机——生命游戏

定义:

7.1 元胞分布于二维方型网格上.

7.2 元胞仅具有生和死两种状态.

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

规则:

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


骷髅:死亡;笑脸:生存

周围有三个笑脸,则中间变为笑脸

少于两个笑脸或者多于三个,中间则变死亡。

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

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


9 构成要素

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


(1)元胞 (Cell)

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


元胞是元胞自动机基本单元:

状态: 每一个元胞都有记忆贮存状态的功能.

离散: 简单情况下, 元胞只有两种可能状态; 较复杂情况下, 元胞具有多种状态.

更新: 元胞的状态都安照动力规则不断更新.

(2)网格 (Lattice)

不同维网格

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


常用二维网格

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


(3)邻居 (Neighborhood)

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


(4)边界 (Boundary)

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


反射型:以自己作为边界的状态

吸收型:不管边界(车开到边界就消失)(5)规则(状态转移函数)

定义:根据元胞当前状态及其邻居状况确定下一时刻该元胞状态的动力学函数, 简单讲, 就是一个状态转移函数.

分类 :

总和型: 某元胞下时刻的状态取决于且仅取决于它所有邻居 的当前状态以及自身的当前状态.

合法型: 总和型规则属于合法型规则. 但如果把元胞自动机 的规则限制为总和型, 会使元胞自动机具有局限性.

(6)森林火灾

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


绿色:树木;红色:火;黑色:空地。

三种状态循环转化:

树:周围有火或者被闪电击中就变成火。

空地:以概率p变为树木

理性分析:红为火;灰为空地;绿是树

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


f是闪电的概率:远远小于树生成的概率;T s m a x T_{smax}T smax

​是一大群树被火烧的时间尺度

程序实现

周期性边界条件

购进啊

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


其中的数字为编号

构建邻居矩阵

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

同样道理:

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


(7)交通概念

车距和密度

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


流量方程

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


守恒方程

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


红线横线与蓝色交点表示每个时间车的位置。

如果是竖线则表示车子在该位置对应的时间宏观连续模型:

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


最常用的规则:

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


红色条表示速度是满的。

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

理论分析:

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


结果分析: 密度与流量

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


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

二、部分源代码

% cellular automata
clc;clear;close all;
%%%%%% initialization of parameters
N = 100; % a half length of region
Dn = 0; % the number of death
rand(‘state’,121); % state generating random data
S = zeros(2N+1); % state matrix
r = rand(2
N+1);
S(r>0.4) = 4; % uniform distribution of normal people before simulation

vc(1,:) = [1,1,0]; % yellow color state for death or unpeopled
vc(2,:) = [0,1,1]; % black color state for curative
vc(3,:) = [0,0,1]; % blue color state for delitescent
vc(4,:) = [1,0,0]; % red color state for catch an illness
vc(5,:) = [0,1,0]; % green color state for normal people
vc(6,:) = [1,0,1]; % black color state for normal people

% Sc = ones(2N+1,2N+1,3); % color state matrix
Sc = mark_color(S,vc);
%%%%%% initialization of Figure
set(gcf,‘Position’,[200,60,600,700]);
axes(‘Position’,[0.1,0.4,0.6,0.5]); % mapping
I1 = imshow(Sc);
th = title(‘The spread days of the disease: 1’,‘FontSize’,14);
axes(‘Position’,[0.78,0.4,0.2,0.5]); hold on;
ylim([-0.1,1.05]); xlim([-0.1,1]);
% box on;
axis off
rectangle(‘Position’,[0,0.35,0.3,0.10],‘FaceColor’,vc(1,:));
text(0.4,0.4,{‘D’});
rectangle(‘Position’,[0,0.05,0.3,0.10],‘FaceColor’,vc(2,:));
text(0.4,0.1,{‘R’});
rectangle(‘Position’,[0,0.65,0.3,0.10],‘FaceColor’,vc(3,:));
text(0.4,0.70,{‘E’});
rectangle(‘Position’,[0,0.5,0.3,0.10],‘FaceColor’,vc(4,:));
text(0.4,0.55,{‘I’});
rectangle(‘Position’,[0,0.8,0.3,0.10],‘FaceColor’,vc(5,:));
text(0.4,0.85,{‘S’});
rectangle(‘Position’,[0,0.2,0.3,0.10],‘FaceColor’,vc(6,:));
text(0.4,0.25,{‘Q’});
set(gca,‘Xtick’,[],‘Ytick’,[]);
axes(‘Position’,[0.1,0.08,0.6,0.2]); % stats
Bh(1) = bar(1,sum(sum(S1)),‘FaceColor’,vc(2,:)); hold on;
Bh(2) = bar(2,sum(sum(S
2)),‘FaceColor’,vc(3,:));
Bh(3) = bar(3,sum(sum(S==3)),‘FaceColor’,vc(4,:));
ylabel(‘number of people’);
xlim([0,4]);set(gca,‘Xtick’,[0:4])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%% iterative calculation
S(N+N/2,N+1) = 3; % center cell is catched an illness
S(N+(N-10)/2,N+1) = 3; % center cell is catched an illness
S(N-N/2,N+1) = 3; % center cell is catched an illness
S(N+1,N+1) = 3; % center cell is catched an illness
S(N+1,N+N/2) = 3; % center cell is catched an illness
S(N+1,N-N/2) = 3; % center cell is catched an illness
SL(S3) = 0; % time for the state of catching an illness
SGL = zeros(2*N+1); % 隔离时间
Sc = mark_color(S,vc);
set(I1,‘CData’,Sc);
Yao = 60;
cure=0;
ge=0;
ill=0;
for ktime = 1:200; % unit: day
% 潜伏者 5-10天有 80%的概率变成发病者,也就是状态2有80%概率变成状态3 ,
% 有20%的概率变成状态1
s2 = find(S
2);
for k = 1:length(s2);
if SL(s2(k))>4.5 & SL(s2(k))<10.5; % 5-10天
if rand<0.8;
S(s2(k)) = 3; % 2–>3, 80%
ill=ill+1;
SL(s2(k)) = 1; % time updata
else
S(s2(k)) = 1; % 2–>1, 20%
cure=cure+1;%治好人数更新
SL(s2(k)) = 1; % time updata
end
else
SL(s2(k)) = SL(s2(k))+1; % updating data
end
end
s3 = find(S3);
%%隔离死亡
s5 = find(S
5);
for k = 1:length(s5);
if SGL(s5(k))>0.5 & SGL(s5(k))<10.5; % 5-10天
if rand<0.4;
S(s5(k)) = 0; % 2–>0, 80%
Dn = Dn +1;
% ill=ill+1;
SGL(s5(k)) = 0; % time updata
else
% S(s5(k)) = 1; % 2–>1, 20%
SGL(s5(k)) = SGL(s5(k))+1; % time updata
end
else
if rand<0.5;
S(s5(k)) = 0; % 2–>3, 80%
Dn = Dn +1;
% ill=ill+1;
SGL(s5(k)) = 0; % time updata
else
% S(s5(k)) = 1; % 2–>1, 20%
SGL(s5(k)) = SGL(s5(k))+1; % time updata
end
% SL(s2(k)) = SL(s2(k))+1; % updating data
end
end
%%%隔离状态
for k = 1:length(s3);
if ktime>60;
if rand<min(SL(s3(k))*0.05+0.05,0.4);
S(s3(k)) = 5;
ge = ge+1;
if SL(s3(k))<10.5 % 如果在患病 10天内发现
if rand<0.8 & rand<min(1,Yao/ge)
S(s3(k)) = 1; % 5–>1. % 50%被治好, 药物的期望0.9,也就是有90%可以被治好
cure=cure+1; %治好人数更新
SGL(s3(k)) = 0; % 隔离时间清空
else
SGL(s3(k)) = SGL(s3(k))+1; % 隔离时间更新
end
elseif SL(s3(k))>10.5 % 患病10天到20天
if rand<0.2 & rand<rand<min(1,Yao/ge);
S(s3(k)) = 1; % 5–>1. 有20%被治好,药物的期望0.9,也就是有90%可以被治好
cure=cure+1;%治好人数更新
SGL(s3(k)) = 0; % 隔离时间清空
else
SGL(s3(k)) = SGL(s3(k))+1; % 隔离时间更新
end
elseif SGL(s3(k))<10.5 % 在隔离5天内
if rand<0.2 & rand<rand<min(1,Yao/ge)
S(s3(k)) = 1; % 5–>1. 有20%被治好,药物的期望0.9,也就是有90%可以被治好
cure=cure+1;%治好人数更新
SGL(s3(k)) = 0; % 隔离时间清空
else
SGL(s3(k)) = SGL(s3(k))+1; % 隔离时间更新
end
elseif SGL(s3(k))>10.5 % 在隔离5天以上
if rand<0.5 & rand<rand<min(1,Yao/ge)
S(s3(k)) = 1; % 5–>1. 有50%被治好,药物的期望0.9,也就是有90%可以被治好
cure=cure+1;%治好人数更新
SGL(s3(k)) = 0; % 隔离时间清空
else
% S(s3(k)) = 0; % 5–>1. 有50%未被治好,药物没有作用而死亡
% SGL(s3(k)) = 0; % 隔离时间清空
SGL(s3(k)) = SGL(s3(k))+1; % 隔离时间更新
end
end
else
SL(s3(k)) = SL(s3(k))+1; % 未隔离者发表时间更新
end
end

三、运行结果

【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】


【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]​​​【数学建模】元胞自动机.博主:二进制 人工智能​