QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3099|回复: 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传播模型
    0 G  a% a9 B+ G6 r#SI疾病传播模型的原理0 N  r& [& g1 O* R
    在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类
    ( h  l. r3 m+ _! [! v' M1 `; G# C- }% q$ r+ X' U
    易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。. R) i8 |- I8 n! i7 t
    易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。  ?9 R) }$ q) n' I. U: t  G7 W3 N
    移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
    $ A( [- j: Q' l% R/ ZSI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个
    8 n* a/ `$ f# V即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。
    6 s8 w' w0 H* ~7 o在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有: F2 i+ v* l% j  V% y; `
    S(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触
    & G( d/ `& ]8 O9 j6 n8 d会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在( H" G6 D9 @% [. _8 i, Q0 L1 e3 ?1 V
    感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少; W; W. J# D% L! c3 d
    ds/dt = -β*S(t)I(t)/N' s% W4 E' Y* {( T% T4 i) d! n; A
    同时,感染个体的数量会以与易感个体相反的变化率增加,' W7 v! K8 \7 M# @* ?
    ds/dt = βS(t)*I(t)/N
    ( |' A& ~7 W9 K分别将时刻t处于易感状态和感染状态的个体所占比例记为,  ?8 i  G# F6 N$ {& E% h8 N$ E2 ~
    s(t)=S(t)/N" N+ n2 I2 m/ F" V& p* `0 T
    i(t)=I(t)/N) I' K# S' C& q
    显然有,, ]3 M) f. ~" R# A
    s(t)+i(t)恒等于1,此时之前的公式可以记做, `: y- G# \8 m' ~  l( l1 C* S: q
    ds/dt=-βsi
    ( f, Q: |, I* A  tdi/dt=βsi
    ! q7 z& |5 F3 k  _) ^$ g6 O) E6 @& N' y7 \2 F  a
    di/dt=βi(1-i)
    : z* q7 D: F: f. U6 U9 P上式也成为Logistic增长方程式(Logistic growth equation),1 _! ?, ?# d* I5 A* v
    方程的解和图像如图8 a! r0 Z9 ^& Q. |
    1.jpg 2 V, u5 o- w) _$ w
    代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ; [' ]( U5 J9 H( x9 o) N
    提取码:z448' @, D- Z! ^; [0 U
    2 S2 T% m9 d# z) G2 `  g
    ; a2 f  C# h4 p
    '''
    0 e, i; {1 B4 R; F0 ^3 v实验环境Python2.7.13,igraph包,cairo包,numpy包
    * j; {+ Q9 M" c3 F" {'''
    ! }5 n' T9 B* F+ Z$ J4 l6 P4 G# -*- coding:utf8 -*: `. }' x4 G8 x4 w
    from igraph import *2 C4 S4 r9 x1 G; q9 M  z
    import numpy as numpy0 b; Q: T  O7 i" Y) l2 X
    from  numpy import *
    7 i  {! v. w& H( J/ W% oimport random
    6 A  b$ o: Y' |9 D. g# n$ c
      c2 B2 U  G* ]( q& @2 m  X& @def len_arr(infected_array,nodes_num):#获取感染数组长度8 S! @, N  O' E! X2 W
        len_value=0#初始化长度
      D- L: S; Q) X% J0 a, s" V    len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)
    / _9 s# y% H2 A- s( [    return len_value
    $ V' v. B* G) T5 K% N) m1 h0 \9 i2 G% \6 ~: z, W
    g=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)
    , @$ k! ~8 Q) isummary(g)
    9 [7 ^1 F: W' D5 K1 m) W* N' \nodes_num=g.vcount()#统计图中的结点个数& a* {# L2 T7 X1 d
    net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat
    8 K) _/ |# @9 C2 i0 k4 s$ |g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色
    3 i6 f! k  `4 g: {a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a. Y! @$ Y9 G5 z+ ^1 y0 R
    nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)& k! V4 k$ L! N; }8 }' c
                                                        #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间7 x0 `/ C7 a" Y& `
    print(nodes_state)
    3 X: ?* ^! V* a6 k9 k( B: minfected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染   34代表网络节点数
    6 r* P6 m* R  |1 X2 T/ }print(infected_array)
    9 X3 D9 a% G+ _! W7 P( K
    0 X6 G# \9 C4 {2 Winfe_rate=1#传播率(感染率) 1代表邻接点100%被感染- b! L/ ]: h1 Q- l, i1 o
    set_time=2#传播次数(感染次数) 2次
      F$ w3 Z3 r! P3 U, C6 ]4 J: o1 Vsource_seed=1#感染源位置
    7 w% C' b) l/ w. _% l3 \% unodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1
    3 U6 k8 x' k7 r9 }! T3 Vnodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态
    9 ^: Z* T% t; D- i0 }4 {nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1
    & \: t+ p( I- L$ @$ _0 ~2 @g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
    % b9 W" W3 `2 x) f/ rinfected_array[0]=source_seed#将感染源的位置存入被感染节点列表) s2 S. X- ?& B! R4 y
    plot(g)#绘制! W6 Z- f4 y$ R0 n" u; t

    ( P( ^- G$ y4 c3 Fstop=False#感染过程结束的标记
    " |- ^; i! p( V" htemp_time=0#第几次感染+ n+ `7 n9 A+ ^" j# j
    temp_len=0#本轮的感染源数量初始化" m0 K' n5 x& X/ H

    & U) Q+ k- V7 C; ?9 R, H! t! @  C7 _- \while not stop:2 [9 Q/ r. W* W4 o! k+ v
        i=0#记录让每个感染源都传播一次
    1 @$ A. e# y* k$ i8 @    if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行
    3 }* N( r6 R$ f% u# [        temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
    , c7 F* }( {( \1 k2 K        while i<temp_len:
    ! S3 h) F' x$ m5 P5 N, T            temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间
    # z4 Y* {9 {1 g% ~/ l/ I            nei_count=0#下一轮可以被感染到的节点数量
    5 W2 I/ z5 q7 D6 s: O! A3 ^            #生成下一轮可能被感染的节点的集合nei_arr
      d4 b' W1 ~6 S1 r$ j            for j in range(nodes_num):#遍历节点
    * J8 o/ i/ V* R( ^, e3 T. J/ U                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染& e  e& r2 k3 E' Q
                        nei_count=nei_count+1#下一轮可以被感染到的节点数量++0 y# b4 k" a9 a2 U
                nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
    * E" I) x* h) u& O- |! a. L3 y            t=0
    $ N* @/ b  [3 S/ ~, C            for j in range(nodes_num):
    & N* T, A6 u5 I3 M2 X                if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:
    " X" l2 p1 h1 W5 e6 o9 `) A1 [+ X                    nei_arr[t]=j+1
    ; L& Z6 C; N. B: _7 y                    t=t+1, |7 M( P' S+ k: l
                ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组- x5 ~) r7 b% X* r- Y
                                            #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象
    . W/ {2 C& C7 _: w$ D            if len(ran_infe_arr)>0:#存在需要被感染的节点# `, J5 F- ~2 m# q1 ~+ ~
                    t=0#让ran_infe_arr内每个感染源都被感染
    7 B1 I% o6 @$ e, a" E- @2 V5 k                while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
    ( g' O% h4 G; z4 ^# g, T                    nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态
    9 h! E& f+ L7 c% X* g7 d                    nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
    , V; c- I4 p0 d# i7 p* z  j% ^                    infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中
    , L7 M" m: C! E4 y% E- ]                    g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色. b5 ~$ ~1 h9 x3 T  H( q
                        plot(g)#绘制* R# Q" v) m0 f# E
                        t=t+1; M- a5 C" S4 T. b0 q
                i=i+1
    * s( X' s% P% i) ~7 D& K    if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染
    6 e+ O4 C0 z9 W5 H        stop=True
    4 J7 L& ]1 i3 b- Y( g  w, d9 z1 I) z
    4 w9 b( F: k) d. u
    视频演示bilibili传送门6 ]* _/ k$ g& i) S" s
    效果图# r6 i  X# @( d7 @. x* P
    $ s; r( [2 ]4 ^3 K$ Y

    + t' _( Q& J5 h! W0 g 2.jpg
    8 o8 ~# m- e  Z% b% [  a& j) j& y. g  R
    3.png $ E+ f" N! u+ \. M- k
    , T5 k% s! y" m) i1 `2 X
    4.jpg 8 U! F1 O9 x& Q1 \" _

    , f/ A' l/ `2 b 5.png
    * \* ~2 T3 y* A; w1 u9 n$ _  ?. ~/ Y! J- A0 N* V
    6.png
    ! I$ v# \4 @4 W/ N5 ^9 a) g% W/ r/ a1 u
    7.png ————————————————
    3 N- Z# ?9 e8 o版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ y  R1 e( O% [6 z  y9 w1 s+ i
    原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862
    " v( i  f5 F3 I, c* ^* J6 E+ O: O2 I
    8 X$ r) Z; j$ f6 I
    7 z2 g; s( g+ T) a5 D! }/ _
    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 18:58 , Processed in 0.422130 second(s), 59 queries .

    回顶部