- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563404 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174244
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
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
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
. x( \/ C/ ?$ F8 B2 a
9 p G/ B, J1 j
9 q( n( d. z- X5 ^, _, A" ~" k1 N
( x: e8 o' A8 U2 Y
- n7 K9 l3 n, B y
% ^0 e* O) R2 }7 ~* c* H
6 P: x5 S3 O( n4 F% q) H7 C: a( X P$ o3 L6 p! N8 Z. {
% M4 r' W d( T* j% ]
- O" S, N+ A- U3 {! i
————————————————
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
|