QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3151|回复: 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传播模型
    ! u. G' S" k7 \- F$ u#SI疾病传播模型的原理
    4 I% g' V$ ^$ `7 N+ a/ e9 ]在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类
    5 I. `) _% ~8 k7 v; f& a6 J8 F, o; W/ i
    易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。( g* _2 F0 f1 F, g$ L! M
    易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。" k" b4 D' m* b
    移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
    2 ~& ]- G/ K$ j! tSI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个6 T1 l+ ?6 q$ C  p# n6 _  o
    即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。
    * \  X! F' l0 @) J在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有1 P' ^! t6 a! `3 u  A& }; _
    S(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触: ~4 a" R0 W' ?  F) x8 c) L) \( ?6 e. n
    会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在/ f: f* d' y9 L: _4 O7 f
    感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少4 v' j0 _! ~1 X5 ^2 G8 s% J
    ds/dt = -β*S(t)I(t)/N: g7 @5 c& C0 q9 c
    同时,感染个体的数量会以与易感个体相反的变化率增加,
    / a- c, i# m& ods/dt = βS(t)*I(t)/N
    0 J) L( k5 k0 g( \分别将时刻t处于易感状态和感染状态的个体所占比例记为,
    - D% b8 ]  f- X6 ?$ F$ @s(t)=S(t)/N. J: l0 }8 N" p2 m9 s. d
    i(t)=I(t)/N
    * \7 Y; C- K1 t& R: U: ]& `显然有,; k/ Z7 q6 G9 L% R  R+ J  t/ n
    s(t)+i(t)恒等于1,此时之前的公式可以记做7 j, \/ A& J, k/ |
    ds/dt=-βsi
    2 \' {; J- n  g$ O# e* vdi/dt=βsi0 ^; F* x" P0 l- o
    : o- v! X! n3 k  {, x+ y
    di/dt=βi(1-i)3 ]& n/ b3 D' Q
    上式也成为Logistic增长方程式(Logistic growth equation),9 g7 F, ?! s; S8 l
    方程的解和图像如图& |# q; R8 z, l- S, _3 G6 `  G7 u3 j
    1.jpg
      l3 e/ \* X& Y- k5 |代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ
    + _  [$ M5 i% K4 I; ~9 K提取码:z448
    - Y+ ^2 j  F- C+ m. L8 h0 n/ Z  C/ b! {

    # g1 A" O$ }: Z$ H: G. E- d'''
    # ?+ q# X* V% C: D6 a$ Z* ]实验环境Python2.7.13,igraph包,cairo包,numpy包
    0 W2 ^: m) m* i6 I4 O'''; I) ^5 o' H% \" M! N: W. r& d
    # -*- coding:utf8 -*5 I" z$ |3 I$ A0 H! U8 V
    from igraph import *% L- ^4 E+ K$ g8 h7 ^% _, L
    import numpy as numpy
    * ]) T3 r. p. }$ [# Afrom  numpy import *
    1 @8 L6 T( q0 c) y2 aimport random4 D5 P0 Z2 E+ v" B
    ) T& K! s# d5 f& n; f+ |
    def len_arr(infected_array,nodes_num):#获取感染数组长度+ T+ x/ x" b3 ?# q! y
        len_value=0#初始化长度
    3 b( h2 K& Z2 z: ]; N" d! V    len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)$ o( b9 S0 Q8 q; i+ l
        return len_value& I5 Q2 I/ `: {% R0 |6 S

    5 m/ F3 N: G9 ag=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图): q0 R# D! {! o
    summary(g)
    5 G7 Z# t; a, Q3 fnodes_num=g.vcount()#统计图中的结点个数$ X, {3 a9 H9 z9 t2 V9 j
    net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat1 a& u+ S4 ~' M' j2 c/ r: y! {
    g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色
    0 D+ R) M: v" Q2 na=[arange(nodes_num)+1]*3#声明一个N行3列的数组a/ f8 G% t/ z  f( S( _
    nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)
    ( X; b% d: }  ]! F6 T4 `                                                    #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间$ U& [4 B7 [. Z: J
    print(nodes_state)7 x+ o- k  r, l& q
    infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数" _* t# g) v5 W1 E1 Z) i; t
    print(infected_array). ^0 C% O  U3 b% A4 C. L$ ~
    7 ^3 d. c6 a" W2 f/ v: L
    infe_rate=1#传播率(感染率) 1代表邻接点100%被感染
    - J# H4 g" \5 W: A; dset_time=2#传播次数(感染次数) 2次/ @3 Y5 g9 p. p4 j* M$ ^7 S
    source_seed=1#感染源位置
    8 ?: @$ R% I7 C' g5 pnodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1
    $ H: \) Q: d4 P6 Unodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态: u' m1 q) Z6 p+ t5 u+ A$ ^
    nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1$ F+ s4 W3 \2 n) f# o- |. T
    g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红3 M, E- P2 |0 v6 s" T
    infected_array[0]=source_seed#将感染源的位置存入被感染节点列表
    % r$ b3 F2 ~" O7 lplot(g)#绘制
    % T, A, n/ q" }/ m) N  v4 M1 X# ?4 e7 [: ]
    stop=False#感染过程结束的标记
    * U/ h# t3 d+ R1 j, L; Utemp_time=0#第几次感染
    3 R: O6 }6 i8 Jtemp_len=0#本轮的感染源数量初始化; ~% w* [+ ]9 W9 K
    2 N; d. N, Z) c& ]7 C+ X4 h3 W
    while not stop:
    7 `3 z' D& g; n3 u7 n    i=0#记录让每个感染源都传播一次
    1 e5 F; [  ~0 {0 Z* j) W, G* Y    if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行/ ~  t7 M4 a4 R3 f- ^& v+ K* g2 ?* f
            temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量! |% f5 R$ w2 x  L
            while i<temp_len:- O0 D" q4 g% T/ l8 k
                temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间+ W. W' p7 T! G3 @  W1 i/ h
                nei_count=0#下一轮可以被感染到的节点数量
    ( g, }, j8 T" [- [6 U            #生成下一轮可能被感染的节点的集合nei_arr3 R8 ^# y+ x; L; Q8 m1 I% w
                for j in range(nodes_num):#遍历节点* i( X+ _9 Y+ i6 I
                    if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染
    " s# T& x! `0 l* M                    nei_count=nei_count+1#下一轮可以被感染到的节点数量++
    ! |& R" M0 J3 H$ ~% A! O            nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
    ) D. l& t" s: D            t=0
    + H- V' F+ o3 O% Q5 b            for j in range(nodes_num):
    ! M/ }& @1 L8 Y& m9 L                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    * g9 i4 F2 N1 y0 K0 E# z                    nei_arr[t]=j+1
    ' l$ m  E/ L! o! T( ?                    t=t+1
    ( I$ I/ a2 L: |# w; ]% a/ Q" k            ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组, n, ?; g4 Y4 K  ?# O
                                            #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象0 Q3 i1 |' S) q- o8 H6 @0 P% @
                if len(ran_infe_arr)>0:#存在需要被感染的节点
    : B1 B& z1 q+ Y; j9 D* Z                t=0#让ran_infe_arr内每个感染源都被感染% V/ F1 ]' Q/ j. H- z! t0 F3 S
                    while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染0 t! K6 M6 M+ m5 {. `& m. S
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态- ~$ ~1 |  r3 c6 l3 i8 E6 _6 l
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
    , p& R: N5 Z  L) u/ J                    infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中
    * ?% r) y8 S+ ]; V5 }1 [- e: A                    g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色
    : F* P( ~9 ]  k$ A* a5 y9 l  U                    plot(g)#绘制3 n# e* E# o, m, b
                        t=t+1
    4 _+ {, D: e0 C% c* y            i=i+1
    * R# Q- L1 P- e3 O    if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染* q' ?; W" w: {) a
            stop=True
    % V( i  k; {# \; r; \" C
    ) U, ^1 n5 R1 L, x( S6 U" |, H/ ^+ y6 S4 z
    视频演示bilibili传送门8 W; C: z' u# {, S3 l% t$ n4 y6 r
    效果图
    " m3 w' Y: }7 u- _, ?6 h9 k! R, w( t) i' ]
    , i4 s5 o, F- q8 O* r! @
    2.jpg % d6 I& n* i  x. |6 u: d. I
    , _% B! G  h2 n3 O" Q
    3.png
    ; i) o, ]: u0 C' k3 h3 |. f. v% ^  c, f4 u9 H
    4.jpg * w7 B- `4 d0 h9 o' D" n( ?! b* W. d
    2 l2 t/ W! D  s# R3 L
    5.png
    0 Z  z/ `( I( @( z" Z$ [/ Z( ], \- p0 R/ v1 ~
    6.png
    6 u2 J; G5 D6 m! C5 H0 P
    + O1 n* m# U! e- c 7.png ————————————————
    & E( z5 ]8 |7 K6 S版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    , h. Q. ~- f+ v; y) I1 a2 G原文链接:https://blog.csdn.net/wdays83892469/article/details/808788624 d) v7 A* }4 Y) c
    % U4 R3 D( R) D

    - r5 J( k7 Y2 M) x. t# U& Q
    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-9-10 11:34 , Processed in 0.550897 second(s), 58 queries .

    回顶部