2021-07-22MATLAB基于元胞自动机模型的传染病扩散模型

2021-07-22MATLAB基于元胞自动机模型的传染病扩散模型MATLAB 基于元胞自动机模型的传染病扩散模型基本思路 地图矩阵可以分为两类 一类是健康人矩阵 一类是感染者矩阵 健康人感染后则落入感染者矩阵 感染者康复后则升上健康人矩阵通过建立三维矩阵 Track 在 x 轴和 y 轴之上加入时间轴形成三维 来追踪已感染的人的感染时间 从而判定康复 通过设置 NewMap 和 NewPatientMa 两个过渡矩阵来更新每次的随机移动 防止先更新的人在遍历过程中再次被选中导致一个回合内多次移动 将地图分为两种 一种是健康人地图 一种是病人地图 多个人可以在同一个点

MATLAB基于元胞自动机模型的传染病扩散模型

蓝色小点代表未感染过的健康人,蓝色圆圈代表康复者,红色星号代表感染者
蓝色小点代表未感染过的健康人,蓝色圆圈代表康复者,红色星号代表感染者

基本思路:

  1. 地图矩阵可以分为三类,第一类是健康人矩阵,第二类是感染者矩阵,第三类是康复者矩阵。健康人感染后则落入感染者矩阵,感染者康复后则升上康复者矩阵,且康复者对病毒具有免疫能力。允许多个人在同一点。
  2. 通过建立三维矩阵Track(在x轴和y轴之上加入时间轴形成三维)来追踪已感染的人的感染时间,从而判定康复。
  3. 通过设置NewMap和NewPatientMap以及NewSurvivalMap三个过渡矩阵来更新每次的随机移动,防止先更新的人在遍历过程中再次被选中导致一个回合内多次移动。
  4. 第一次遍历让三类人随机走动并判定死亡,第二次遍历只判定感染,最后一次遍历只判定康复。这样安排能尽量减少遍历次数并避免bug产生。
%将地图分为三种,第一种是健康人地图,第二种是病人地图,第三种是康复者地图,多个人可以在同一个点。 %初始化 pplnum = 1000; %地图内总人数 V = 1; %所有人的移动速度 R = 5; %病人传染健康人的范围半径 P = 0.6; %健康人处在风险区域被感染的概率 T = 100; %康复所需时间 D = 0.01; %病人每步的死亡概率 Size = 201; %地图大小 Map = zeros(Size); %正常人分布地图 NewMap = zeros(Size);%正常人分布地图过渡矩阵,消除循环中部分人移动多次的bug PatientMap = zeros(Size); %病人分布地图 NewPatientMap = zeros(Size); %病人分布地图过渡矩阵 SurvivalMap = zeros(Size); %康复者地图 NewSurvivalMap = zeros(Size); %康复者过渡矩阵 direction=[0 -V; 0 V;V 0; -V 0]; %上下左右四个方向 DangerousArea = []; %存储会被感染的邻域 NewPatientNum = 1; %存储本轮新产生的病人数量 Track = zeros(Size,Size,T); %记录病人行踪,方便判定康复 Time = 0; %总循环次数,用来记录动画 %使人群随机分布 for i = 1:pplnum-1 xi = randperm(Size,1); yi = randperm(Size,1); Map(xi,yi) = Map(xi,yi)+1; end %随机选择零号病人位置 for i = 1:1 PatientMap(randperm(Size,1),randperm(Size,1)) = 1; end Track(:,:,1) = PatientMap; %寻找会被感染的区域 [X,Y] = meshgrid(-R:R); for i = 1:(2*R+1)^2 if X(i)^2 + Y(i)^2 <= R^2 DangerousArea = [DangerousArea;X(i),Y(i)]; end end %主程序 while sum(PatientMap,"all") > 0 %在病人清零前一直循环 Time = Time+1; %循环次数增加,这一步是方便动画帧的捕捉 %在第一次遍历中,完成健康人、康复者、病人随机走动以及病人死亡判定 for i = 1:Size %建立for循环嵌套,遍历图中所有点 for k = 1:Size %健康人随机走动 for num = 1:Map(i,k) r1 = randi(4); %四个方向随机选一个走 NewY = min(max(i+direction(r1,1),1),Size); %新的坐标 NewX = min(max(k+direction(r1,2),1),Size); NewMap(NewY,NewX) = NewMap(NewY,NewX)+1; %人移到新位置 end %康复者随机走动 for num = 1:SurvivalMap(i,k) r3 = randi(4); %四个方向随机选一个走 NewY3 = min(max(i+direction(r3,1),1),Size); %新的坐标 NewX3 = min(max(k+direction(r3,2),1),Size); NewSurvivalMap(NewY3,NewX3) = NewSurvivalMap(NewY3,NewX3)+1;%人移到新位置 end %让本轮感染前的病人随机走动 for num = 1:PatientMap(i,k) if rand<D %死了就直接删除Track数据,不进行随机移动就不会进入NewPatientMap for n3 = T:-1:1 %倒序在Track中查找 if Track(i,k,n3) ~= 0 Track(i,k,n3) = Track(i,k,n3)-1; break end end else %没死再进行随机移动 r2 = randi(4); %四个方向随机选一个走 NewY2 = min(max(i+direction(r2,1),1),Size); %新的坐标 NewX2 = min(max(k+direction(r2,2),1),Size); NewPatientMap(NewY2,NewX2) = NewPatientMap(NewY2,NewX2)+1;%人移到新位置 for n2 = T:-1:1 %倒序,从最早感染的开始查找 if Track(i,k,n2) ~= 0 Track(i,k,n2) = Track(i,k,n2)-1; %改变轨迹位置 Track(NewY2,NewX2,n2) = Track(NewY2,NewX2,n2)+1; break end end end end end end %位置数据已经全部转移至过渡矩阵,因此以下操作全部在New地图上进行 %第二次遍历只完成判定感染 for i = 1:Size %建立for循环嵌套,遍历图中所有点 for k = 1:Size if NewPatientMap(i,k) ~= 0 %如果此处有病人 for n = 1:size(DangerousArea,1) %选取该病人周围空间 npy = min(max(i+DangerousArea(n,1),1),Size); npx = min(max(k+DangerousArea(n,2),1),Size); %选取周围空间的一点 for n1 = 1:NewMap(npy,npx) %如果该点有健康人,则遍历健康人 if rand<P %有P的概率此健康人感染 NewPatientMap(npy,npx) = NewPatientMap(npy,npx)+1; %加入新病人 NewMap(npy,npx) = NewMap(npy,npx)-1; %从健康人地图剔除新病人 Track(npy,npx,1) = Track(npy,npx,1)+1; %记录新病人位置 end end end end end end %第三次遍历判定康复 for i = 1:Size %建立for循环嵌套,遍历图中所有点 for k = 1:Size for n8 = 1:Track(i,k,end) NewSurvivalMap(i,k) = NewSurvivalMap(i,k)+1; %增加康复者 NewPatientMap(i,k) = NewPatientMap(i,k)-1; %减少病人 end end end %其他操作 Map = NewMap; %将新地图赋值到原地图 PatientMap = NewPatientMap; SurvivalMap = NewSurvivalMap; NewMap = zeros(Size); %清空过渡矩阵 NewPatientMap = zeros(Size); NewSurvivalMap = zeros(Size); Track(:,:,2:end) = Track(:,:,1:end-1); %将轨迹整体后移一个单位时间 Track(:,:,1) = zeros(Size); [pply,pplx] = find(Map); %找到当前人的坐标 [ptty,pttx] = find(PatientMap); [svvy,svvx] = find(SurvivalMap); plot(pplx-1,pply-1,'b.') %绘图 axis([-10 Size+9 -10 Size+9]); hold on plot(pttx-1,ptty-1,'r*') plot(svvx-1,svvy-1,'bo') hold off M(:,Time) = getframe; clf end movie(M,1,50) disp(sum(SurvivalMap,'all')+sum(Map,'all')) %统计幸存者 

