QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3149|回复: 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 v- y9 n6 o2 X1 T
    #SI疾病传播模型的原理
    1 F" C0 u; T  p5 [( v+ `; i" |在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类, w  H% j6 i: V" ?' ?

    , s" [+ T8 I$ S4 h易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。
    . Q3 L. y  p9 _% Z易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。" v+ H1 p  q2 N* h0 b
    移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
    : E+ l5 T( g( e8 S7 V2 [SI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个
    $ t- M) ]3 W; ]即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。
    + G. l6 W. M# \" S. {) i在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有
    $ r5 M9 f  F6 O& F9 d9 a1 mS(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触/ h8 N+ N5 s- ], m" Z/ t
    会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在
    % z9 {# _: i2 ]2 N感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少
    ! R% c- a! g  ~# Rds/dt = -β*S(t)I(t)/N6 o/ j: S6 @$ y0 }: E; z. z
    同时,感染个体的数量会以与易感个体相反的变化率增加,5 k' ]4 n, Q4 ~% e! c
    ds/dt = βS(t)*I(t)/N
    5 n% {+ t0 e) a& R1 R8 m, Q分别将时刻t处于易感状态和感染状态的个体所占比例记为,1 P* T- c$ ~0 W, \+ \: O  c' e
    s(t)=S(t)/N/ v* t( [# A( Y4 V6 }/ \
    i(t)=I(t)/N
    * |/ n! X4 ?/ q3 F' r! ^/ u7 l显然有,4 y% x! w5 P1 \' w
    s(t)+i(t)恒等于1,此时之前的公式可以记做
    + `" W$ {- t9 J. R/ z8 ~  g- w2 Lds/dt=-βsi
    ) l7 s8 i3 x! Bdi/dt=βsi
    ! v' M* g0 u/ ?1 o" U* M; z' v. F7 \/ \8 ^/ ^2 O
    di/dt=βi(1-i), i- U1 c; s3 B9 N. w3 X- O
    上式也成为Logistic增长方程式(Logistic growth equation),/ L! O$ q. u" e% j3 `5 X9 F
    方程的解和图像如图) l; M- U1 V1 K* d+ ~% n
    1.jpg
    + e1 d' u9 Q  {+ ]7 O( J代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ
    1 Y& e! m- L4 A; ]. W1 f7 _5 u6 M提取码:z448( h! I5 M! E7 ]3 g: o
    2 E7 t$ O% w; G) P( w. \) O$ h
    ) {/ z9 o6 Z& R' }9 ?
    '''
    % z, {4 Y' J- q: e  I" {实验环境Python2.7.13,igraph包,cairo包,numpy包
    ; v3 [6 k7 v2 p) L7 h- R& N'''
    7 F  I- S! W# l3 y% ?& f# -*- coding:utf8 -*. w" a+ i9 v8 q: M
    from igraph import *& O7 v4 H/ O$ U" H' Y
    import numpy as numpy8 w7 n9 l% U9 x0 q; k6 Q
    from  numpy import *
    $ t, h# Z  u* C8 ^import random
    5 y* e- M4 ?' G7 f
    ! S  X# Q- D6 j' @$ k5 S* d! odef len_arr(infected_array,nodes_num):#获取感染数组长度9 C# c$ }4 y. D3 Q
        len_value=0#初始化长度& |) x5 c2 G  @# o% o8 F$ u9 _
        len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)
    3 C, ?' O& I/ L0 z    return len_value! j% v/ u/ ]! d, j, x

    7 U# }) t! ]- {* ~% Y! w% _1 O: Cg=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)" V) e7 q4 \6 ~( B. S. t2 x% h% l
    summary(g)
    4 t1 {0 Q9 D/ |# n2 l9 o, ^4 t. inodes_num=g.vcount()#统计图中的结点个数  l+ O3 ?) S$ c1 p: I9 S/ ^, ~
    net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat
    . ]9 y4 p2 [5 N) hg.vs["color"]=["white"]#给图的顶点序列颜色赋值白色' K9 d& Z$ R1 |: s4 O2 \1 x
    a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a
    & o) ]; I( x$ H' ~& P& ]" e6 E5 Bnodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)6 g- Y3 W' t4 D# E  b
                                                        #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间
    5 b2 t( b2 R4 X4 `3 Vprint(nodes_state)! K) p8 G" q4 I( y+ `4 [
    infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数; ]# S% q. s% Y# T+ b
    print(infected_array)
    " q$ T0 G, u( v: D+ N( L3 `
    9 V7 v1 |3 b9 P: C' l) Winfe_rate=1#传播率(感染率) 1代表邻接点100%被感染( R) |' x! B8 V  ?
    set_time=2#传播次数(感染次数) 2次6 c3 P# Z/ N/ W3 d/ F
    source_seed=1#感染源位置
    5 ], e, e6 A% Y% ~  y" Knodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1$ x3 B( z: o$ u8 U# r6 ]! p) `
    nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态0 o9 z7 ]4 W5 q) V* p8 q/ L
    nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1: G6 v9 E$ p1 V' G: {6 Y( W% ?
    g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
    1 s8 `, `& W! r: V9 `infected_array[0]=source_seed#将感染源的位置存入被感染节点列表6 M4 h  j0 ^% h% l& ^5 s
    plot(g)#绘制
    ! L7 t9 O2 Q' c& q% }+ a0 x* D6 e9 G( }. Y: s9 F
    stop=False#感染过程结束的标记
    % }/ S. f. D$ Y* W- p# b. n2 d1 htemp_time=0#第几次感染+ x5 \0 L* f/ \( s
    temp_len=0#本轮的感染源数量初始化
    , ^* e0 D, X3 V5 O# f$ v. U1 r$ Q( J, K
    while not stop:# p/ T/ z# i+ q: \- _  B
        i=0#记录让每个感染源都传播一次
    2 \8 ?0 O* E) b, L2 @    if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行+ t6 x6 D5 w9 l! |0 ?" m/ S
            temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
    9 S! ?+ d% ^4 b4 G3 X# |6 u. H& e2 d        while i<temp_len:; z5 z7 M! s9 c
                temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间
    ( f" D3 l) ^( t, E( v' Q; w7 ~            nei_count=0#下一轮可以被感染到的节点数量
    . c! @) ^5 ?. l  X% T/ f6 \: e            #生成下一轮可能被感染的节点的集合nei_arr1 }; d4 f2 |# k$ n
                for j in range(nodes_num):#遍历节点1 D, j5 ]8 n/ }: K$ H) d
                    if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染: O/ R  t& D: T0 K' ]
                        nei_count=nei_count+1#下一轮可以被感染到的节点数量++
    3 [2 l3 U+ k. k& H4 }            nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
    , l8 `+ ]% N) `: p5 H3 {            t=0
    , K. ]. B, D( T" z            for j in range(nodes_num):% `' r! h' X5 i6 h6 g+ f
                    if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    + a/ E3 d) y4 ?- i- |, [                    nei_arr[t]=j+18 _! E# p. t% f% K' o% _* r& x3 L
                        t=t+1
    5 E3 B' c  J( ]  B" h$ X7 U            ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组
    9 R- m5 B9 G& r4 o                                        #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象# O& j/ M( B6 E/ [( ?# i; K
                if len(ran_infe_arr)>0:#存在需要被感染的节点
    $ H8 G5 F8 L* n5 a+ O                t=0#让ran_infe_arr内每个感染源都被感染
    " R( D, H; M) h. s/ M6 |" E                while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
    - D5 t' H/ s( f) K! x% a5 w                    nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态
    / ?8 b  Z* H3 l                    nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间5 W- d- h8 g. Z
                        infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中& ?" j" ?& N- C
                        g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色& ^8 m% T; O  b4 J/ }' P
                        plot(g)#绘制  E5 f8 G# o9 x& Q$ R: ^- J( k
                        t=t+13 W3 y9 E* Z- Z$ l
                i=i+1& o  Q' \8 {  S% S
        if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染) `" M7 E% Z' X: I9 g3 E
            stop=True
    . n* I) b: T6 A! x' o9 {* w6 Z# a) f( i2 z$ I1 _4 H, S
    / T9 f& V! T# {: s0 P5 z
    视频演示bilibili传送门
    ( D$ y* i0 }* r$ a效果图, J( ], Q" ~- G2 x# A

    * z3 e5 u3 v0 @9 H% Y$ u6 R1 p
      U: }$ Z/ x- A# h3 `7 O 2.jpg
    & k$ J. {: M* M! B" M9 h2 O- A1 |" A' `
    3.png
    * I+ \# r( D% Y- W( `4 o8 G4 B, w. y# X" H, m: X! l
    4.jpg 2 U5 H6 u# P" T' ~4 E; g- q
    # z6 g4 q) f, H1 S  X; c2 t9 g, u
    5.png " J- J3 w, X! `$ W0 ~; g
    - ~6 H' o3 K8 j  c4 e" X
    6.png ) c3 m' T, ]8 q

    7 D, ?: d1 x5 o9 j/ u% e8 | 7.png ————————————————( _5 K3 y- I; @2 D! Z# v1 k
    版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 ?: M2 }) |% u5 Y5 V原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862
    % c0 N0 s5 B& \) t& g0 ]: r+ W+ S: N. w* Q, k7 |/ z, i

    * h8 N0 V- d5 T* y# s# g
    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 10:39 , Processed in 0.422340 second(s), 59 queries .

    回顶部