QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3070|回复: 1
打印 上一主题 下一主题

Python实现简单的SI传播模型

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-4-18 16:16 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    Python实现简单的SI传播模型
    0 f* r0 Y, l6 c#SI疾病传播模型的原理
    9 X; k1 j9 M" c& Q& [在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类* K+ b8 U) o& _! B

    ! t  y4 V- o$ ]  y易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。
    * o; y0 e0 L7 r& U易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。
    , w9 a8 E- d- A/ R5 o移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。9 v" K, S* I, n6 C% r/ C, U$ g
    SI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个/ P) E9 j* S1 E/ R
    即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。3 G" G  G7 R( B2 K9 j
    在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有
    5 `4 o5 b0 v7 n5 D% rS(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触6 {- H' _# Z  h# a$ Z
    会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在
    0 B5 _8 {8 n. d  @' w感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少
    ( n* f. s9 Y) W6 |3 `ds/dt = -β*S(t)I(t)/N
    ' ?% h: ]5 n; W7 B同时,感染个体的数量会以与易感个体相反的变化率增加,2 U5 d5 t8 @7 q. _% m  ^
    ds/dt = βS(t)*I(t)/N5 W' p1 e6 S! {  S& X
    分别将时刻t处于易感状态和感染状态的个体所占比例记为,7 i. c1 k! Z, }2 \0 m
    s(t)=S(t)/N: I( l& m$ m" r$ H, @1 Q
    i(t)=I(t)/N/ D$ U7 u) L+ A3 c* K9 y+ n
    显然有," g" p# ?- w+ [! o- d; a0 t
    s(t)+i(t)恒等于1,此时之前的公式可以记做
    9 x& Y7 L8 Z1 P& _! Hds/dt=-βsi8 y. u; T/ [0 Z9 Z: D, z5 J
    di/dt=βsi0 E( g0 @6 t) Q& D
    ( X2 ]) @" h: p) s* [
    di/dt=βi(1-i)
    $ y" ~! L# h. F  U5 F/ S  z上式也成为Logistic增长方程式(Logistic growth equation),
    / Q9 {$ U  T/ X; V8 V8 w3 T方程的解和图像如图
      _( D+ z% [3 C  F 1.jpg 1 O$ A  P& E2 F3 {
    代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ) i; M8 P; t  u& J5 h& g
    提取码:z448
    + v; l2 P/ }' [3 h; W$ b9 T) p- K" Q" f

      O/ n. i$ q: o7 U'''
    ) j/ {7 a5 |# t5 r实验环境Python2.7.13,igraph包,cairo包,numpy包* W) E3 s/ F$ S% w
    '''
    * b* g% p0 m8 `7 O7 w" h# -*- coding:utf8 -*7 i( [" m$ i! T  X( ^! U
    from igraph import *
    ; n: G% O! B1 N- _' Y; ^% Limport numpy as numpy
    & r/ v# |7 N$ U: S) U$ h% tfrom  numpy import *
      {4 a! i  e+ T, i4 {import random
    & s$ p* Y2 V; F* K6 Y+ Q2 b5 W" Z0 B3 r+ E7 `  y; e
    def len_arr(infected_array,nodes_num):#获取感染数组长度
    # u5 m# o# B) ^* U; i    len_value=0#初始化长度
    - f: i2 ~) R0 P  s    len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)! @9 f9 Y5 |" \, \( N
        return len_value% m. X) o- X( O8 V) M

    6 o* k/ |9 _8 a' o% c. mg=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)
      R, K9 _9 l9 A; X" ^- hsummary(g)
    7 V( P- a* y# |7 enodes_num=g.vcount()#统计图中的结点个数
    3 M1 d2 ?- M/ q0 X* z# `net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat
    2 B- Q  @% f) {: u) \g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色  L1 P: {% ~5 A* z
    a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a( K7 J6 t2 h4 C" k
    nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)7 ?6 a# y1 G- E3 h& `& H
                                                        #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间
    ; K9 n3 I  z) k* @8 _( y7 ]8 hprint(nodes_state), B$ f9 h# B9 n$ ]" E% s4 a+ E8 I3 f
    infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数& [2 _" M# b  Y' S# y
    print(infected_array)
    - ~. {- k4 f3 V! h; E$ C0 ]7 O& Q: y+ T5 R) f
    infe_rate=1#传播率(感染率) 1代表邻接点100%被感染4 A7 ?7 u- v2 x+ C5 _
    set_time=2#传播次数(感染次数) 2次1 K1 I$ c. e% L! t3 B/ A
    source_seed=1#感染源位置: ]& M% \8 j" J. q2 }
    nodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-16 b0 E& f. J! Y1 X5 h  @0 l
    nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态5 _: U- F- z0 w' W! T
    nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1
    8 D8 d$ j) h' \g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红1 F/ n- M4 k1 u: Q( v
    infected_array[0]=source_seed#将感染源的位置存入被感染节点列表  w6 A. e: N0 q' H# R4 M
    plot(g)#绘制
    7 b, e% p9 U- d% p( U0 h6 H; [2 V0 C1 K" i
    stop=False#感染过程结束的标记/ j' N- U8 b& e
    temp_time=0#第几次感染
    ! Z. ~5 ]$ ^5 N$ Rtemp_len=0#本轮的感染源数量初始化
    0 V+ b0 ^: a5 s% j. R
    * G( i! ]; I0 S. }1 cwhile not stop:# {% J- p+ T/ Q4 {; ^5 O# J) C
        i=0#记录让每个感染源都传播一次" M) c4 @1 F( c+ ?0 D
        if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行
    9 l4 v4 v, j4 }; a9 g& L        temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量, Z' [8 I- X4 H5 @$ U& Y
            while i<temp_len:. ^2 X4 V6 Z$ z* {7 l8 d% t
                temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间% j4 v. K  Q4 Q$ J" T
                nei_count=0#下一轮可以被感染到的节点数量  R/ ?, M. L* S9 I4 r2 D3 P
                #生成下一轮可能被感染的节点的集合nei_arr
    5 }6 `/ S! a3 Q$ o            for j in range(nodes_num):#遍历节点
      X8 D" G8 D- t5 \# N/ `( q                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染1 r( R; k. n$ s
                        nei_count=nei_count+1#下一轮可以被感染到的节点数量++3 M0 D  Y  {9 Z7 D$ o
                nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
    * X  @% o% k2 x9 O0 r            t=0
    ( g6 {1 y& {- m" v6 d* n            for j in range(nodes_num):
    . b+ Z# A( J9 z8 e6 A: U% q# z                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:; u2 v" p! j/ w) {- Z
                        nei_arr[t]=j+1
    0 k( a3 S9 T# o7 [. M2 ]8 B                    t=t+1
    2 R$ z2 P2 k/ p) ]0 B            ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组5 N# x. {. v- w  Z, J" g
                                            #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象7 z* b8 Y" m; |3 t5 W) d
                if len(ran_infe_arr)>0:#存在需要被感染的节点1 l% \- |- E; o: T; N* }2 Z
                    t=0#让ran_infe_arr内每个感染源都被感染
    7 A# w2 M0 A# d" g. k6 A                while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
    ( b  \; L0 [! z  J                    nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态
    9 ]& b- x: u" }( m4 {" h                    nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间9 \7 U4 d( I  T* t* f- T
                        infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中
    5 S! j* J0 h0 P7 Y                    g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色1 T- O2 h8 ~: Q' u& O* G
                        plot(g)#绘制( O6 s+ l+ q  a. q" ?
                        t=t+1
    1 [1 B: c2 H  z5 K3 `            i=i+1
    * H: h% s3 K  b    if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染
    0 K: b9 `+ R/ R0 I        stop=True
    8 O, p7 |& P" }" ^
    5 j! ^" J4 X: ^: o; A% m/ b
    8 Y$ T  _( W7 o2 l# Y视频演示bilibili传送门7 B/ j: y% T5 h1 X( f
    效果图; [, G( m: U; t: d4 Y

    9 n* ~2 j, W; m5 ]1 I8 d: {( ?2 w4 ?/ Q/ H
    2.jpg   \  n9 R# k. j$ r' H: R

    + S2 n+ f7 n! ~. q, k4 T 3.png
    , D! D, b6 C0 O8 X6 }: P( U
    5 H5 o- \& x5 F, N 4.jpg
    2 I2 N9 G" ]4 j' b
    ' ?- {* O- m& [) S( _' k; p- f 5.png
    / }. P  ^; l" \' I8 Q) r$ q% ]/ Q% O5 U9 f1 C- y2 h
    6.png
    ; h3 Z0 q6 i2 [# w6 ]
    3 x% W8 c2 k) i6 v, y8 a 7.png ————————————————
    % o9 }( C- p/ ^1 U9 [0 C版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) y, U6 G& U9 r- ~5 o
    原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862
    % x4 p3 `/ ~$ o8 S8 q
    7 }! ?) H  L  U! D( S: n$ X
    4 o3 e4 ]! X4 c* B
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    尔雅 实名认证       

    0

    主题

    1

    听众

    208

    积分

    升级  54%

  • TA的每日心情
    开心
    2022-2-18 09:12
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    国际赛参赛者

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-21 02:54 , Processed in 0.466508 second(s), 60 queries .

    回顶部