- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563405 点
- 威望
- 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传播模型
/ 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
: 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
8 ? V+ h! V: L3 Q9 t. F' H- o* Q
: x& G& G* h# {7 g, \; s
% c( c$ I. Q5 c9 a
, ^4 O4 T$ y5 _$ o
% h4 b4 {/ c% _7 x$ G6 R( `
/ F0 v" w/ {" B5 q# `+ g" E! p
6 T9 _. V: O" i+ c& G
$ f8 U2 ~. ~+ v; M( U6 d4 _
# s1 C, s: X- `, _; P$ c% Y" y$ K$ S$ {
————————————————, 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
|