QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3094|回复: 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传播模型
    9 `: D8 k+ T& L# H#SI疾病传播模型的原理. f" P5 `  M, v' X
    在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类6 Z2 w/ }" ^5 @3 M# Q
    : i/ \( f' w- `, c; }7 \
    易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。. R& U8 z' O; I& r0 O: o
    易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。
    * f# W% Y8 v: G& T9 t+ ?移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
    # f9 @; Q+ [* D, k$ NSI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个1 l' b1 M+ R3 ?  }3 |4 g# B
    即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。
    - W, {. K: m* p# S6 J  e8 [在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有
      B# x# h2 ?( C9 I% v$ Q1 u, c6 cS(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触3 s9 B/ U8 L6 V# u: F. [# ^8 u2 C
    会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在
    ) L/ S6 O+ N6 b2 {# x  D! E/ d感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少
    & b% \$ Q& E( Vds/dt = -β*S(t)I(t)/N
    # s  `# |; _* v" e5 k同时,感染个体的数量会以与易感个体相反的变化率增加,: ^- K0 U) q+ P# z
    ds/dt = βS(t)*I(t)/N
    3 c. M; |" j7 a: P: C分别将时刻t处于易感状态和感染状态的个体所占比例记为,
    # ^4 y, [- a5 Gs(t)=S(t)/N, l. I/ A) L# Q5 `  N! z% L) }
    i(t)=I(t)/N' r. c; {# p3 `9 I! }3 Y2 {% F5 ?% d
    显然有,
    6 X0 [: O, D) R( W" zs(t)+i(t)恒等于1,此时之前的公式可以记做' i, p9 v5 y! ], l
    ds/dt=-βsi* w  n4 k5 B, V8 x
    di/dt=βsi
    . A6 C7 G6 K# v4 h6 M- F/ s
    5 a& g; R' K: Z7 ?' R( k& Pdi/dt=βi(1-i)0 Z3 R' x$ [* M2 t
    上式也成为Logistic增长方程式(Logistic growth equation),
    , ?: e& o; \) O" h9 M' s5 r方程的解和图像如图" X" c: V) B" {- B* m
    1.jpg ) X) S7 d, \+ j0 U6 }# N: C' D/ k# u
    代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ
    ) d" H* i* p/ r. E+ f提取码:z448
    / A- w0 I$ L8 A1 h
    & \0 ~6 W" H' A& D# c: b5 n" A6 J' S$ U# y: `9 a
    '''% L& K3 K1 c6 [
    实验环境Python2.7.13,igraph包,cairo包,numpy包
    7 ^$ ~6 M! ~9 ]( ]9 z''': K0 Z# q; Y, g
    # -*- coding:utf8 -*. n5 [8 N4 k' x; s2 D! E
    from igraph import *; b7 ^8 \" A1 U" e. n: |" f
    import numpy as numpy
    7 t$ ~$ q, B1 kfrom  numpy import *1 G6 a# U( X/ P& ^* v- R9 b' c' a% v0 A
    import random
    ! q2 n( ~  n0 y0 S& T: {1 c: S# B; M+ d! H( e, `5 A4 @' q
    def len_arr(infected_array,nodes_num):#获取感染数组长度6 b4 r1 C( B, E( \' @( D# g0 y
        len_value=0#初始化长度6 q8 T9 t. U8 Z! A4 W" X) s$ V
        len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)6 y' w# V% M' \0 I3 ]
        return len_value
    : X: e' @8 ^' q* R+ o
    0 j- `6 L" p, Q- H- |g=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)
    + i9 k$ }$ K9 G; O- gsummary(g)
    & s) ?" S! M* j# ]# l! mnodes_num=g.vcount()#统计图中的结点个数. E4 O# s+ S* ?' M/ _0 l
    net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat# c/ \" P/ m$ ^& j$ r% a  G
    g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色6 s2 h. r: p# Y) P
    a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a% U  W; J8 q4 ~4 \5 V6 _; Q
    nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)- H* B0 {: ?7 ~) ~) L& }
                                                        #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间
    , Z1 Z* ?, V+ j$ |# R7 E( Kprint(nodes_state)( U( g, s2 ~: n
    infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数
    ! r) {6 f. N7 E0 h0 \print(infected_array)4 X8 v5 K: j  q; d& h1 X
    0 n( B3 Z9 n, I; Z
    infe_rate=1#传播率(感染率) 1代表邻接点100%被感染
    9 @' T  t8 K% e$ q$ _- I  o9 M, hset_time=2#传播次数(感染次数) 2次/ I4 D3 ^! G- _, t5 A* Z8 p( Y
    source_seed=1#感染源位置
    , B9 z( H! J" ~nodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1  g& N0 b" j- k1 s
    nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态
    ) ?; m: \' I* U- t6 [$ k$ ]nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1& I* w; M' _. W; u& K4 K% c
    g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
    1 L: |; |! i2 e* `2 X* `infected_array[0]=source_seed#将感染源的位置存入被感染节点列表# x( T: J5 ~7 p  U% k9 {
    plot(g)#绘制" s* F9 O6 m7 B) [' \4 v1 v0 H; q

    5 n! W- |6 z: Z& N" Q# Vstop=False#感染过程结束的标记
    % i) }* P; L: Gtemp_time=0#第几次感染& v, \& w. y/ ?: x- B4 H0 E6 \
    temp_len=0#本轮的感染源数量初始化4 G. q; R: O" W3 t
    * \5 b4 `1 S2 R  B
    while not stop:
    - u! j6 Y/ _  |8 @+ t# s1 N6 z    i=0#记录让每个感染源都传播一次
    ) G1 O* y. T2 Y) c) R' {  {    if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行
    9 K" x6 Y) b. w, d" r        temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
    ) z  L. b  [. U6 l# p: |7 a        while i<temp_len:
    / K) n% I4 ?9 u+ c& ?4 ~* B            temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间
    1 M( J8 l% J$ _' E            nei_count=0#下一轮可以被感染到的节点数量
    9 `% o) G9 d) @1 V8 Q' ]            #生成下一轮可能被感染的节点的集合nei_arr
    , B; b3 a, c; F            for j in range(nodes_num):#遍历节点
    5 J3 `; A! l0 X; {! C0 _0 ^                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染
    / I; h! \. u9 u' U, i) N) U                    nei_count=nei_count+1#下一轮可以被感染到的节点数量++
    & X. v; I# w8 K4 L1 Z: ^- W            nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
    & T) x: p( }/ k7 h" F1 W$ e" H            t=0
    , w7 T: D  R' M# h. \/ e            for j in range(nodes_num):
    2 i4 a4 A/ K4 g7 G5 T                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    7 M: n1 |0 Q' H' P5 S7 ?* f# E                    nei_arr[t]=j+1
    1 j& x9 ^' J4 U1 o0 m; r                    t=t+1
    ! H- P2 \% f; z! M6 I& [" I            ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组6 R2 E6 m6 B& B# o- R4 Y
                                            #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象
    % M: Z! l% W8 N            if len(ran_infe_arr)>0:#存在需要被感染的节点0 j# _3 X: v. ^+ d% I; @
                    t=0#让ran_infe_arr内每个感染源都被感染7 m7 H: E, c! T  `
                    while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
    + j1 U3 F$ O) G8 s) O% D' c0 ?4 B                    nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态) p: W- X4 @6 U' j
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
    ) z* k0 X! R# Z! O, I0 a                    infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中1 A3 o$ U- k# M' p7 L- t
                        g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色" A( {$ h' v- ^' n
                        plot(g)#绘制  H, D( p( }# ~5 m3 e& R
                        t=t+1
    - v2 |2 f( O: D            i=i+1& h( W) d- P$ S( W' R* p' l1 k
        if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染
    ) A% g8 [5 K& R  O9 g        stop=True
    5 p8 m/ |6 D5 @1 v0 W
    4 ?% c# }; w- W, J% O2 P2 D5 L/ X4 s
    视频演示bilibili传送门
    # Z7 r8 I+ u9 B& B$ j* A9 {效果图9 P2 @/ [3 y. k/ L: L; h

    5 W! F6 A  b& N; e0 R
    % S. l8 B7 n; G: i 2.jpg % a9 n9 r5 I2 M$ t$ A- c

    + s6 {) V- k0 ]0 X 3.png
    # V" S' O6 t) x; d3 T7 w8 n4 Z) m8 d$ C. C/ I+ ?7 t
    4.jpg - q8 X7 c2 p4 U! r0 f
    6 Y8 ~3 L0 o/ y% X. y
    5.png
    8 \8 \2 o6 P( y) O8 i! Z" e6 E4 v$ e* B) G! [: E% [
    6.png 0 K3 W6 m, T& F7 ~1 h+ U/ L
    ( P. f; d6 }; N, v
    7.png ————————————————( u9 q8 ?% s; X6 p
    版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; K- ~' p% \6 _) Q( d* O8 c原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862
    + I& c- W$ c. B) E& B" |7 K: f% U

    5 C2 @1 ^. M: p* O; f* U0 _8 s+ A
    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-6-9 10:22 , Processed in 0.273257 second(s), 59 queries .

    回顶部