QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3066|回复: 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传播模型
    / d2 W1 J8 X* C4 H1 e- u( N#SI疾病传播模型的原理. \. \/ {* m3 x. P4 J
    在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类
    4 P2 c7 K. }8 p( Q2 B
    / j, D9 b5 o  y/ G. Q' v4 A4 M' t易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。* D! @1 }$ S- ^  ?
    易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。
    . t$ E$ q8 `$ J# X% p移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。! x4 t( x# Z! R% b/ }
    SI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个
    7 f0 g" \! v2 g9 Y7 Z即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。" z3 z' A4 i; P) H
    在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有% p2 R  D5 H! o. n' z5 f6 `
    S(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触
    ' O5 f4 d: t  P$ u) P9 c( z会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在9 B5 r% l" Q7 l( I. p
    感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少
    4 E2 P/ Z! O7 P  y8 Z; _ds/dt = -β*S(t)I(t)/N0 J# w7 Z4 h& C# {
    同时,感染个体的数量会以与易感个体相反的变化率增加,
    8 E2 y" y" _. `ds/dt = βS(t)*I(t)/N
    : U- h/ ^' o. r. {) M7 \% u  w分别将时刻t处于易感状态和感染状态的个体所占比例记为,
    + g5 G# `  J* Os(t)=S(t)/N
    , L3 n; N/ X/ J! P# }% _$ ^i(t)=I(t)/N( v3 R' r9 y! ?- p4 H" O# U5 Z( Z  Z3 U
    显然有,
    5 S  y5 h: b9 c/ f  n5 M3 \5 rs(t)+i(t)恒等于1,此时之前的公式可以记做
    - P+ V: m$ @8 H; e0 F" v3 Hds/dt=-βsi# B. T! D6 S) i/ H
    di/dt=βsi
    % q( P  }+ P/ }# J- Q( t% y: s  J* x6 U6 {4 j5 P  h
    di/dt=βi(1-i)
    & b$ m3 Y" C* e3 l. ~; q1 f上式也成为Logistic增长方程式(Logistic growth equation),+ b$ D1 {  I  b0 d
    方程的解和图像如图4 w4 f/ ?5 i4 Q
    1.jpg : b9 G+ y- O5 _; l7 d8 N  m
    代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ
    8 f8 u) F0 A# S4 F! f提取码:z4481 T9 r: R! x% H4 B, l: r

      J" d  r+ F, o6 X
    % Q# A2 F& T) n5 z''') G! _% C0 |: ^, ^% E2 F" s+ I
    实验环境Python2.7.13,igraph包,cairo包,numpy包
    ; h& [- j, ]" m$ u! i. J3 I'''
      `! R+ F6 L  Y; K% D/ T, q# -*- coding:utf8 -*. l2 p& k9 i+ y  O9 G1 R# O
    from igraph import *
    ; i' b. m: X! D! S# B& x% U6 V* zimport numpy as numpy
    ! ?1 a1 o4 _: S: M) ?5 Efrom  numpy import *+ D5 N& ]1 n+ z
    import random
    6 i+ f) t0 W  B# a: U/ I! @8 a4 f0 `9 m
    def len_arr(infected_array,nodes_num):#获取感染数组长度
    1 F* ~: P) d  f7 x3 {/ m6 j    len_value=0#初始化长度! _& {) b$ A" p5 g
        len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)
    % U$ |  O  q4 t    return len_value0 r5 `! z) a$ [  ?3 q+ W  h& x

    ' x9 V: x( ^9 @2 a: S$ T" Ng=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)0 Z5 }5 Z: T6 y+ r1 k. M
    summary(g)
    $ F3 r" x1 n5 Z% h/ N& @" \# H5 Ynodes_num=g.vcount()#统计图中的结点个数
    2 k4 Z2 J- `- v3 r: V. L- Pnet_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat
    - P9 x1 K& ]" \' F& J$ L" }1 qg.vs["color"]=["white"]#给图的顶点序列颜色赋值白色* q* _+ Y/ F. M# q
    a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a
    0 r# N2 q" ]. o3 u7 \" y0 Wnodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)' M5 Q5 @) U9 p% M, ?
                                                        #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间# q1 S9 n( M  l
    print(nodes_state)! }- D5 o9 }3 J. m% z9 e  u
    infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数
    9 P5 T' b+ k' ?2 p: f* H( Z' Oprint(infected_array)2 Z& I/ f3 z+ V' u5 ]; n; v% j

    ) b" r) U; K9 U8 J" rinfe_rate=1#传播率(感染率) 1代表邻接点100%被感染, \( r% b4 u8 C1 V
    set_time=2#传播次数(感染次数) 2次1 H8 Q( t6 J  c* `2 N  ~: _
    source_seed=1#感染源位置
    7 L% ]/ m" `5 ^/ i9 ^* Wnodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1
    " S  H$ ^8 e$ j; x# C* }nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态5 z: _) L- l- w+ h) H* U) e" L9 n
    nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1
    + m2 i' I9 u# T9 s) m; Rg.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
    5 P9 Z' o4 T. O% |0 R* pinfected_array[0]=source_seed#将感染源的位置存入被感染节点列表
    $ U4 O7 }; `" e# Hplot(g)#绘制
    % W( n, W* z# c0 p0 F  u, r
    1 d' a* ?# l- `2 |( b7 a- xstop=False#感染过程结束的标记. C  Z- f% U8 v7 D; t% V4 k4 i
    temp_time=0#第几次感染
    ; }; q1 ?3 I  Z. J( Z) }temp_len=0#本轮的感染源数量初始化$ |" N1 Z- V& C& A3 ]

    ' K. G7 |. P; m7 G1 D0 Y% S  R8 j0 qwhile not stop:
    7 V# E, Z5 z$ m2 u    i=0#记录让每个感染源都传播一次
    ( P$ w$ |5 F# |% |1 l' G& [. n    if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行3 o8 T% X* G8 G. g8 Y, F2 i: M5 W2 f
            temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
    ' s  m/ \6 T* J- U        while i<temp_len:
    ' W3 w) ~# v' s# y8 z, l            temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间6 J6 Y$ K6 r! |2 T& O
                nei_count=0#下一轮可以被感染到的节点数量1 C( p0 t: `: R% }
                #生成下一轮可能被感染的节点的集合nei_arr
    ) `4 I, }$ I, F* z" ?            for j in range(nodes_num):#遍历节点* t3 i, V) C* x
                    if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染6 z/ z3 L( ^7 y* I4 g+ f; N
                        nei_count=nei_count+1#下一轮可以被感染到的节点数量++
    & _. O( p" e2 Z0 V            nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染5 O6 ]" B+ G" B8 u# T) t! E
                t=0, N. q' J! F6 p8 A7 |5 d
                for j in range(nodes_num):" M0 w) x3 `! a# w# g
                    if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    4 E; Y, S7 }9 \8 i5 ?                    nei_arr[t]=j+1
    ) m* y( S7 k" b: r                    t=t+1$ Y) W. ~7 Z  `$ f/ v& l+ o! T. ^2 R
                ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组
    ( H  {; f3 g- R% x                                        #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象
    $ G( e; D9 k% S7 A  ]            if len(ran_infe_arr)>0:#存在需要被感染的节点
    0 t$ @3 P( \' c# Y                t=0#让ran_infe_arr内每个感染源都被感染
    9 y' h& L  Q% A( u/ s                while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染, r( G& [* B2 h: J& Z
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态/ {' l$ l  ~+ A+ X6 _7 y
                        nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间0 m# r" R& N! g2 I; f
                        infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中1 J4 [6 j7 A: }  o9 i
                        g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色
    ( X; f+ [4 {) [5 ?/ X: d                    plot(g)#绘制6 P! L4 q! |& G
                        t=t+1: D* h9 ?9 A7 r- |; ]+ n" t
                i=i+17 s4 u3 Y  u! O1 D( U
        if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染) _8 X5 n( F, \( C
            stop=True
    0 R* P) K/ m+ S( o4 H
    : M' r0 t. [# p# c( H# d" h) ~  U. j- O' u5 @
    视频演示bilibili传送门2 t; ]7 Q2 \( J( e; W
    效果图
    ) E1 ^* |. e4 _
    ( ~, b9 j( @/ _3 x
    1 O! }: l( ?+ u2 y 2.jpg 8 ?  V+ h! V: L3 Q9 t. F' H- o* Q
    : x& G& G* h# {7 g, \; s
    3.png
    % c( c$ I. Q5 c9 a
    , ^4 O4 T$ y5 _$ o 4.jpg % h4 b4 {/ c% _7 x$ G6 R( `
    / F0 v" w/ {" B5 q# `+ g" E! p
    5.png 6 T9 _. V: O" i+ c& G

    $ f8 U2 ~. ~+ v; M( U6 d4 _ 6.png
    # s1 C, s: X- `, _; P$ c% Y" y$ K$ S$ {
    7.png ————————————————, B0 L0 ~2 A! R) y! O
    版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 l) p$ y) U5 [
    原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862* _4 ^, N% {, d4 l) S: `- g

    2 e7 r$ r) L9 p5 h2 R  g. |# a% Q+ G8 Q8 g; C: B% D( ^4 L
    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 19:58 , Processed in 0.609036 second(s), 58 queries .

    回顶部