笔者第一次编程,希望各位也能多多批评,给出建议。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232048.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月5日 上午11:01
下一篇 2025年11月5日 上午11:22


相关推荐

  • 深入解析Linux Platform_device 及驱动

    深入解析Linux Platform_device 及驱动[导读]前文分析了Linux设备驱动的驱动模型,本文来聊聊Platform_driver/Platform_device这个类。做嵌入式Linux的驱动,这个也是绕不开的,所以来学习分析总结一下。

    2022年7月3日
    24
  • Mac下Sublime插件安装和使用「建议收藏」

    Mac下Sublime插件安装和使用「建议收藏」一.SublimeText安装官方地址二.在SublimeText中安装PackageControl地址把下载下来的PackageControl.sublime-package文件copy到Subime安装路径InstalledPackages目录下,然后重启三.安装常用插件command+shift+p调出命令行面板输入packagecontrol:in…

    2022年6月24日
    118
  • HIVE数仓数据血缘分析工具-SQL解析

    HIVE数仓数据血缘分析工具-SQL解析一 数仓经常会碰到的几类问题 1 两个数据报表进行对比 结果差异很大 需要人工核对分析指标的维度信息 比如从头分析数据指标从哪里来 处理条件是什么 最后才能分析出问题原因 2 基础数据表因某种原因需要修改字段 需要评估其对数仓的影响 费时费力 然后在做方案 二 问题分析 数据源长途跋涉 经过大量的处理和组件来传递 呈现在业务用户面前 对数据进行回溯其实很难 元数据回溯在有效决策 策略制定

    2026年3月17日
    2
  • 系统设计基础

    系统设计基础

    2021年3月12日
    159
  • pycharm 创建 django 项目出错

    pycharm 创建 django 项目出错pycharm 创建 django 项目过程中 如果出现如下错误根据提示信息 找到问题发生的原因 pycharm2020 3 之前的版本 在创建 Django 项目的时候 会自动将 pip 升级到最新版本 并且安装 Django 的时候会使用 build dir 参数 但是 最新的 pip 在 20 版本后 取消了 build dir 参数 这就产生了冲突 也就是说 Pycharm 内部自动调用 pip 的时候 多提供了一个 build dir 参数 貌似这个机制还无法人工介入修改 知道了问题原因

    2026年3月18日
    1
  • HTML5移动端手机网站开发

    HTML5移动端手机网站开发手写手机网站一般我们自己手动开发手机网站的话,基本可以划分两类来做到。一类是通过在网页头部添加meta标签进行实现(网页指html5的格式来开发)。另一类是通过CSS3的Media标签(媒介查询)来实现。    在这里我们详细讲解下,利用添加meta标签来做手机网站。基本在网页头部我们只需添加四个meta标签就可以实现一个手机网站的框架。我一起来看看是哪些meta标签。1、添加viewport标签…

    2022年6月21日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号