QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3065|回复: 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传播模型
    2 M5 {% t7 M4 z# S; `7 D#SI疾病传播模型的原理
    8 ?6 X# U3 t% Z在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类4 d# ^, y8 |7 j3 g+ f

    8 ?1 F% F" V( S. I. {0 k1 k$ M$ ^# T易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。9 K" S1 `. b. N5 m
    易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。# x" _% M8 g0 _& t  P0 c$ g: O% D) E
    移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
    0 @1 w+ v) v; D- X2 ~, x* USI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个; e1 x2 p. b2 D& t/ A: p& a( w
    即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。
    9 M% B. o& Y7 l/ N% d0 x; A3 m" L在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有( S: r' P) N# o! t; x% x
    S(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触, q. Q8 F; e- ^& P5 v  a
    会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在
    % k  _2 Y1 r* g1 T感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少! Z6 P3 G9 L1 [! n6 Z
    ds/dt = -β*S(t)I(t)/N
    , k  J! v4 {( S* ]+ x; l同时,感染个体的数量会以与易感个体相反的变化率增加,8 ^# n( Z$ [- `& e# J2 Q
    ds/dt = βS(t)*I(t)/N# G+ c+ T- a( p- K7 [. m  G  U
    分别将时刻t处于易感状态和感染状态的个体所占比例记为,3 J( J1 o" Q; W: L0 u& h. u" o. c
    s(t)=S(t)/N0 p# l# w& s4 M$ @9 s' j  A
    i(t)=I(t)/N
    / w) Z: I+ S. d显然有,
    ( E% [/ I7 Q& y* q( D( j& b5 |s(t)+i(t)恒等于1,此时之前的公式可以记做
    ; M; v% x/ a5 I# L) t0 ?ds/dt=-βsi
      M- w+ y0 F4 V9 ]" x/ W2 Xdi/dt=βsi* m# D$ `4 a" n7 y. _; q
    . Z' [) g) @0 H; F9 a: Q; t: ]
    di/dt=βi(1-i)# x1 B1 r5 i+ ~: P7 }- v2 d) `
    上式也成为Logistic增长方程式(Logistic growth equation),
    + ~+ @/ a3 \5 k" ?6 k; d方程的解和图像如图
    4 d9 D% N" c- U/ |( L! c9 t/ K 1.jpg
    8 a# u( T6 b2 j7 r/ A代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ. a! C' |7 D# H& T/ ^9 H
    提取码:z448/ X; e: C8 e$ j" g1 ~" q* S0 m

    4 \3 J  F: \0 ~- D- u
    ' l( T( H# L8 Q'''
    $ F/ Z3 |4 ]& B5 i: |! k  K8 D实验环境Python2.7.13,igraph包,cairo包,numpy包1 [7 e: J3 `% H" E2 o5 u
    '''
    8 n' @( z& K* _! P. E5 [- N# -*- coding:utf8 -*9 T5 L6 @( B+ {
    from igraph import *
    ( L" O6 o* j. a$ yimport numpy as numpy+ f( K" s* r% [4 m* y) y
    from  numpy import *1 l7 [; y; O( D' Y8 ?
    import random! H, c* X5 f4 T2 x, A4 B! {8 D" k0 ~7 {

    6 H, t6 D- m- k) g" l# q- C8 Sdef len_arr(infected_array,nodes_num):#获取感染数组长度0 W$ P  K& c2 Z( R. c; q7 v
        len_value=0#初始化长度3 w5 C' N' t4 I0 b+ p7 e' f4 d: H& r
        len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)& h& |3 |4 C+ p/ {
        return len_value
    1 E, K) h& p; K3 v' c+ ^
    # j/ ^9 ~9 K* ]g=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)" ]- m. h, X( m; s3 v. I
    summary(g)& }. C" x, Z( x$ E) c
    nodes_num=g.vcount()#统计图中的结点个数
    , u$ I- B; {& @6 c% Onet_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat! x* j. ]" G8 i% Y3 R) q
    g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色( {1 X5 O6 S  S* h  F) r" l
    a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a
    ! ]0 N& S( c6 N' h5 g% @3 `; Rnodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)
    / E* F3 x" A- b$ E                                                    #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间
    5 v9 w2 |) L) ^1 b1 A1 a% pprint(nodes_state)
    8 Y* N3 H+ g2 zinfected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数* c3 W6 s% H: v
    print(infected_array)4 ~. `) Q% {% ^
    ; e$ y+ T9 }( M! w% a. I$ D4 D
    infe_rate=1#传播率(感染率) 1代表邻接点100%被感染
    : [/ E) Z6 b2 W; ^* ]2 T" ^  hset_time=2#传播次数(感染次数) 2次
    ' c- q8 _' B) xsource_seed=1#感染源位置
    9 ~3 x( r, |; w& T$ }% Anodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-17 X" v! l9 g! F. v+ N2 `
    nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态9 x' ~0 P. m  M$ p
    nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为10 {# F! H& h7 ?8 ]5 h6 r" \
    g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
    / Z$ x) B$ Q  _3 N& S! g5 ninfected_array[0]=source_seed#将感染源的位置存入被感染节点列表8 k5 Q# ?# ^, w3 }- B9 q9 z
    plot(g)#绘制
    " ?3 ~8 W0 ^1 Q6 U5 y0 b: _  J6 m1 P$ p1 L- q; t, y
    stop=False#感染过程结束的标记
    $ A" E; K; u) `: ^' S3 f2 Ktemp_time=0#第几次感染3 h' P$ n( m# N
    temp_len=0#本轮的感染源数量初始化
    . J# f: o& B! [) v, h8 O
    % w" \1 t4 C1 ~while not stop:
    0 `+ u: v4 o: z" |; {# U( v    i=0#记录让每个感染源都传播一次
    ) m: L' b5 P. I8 n/ S' j6 S7 A    if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行
    5 V* m/ ], z- I5 U- l- P        temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
      G: A4 H6 o' X3 P0 @        while i<temp_len:0 V$ p, D9 T) \7 X# O% F) W. x
                temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间
    ( G. l( ?6 a! E3 V1 D, S            nei_count=0#下一轮可以被感染到的节点数量
    ' M5 L8 d5 l  O7 E6 M7 {  [            #生成下一轮可能被感染的节点的集合nei_arr7 M' e! P. Q& c& M& ~
                for j in range(nodes_num):#遍历节点
    - d  \0 \1 b4 j& }  c+ s3 r                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染/ V$ D6 h/ G: {5 ^9 W. ?; L
                        nei_count=nei_count+1#下一轮可以被感染到的节点数量++- ^, o/ w# M3 g8 i
                nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染6 _( |0 [9 g& w) W' }
                t=0' r4 F& I+ o/ `9 x
                for j in range(nodes_num):0 `8 F% J0 F( v# ^8 t
                    if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    4 F. u" Z" K( p- `( h. P                    nei_arr[t]=j+1
    ) B* y3 k. `7 A1 B; O4 y6 F                    t=t+1
    7 i" Z* b- y9 T' E            ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组
    3 a. g  U1 g8 K3 p- @8 X                                        #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象
    " f2 ]- R& ~8 t8 Y* Y( L            if len(ran_infe_arr)>0:#存在需要被感染的节点
    9 i8 E) \7 X  ], b. M                t=0#让ran_infe_arr内每个感染源都被感染" d( C  _' K9 B
                    while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
    ( V2 c$ u" Z3 ?" ]                    nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态  w) T+ n* }! v' P  p. R% x
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间3 l; P1 \5 m; m( t
                        infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中# D0 P# R3 U2 l( d% t& l* W
                        g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色
    ' S  h7 k/ @" @                    plot(g)#绘制
    ' y3 J( i0 K  Y$ P                    t=t+1  @2 a* C8 o' [! V! ]- F
                i=i+1
    8 _7 D0 x: U" P" ~% a    if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染
    / I* H6 f, F# U4 G# u+ C        stop=True
    9 E2 w3 Q) J- e, Q$ M: f  [& C" S' j+ g- m0 _2 }7 Q2 m7 u; U/ A, B

    " a7 n/ m( ~2 H2 e, H( o$ X* s/ W视频演示bilibili传送门
    7 [3 k$ _% k/ `4 ^$ V7 E$ b& c效果图
    . i* F9 V9 V: p% v4 l* Y& ]% c, R: [3 f( r( b/ O0 |2 ]

    # o8 K, _+ E8 U( B/ Z 2.jpg . x( \/ C/ ?$ F8 B2 a
    9 p  G/ B, J1 j
    3.png
    9 q( n( d. z- X5 ^, _, A" ~" k1 N
    ( x: e8 o' A8 U2 Y 4.jpg - n7 K9 l3 n, B  y

    % ^0 e* O) R2 }7 ~* c* H 5.png
    6 P: x5 S3 O( n4 F% q) H7 C: a( X  P$ o3 L6 p! N8 Z. {
    6.png % M4 r' W  d( T* j% ]

    - O" S, N+ A- U3 {! i 7.png ————————————————
    1 s1 \5 z0 @$ f% D! u版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 _5 C( X) Y7 u/ ^
    原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862
    ! s9 e7 Z+ }: p. z3 L  m& O5 G! v; K2 ^2 ]4 Q! Q. Q
    & W4 {; Q1 b  m) `/ a! r- D5 F' c
    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-20 18:16 , Processed in 0.452996 second(s), 59 queries .

    回顶部