- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564646 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174617
- 相册
- 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传播模型
* \8 Y( Z0 S$ c" ^( T% z#SI疾病传播模型的原理, X7 E; c) q, Z$ G" l
在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类& H5 q. y% P' K
, _7 V% E1 O9 O' Z$ @( N2 ]易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。
+ f7 w2 G9 w! ]+ X9 E" f易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。0 w f% \- ?; s# w
移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。" @# b8 C% x: D: O3 e
SI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个- L o( ?9 O+ B/ u& N: i I) L" h
即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。: @, s/ [) `/ l3 h
在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有
6 l0 y8 E- |! P! oS(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触 J" G" _/ o7 @9 ?. ^7 B
会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在
- D1 w, Z, _6 S ^) p9 p感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少3 a2 {3 N6 M7 L. W
ds/dt = -β*S(t)I(t)/N. z$ ]- L, z9 ?0 a2 l
同时,感染个体的数量会以与易感个体相反的变化率增加,
6 m9 }. Y: p' q: z8 ?ds/dt = βS(t)*I(t)/N
/ U- l! R0 p2 h/ `+ D分别将时刻t处于易感状态和感染状态的个体所占比例记为,
% y, [/ g! n2 B3 z, Vs(t)=S(t)/N( A. W# i1 A/ y0 V. Y {4 o
i(t)=I(t)/N4 }5 q: s- K c8 a3 N% b1 B' t
显然有,
, Z9 H4 Z" F8 d5 c. O+ Vs(t)+i(t)恒等于1,此时之前的公式可以记做- d/ H; H c9 g- N W7 l/ C) ]0 P0 c
ds/dt=-βsi
4 _ F% j$ x3 y+ ?di/dt=βsi) Z+ d1 c# J( Y0 H, x7 o
即 ~+ N. Q+ P0 _$ o6 d9 A7 J
di/dt=βi(1-i)
/ v5 l" U. V" W2 {$ w; e' R上式也成为Logistic增长方程式(Logistic growth equation),
( X9 Z# H! I, S. o; J方程的解和图像如图1 q. T% w1 i( U" C @# }0 b7 ~
4 n3 F2 {8 D9 `- W# }代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ% s- a0 b5 c7 w2 l& R, e7 M8 g
提取码:z448
3 [# {1 r5 k$ b. J7 j& R: _
5 L, p4 {3 A! E' X$ K$ ~' c9 R2 V. p( ]+ f
'''
. o7 z. ~0 c, D& ?7 v2 i) U; o, f) ^实验环境Python2.7.13,igraph包,cairo包,numpy包
8 M) B/ M* l: r; k- L/ r'''
' f0 x2 V: q- Z# -*- coding:utf8 -*% V2 p2 K M( G& M; T# h
from igraph import *$ Y5 j7 L$ l5 Z x, k
import numpy as numpy
" {4 B0 D, C) Pfrom numpy import *
+ ?) A1 |$ L" \; Gimport random
: h2 P& ]# E: O9 x9 ?; N2 E8 ]# r0 y. g* [0 l# c5 s; f3 J
def len_arr(infected_array,nodes_num):#获取感染数组长度
: L1 Y9 }* _: S. y len_value=0#初始化长度. d) ^1 x! U* H5 j) x( N; j0 \
len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)0 E8 U4 x, c# [8 k
return len_value/ | L% i% n" a
w( m$ F. x2 |5 R5 g, mg=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)8 p1 k) O! F6 V! k
summary(g)( b/ D+ e' n; v# K' b
nodes_num=g.vcount()#统计图中的结点个数# S* h( ]: l8 X2 L; l8 |" a
net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat
9 |( {1 E, z/ T, F$ Sg.vs["color"]=["white"]#给图的顶点序列颜色赋值白色
. \8 g: W; c+ X: B7 W/ S$ i8 w; Da=[arange(nodes_num)+1]*3#声明一个N行3列的数组a
) Z; T4 E9 z0 ^( r! V7 knodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)
# i$ m( I- v! l2 O; |: N- a! @$ g7 L #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间5 I0 d* N' {9 ` g
print(nodes_state)+ M( J/ F) Y7 v; A5 h
infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染 34代表网络节点数4 d9 c5 P% h3 |
print(infected_array)
, n# y/ i2 d8 W$ P( e
% K, ^' R; o/ Sinfe_rate=1#传播率(感染率) 1代表邻接点100%被感染# u9 d9 K$ W$ o9 Q1 n
set_time=2#传播次数(感染次数) 2次
l! c3 O: l& I2 e% b/ e7 zsource_seed=1#感染源位置
& L( s; N0 c" z* T9 d ?! Nnodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1 S' q! X( j* A( d
nodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态3 D: [5 A8 f1 T9 L* T# x7 }8 O
nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1
7 w) S: J6 ` b6 G$ vg.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红
u9 ?9 r0 i3 h, L N1 a5 Hinfected_array[0]=source_seed#将感染源的位置存入被感染节点列表
6 T& r g# A0 A4 r( o0 lplot(g)#绘制
& b) K B. ]( g/ ^5 n# `, P. C. A1 N' s
stop=False#感染过程结束的标记 E8 N6 X* W$ f% Q& ~3 _, @$ \
temp_time=0#第几次感染
! @7 v* P1 _8 I+ M! m' [# h. L8 }temp_len=0#本轮的感染源数量初始化
- m. z& B9 ]) ^8 O- m3 t; \) X: l! L; U
while not stop:
6 S9 x4 u4 G6 a8 F1 m8 J) L0 w i=0#记录让每个感染源都传播一次. U7 B1 \# Y/ Z, m
if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行
# H! R- E% T* @; n* A temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量1 I, K- ^% }. V! S- g) q0 E
while i<temp_len:9 d( J v6 t) ~8 n
temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间
4 e4 r) s, ?; r% l8 T nei_count=0#下一轮可以被感染到的节点数量
+ s, d7 `! m) y+ b #生成下一轮可能被感染的节点的集合nei_arr; f% r; t4 p. n. E4 K
for j in range(nodes_num):#遍历节点
, `5 c9 e3 i" B" \& I if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染( G# w; ?! R% X$ ]4 O6 v" E K
nei_count=nei_count+1#下一轮可以被感染到的节点数量++9 Z" I* t( o: V# t9 N
nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染% W& r) \( u: O0 ~& \! h0 ^
t=0
$ K! \3 D4 o! q3 e1 s for j in range(nodes_num):5 W+ y/ m$ N) P& I/ n' f4 k
if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:1 b0 P4 p4 f% U; m
nei_arr[t]=j+1, Q/ w5 s8 W- D% ^- ] Z
t=t+1- U P1 Y6 Z7 v3 }1 M
ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组
$ `( T7 j0 W! P( w0 S1 d) P8 Z #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象* `8 g5 N% |2 G- u2 p% D
if len(ran_infe_arr)>0:#存在需要被感染的节点
$ |1 D9 u* l! W0 S3 M t=0#让ran_infe_arr内每个感染源都被感染
. C* g% d! b9 x: V" S) A: \; p( B while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染0 L% H8 j* n/ P/ f$ i) u0 Q
nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态& z5 [; A& @0 | C& x3 v7 o5 a
nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
4 Y$ A5 e# k8 T- s1 v N) s infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中
# v! ^/ ~ Y: J g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色( _5 J, k: A% j: Z
plot(g)#绘制
* i' \8 c( d, W( A ]5 h t=t+15 e: i7 A# Z3 O5 O
i=i+1: _& Y* i9 d6 G- \# p `( o, ^
if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染
+ n4 I" U& j! ~, d7 d9 ]$ b stop=True
/ R" M6 ^! x+ q$ [
- p; ]( d2 y! q; ` b$ q. Q3 @' C* r6 D$ Y( v0 Y- u& E
视频演示bilibili传送门0 @: T2 o" v- B; P" R1 A$ ? U. D
效果图 `" _ n' s* s8 b. A. v
! E# Q# R. n O2 H" y8 S
i8 g! A6 ^: X7 d5 y
9 d: u+ h, P9 ~: B5 l9 m
$ x6 m) T; H' n9 _! r
0 p& _* f2 p1 W! R* V& G2 b* M
0 _; Z3 V Q/ y) i
* [1 w# ?4 j% k5 k O+ X+ @4 Q
9 ` c4 R' a- R* l' @5 _# w4 U2 ^1 W
+ Y4 D, p5 U. ~1 l" b, t$ u; N" z2 _. B1 M! |: C3 x$ ^* S7 ^
0 v" a# z9 c/ e2 I0 W$ G& J
" j5 R) u; o2 j. Y
————————————————6 g3 j$ B; l: d, n7 `0 v
版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 r: V1 U# T7 M2 S原文链接:https://blog.csdn.net/wdays83892469/article/details/80878862% K, s( [7 ]5 r5 Z# \. P
8 O$ f% [5 p+ K1 e/ Y
# R* @" N7 U2 t7 ^+ q9 b: S3 |
|
zan
|