QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3119|回复: 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传播模型
    + m/ E' Y6 s3 T#SI疾病传播模型的原理
    % K3 ^- K! q$ i  v在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类6 s- {  l$ P, d" o2 }" }

    . w- [0 D) y; n; w易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。) x" T! k- `5 v% O3 v
    易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。# W, X. C, R$ {# Y
    移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
    . x8 t# |# B/ K2 YSI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个
    ) e9 r$ z/ F! I, a6 a; k& h即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。5 Y0 P: ^" @$ f4 U6 N4 K; p  @
    在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有( w6 p! X# h# `! z6 D
    S(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触7 C: }3 }& s* T$ l
    会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在
    9 f3 A( O0 D5 O感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少
    9 P2 _5 h2 M8 \ds/dt = -β*S(t)I(t)/N
      G4 y: K( p* L& T& e: W5 {/ f同时,感染个体的数量会以与易感个体相反的变化率增加," Q+ U( C8 {( `5 ]. }6 l! {
    ds/dt = βS(t)*I(t)/N
    8 |7 {3 l6 w! M! S分别将时刻t处于易感状态和感染状态的个体所占比例记为,  P8 m) e  R* s* m8 _- G' e6 L
    s(t)=S(t)/N8 F! U# [3 Z; ^7 k/ w$ X- c
    i(t)=I(t)/N" z* g3 X: y2 `# V
    显然有,
    ( s$ `/ L# h, n0 @s(t)+i(t)恒等于1,此时之前的公式可以记做" l4 \) g0 ^6 j/ }- V' s  z
    ds/dt=-βsi
    0 x- u) T/ ]& V: P' u4 ]# pdi/dt=βsi# z+ A7 H( G0 g/ |  P# S9 E

    % c1 k3 z! Y+ ]% W  Ddi/dt=βi(1-i)3 C3 v9 X, \! F2 ?& O: R
    上式也成为Logistic增长方程式(Logistic growth equation),' j$ K- i$ x; g6 f+ y
    方程的解和图像如图: B/ w2 R, x- q' T
    1.jpg * y7 o9 F) p. i9 h! ?. z
    代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ
    1 _/ U: H+ r' F2 h  ]/ \0 W! F+ R提取码:z448
    7 J# K9 d2 z; g6 S: O( @; N$ v( U/ m
    # s1 |9 i4 r9 F' m0 |* v0 z. N0 N- }5 G; |5 F- E  k
    '''8 w/ D: ~, Z9 v3 w9 s, e
    实验环境Python2.7.13,igraph包,cairo包,numpy包
    8 k3 U$ {  \$ K- |, Z$ m' f'''
    ( f. x$ Q4 J# a3 B$ x  G# -*- coding:utf8 -*
    0 T0 F( q8 Z/ g* @$ Gfrom igraph import *
    1 [2 i6 z" {% C3 w6 Zimport numpy as numpy
    / ~8 _" J1 v% {from  numpy import */ x# y" J' R3 }% }' L' z
    import random
    , s: {- Y% r8 ?6 a; R+ e' L' K# Z$ O
    + C% ~/ d% u. h$ L1 `4 S! Jdef len_arr(infected_array,nodes_num):#获取感染数组长度
    4 [, p, J) L  `3 B. m- `    len_value=0#初始化长度, Z: q4 X# @7 s/ o3 ~
        len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)% E2 d+ M( s4 _# ]& ?: v9 g3 i
        return len_value$ Y3 V8 i* q: T
    ! w! @0 J. e3 n3 A# u
    g=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)& N. _" j! @2 ^2 x0 W( I7 t; d
    summary(g)
    6 U2 i; p( A% }$ Unodes_num=g.vcount()#统计图中的结点个数# `' K" H$ u1 O9 g# I4 s: m  W$ ^
    net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat" _! h' v) [! o8 R
    g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色# N! g2 m( J1 f
    a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a
      J6 G6 r% B& C, _- q8 W6 lnodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)
    8 p9 O8 L" P' ?' X% _6 J                                                    #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间$ D; b$ u. X7 n4 v8 U7 f
    print(nodes_state)" t4 z# l5 U  S2 @: Q
    infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数
    8 S! L3 F% g1 `5 Gprint(infected_array)
    + n1 ~3 b" E! a; R) _9 V# m$ d% r0 P3 S6 B" Q
    infe_rate=1#传播率(感染率) 1代表邻接点100%被感染
    . s: R+ n8 d/ |/ N' z+ \8 e: ^set_time=2#传播次数(感染次数) 2次
    7 O9 L5 t4 b0 R2 y! i3 |; `source_seed=1#感染源位置
    4 n" u0 Z8 }# M2 T2 lnodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1, Y8 ]5 s9 P3 v
    nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态* i( M9 a2 K" [1 Q
    nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1
    ; d  w: Q8 t) p* Mg.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
    $ {/ ]+ K$ `' k& J, r4 ?* Tinfected_array[0]=source_seed#将感染源的位置存入被感染节点列表, B8 Q2 M4 T1 U# R: C
    plot(g)#绘制3 x" @) C8 J2 _
    - s! m4 q% ~% n* n2 f( ]( v
    stop=False#感染过程结束的标记. _! I% h# G2 W: C
    temp_time=0#第几次感染' F3 P8 Y) p5 L# K* t
    temp_len=0#本轮的感染源数量初始化8 o6 C4 W3 C: ?; c  I; k& n

    1 v0 [+ j% L: Q. S( vwhile not stop:
    $ b; {( J, e9 J  \$ g# Q' N2 x    i=0#记录让每个感染源都传播一次* j/ ^3 Y& h0 @3 U
        if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行
    # U+ q7 I. q. N( J+ e        temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
    8 x1 ?3 e8 I5 c; b        while i<temp_len:
    # U6 i% X" H, u* m5 A  B6 m" G            temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间9 R# Z" m/ C6 D1 @/ A
                nei_count=0#下一轮可以被感染到的节点数量
    & j1 Y6 [: d1 T; V' S) m            #生成下一轮可能被感染的节点的集合nei_arr+ h9 o- `6 I8 b/ H; t. A! _6 u2 a9 v
                for j in range(nodes_num):#遍历节点
    % Y, l5 n/ x6 L, W- Y                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染
    " a( K, w7 B' e# q9 q" n                    nei_count=nei_count+1#下一轮可以被感染到的节点数量++& M( E  d/ O, k- L! {, j0 c
                nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
    5 _8 o2 r  p# x. }            t=05 G, J' m# @5 c  ]/ ]. u4 p- \* Q( T
                for j in range(nodes_num):
    ( w+ W9 r" _* ?5 o5 I% ~0 N- _. H                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    . k9 ]- U6 z3 @: f% i3 B( f9 x                    nei_arr[t]=j+1
    0 u) u& ]+ P$ a% h                    t=t+1
    1 Z, s$ p3 v+ I+ ?( _            ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组
      n. v$ m* K' w$ K# @; [) G. Q                                        #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象
    " U5 Z. d$ f3 T2 F: p9 q0 `            if len(ran_infe_arr)>0:#存在需要被感染的节点, M9 A/ O! Y. e
                    t=0#让ran_infe_arr内每个感染源都被感染
    ) Y# U3 U; w5 r) j9 q+ E7 w                while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
    ' U+ w8 N; o+ O+ V1 z' b" M- ]                    nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态* A0 @: s! R+ g, n! X
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
    ' e* x% F# ^  f/ [$ ]/ W9 U                    infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中3 f; B+ C: ^2 [# b/ f: P! S
                        g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色8 o8 p1 q/ z& F! \8 H7 h
                        plot(g)#绘制
    . n: P! q6 a* C% [                    t=t+1- J5 C2 k8 p. o, E% G: t, t1 g
                i=i+1/ k* Q$ P. D9 d" @" E! s" B
        if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染
    ! a, K" `. q0 \0 H        stop=True 5 T3 Q7 _1 _' J2 u
    : w( H* L1 R: a" {" f% b

    # X# s8 E* X0 j3 y2 m5 C9 c视频演示bilibili传送门
    . x1 j" ?4 t  L效果图8 q; K6 }# c  M: |

    : j& ~4 e' k. E/ O( h/ Z  U2 Y# [; Z. t% c
    2.jpg 4 R; b. @. _: T1 m& }
    - @' X1 z4 ~. h9 R. L2 ~& @
    3.png
    , }$ v# Q8 E! s5 d* d/ {; n" ]5 a
    4.jpg
    , g% d  u- T+ W, S5 m: K- ^" M! h1 G- M
    5.png ; p$ U9 v9 K$ R( ~7 q0 y, n
    ; S& ]" _% q2 w8 v9 s4 Y
    6.png $ ]4 s" A. c4 y6 j

    . f1 X2 q2 N1 `) n" L 7.png ————————————————4 E! R* G0 ?: J9 |
    版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 Q8 F1 n& A" H! ]- d原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862+ C; Q7 g2 d0 Z3 i) K( x

    ; y9 C9 E) a; n) [+ E, U  v# c0 Y$ B$ d2 `: d9 y& h  i
    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-7-26 03:35 , Processed in 0.395746 second(s), 59 queries .

    回顶部