- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565566 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174893
- 相册
- 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传播模型) e+ C% E& }: }) j
#SI疾病传播模型的原理
" c0 Y1 {2 R' X4 S3 C" |0 t0 ?: J在经典的传染病模型中,种群(Population)内N个个体的状态可分为如下几类
& @, _7 [+ Q8 `, Z
3 l( F C. ~ u" z易感状态(Susceptible)。一个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。4 k% G: L6 ^; j
易感状态I(Infected)。一个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以一定概率感染其邻居个体。% J S9 b2 S- M8 p
移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当一个个体经历过一个完整的感染周期后,该个体就不再被感染,因此就可以不再考虑改革提。
+ j" h: B4 n, o; g$ Z+ s X# KSI传播模型是最简单的疾病传播模型,模型中的所有个体都只可能处于两个状态中的一个+ }8 U+ x" T* M: X* l; z9 T1 b
即易感(S)状态或感染(I)状态。SI模型中的个体一旦被感染后就永远处于感染状态。
, n' g! J5 S$ ?( E. j/ J: c在给定时刻t,令S(t)与I(t)分别代表该时刻处于易感和感染状态的个体数目,显然有
4 S8 Q& F+ O) N3 K' N/ l" |! IS(t)+I(t)恒等于N,这里,N是个体总数。随着时间t的增长,易感个体与感染个体的接触3 g+ ?: v( E$ b4 a3 X6 D1 R8 [
会导致感染个体数量的增加。加入由于个体之间的接触而导致疾病传播的概率为β,疾病仅在6 u8 a: g9 d; X3 y9 B. j, y
感染个体和易感个体之间进行接触时才会以概率β将疾病传染给易感个体。在时刻t,易感个体的比例为S(t)/N,感染个体的数量为I(t),一次,易感个体的数量将以如下变化率减少
' k3 j: F, [, ^: Q- Y9 Kds/dt = -β*S(t)I(t)/N
. n4 N ?* {0 t同时,感染个体的数量会以与易感个体相反的变化率增加,
* e9 P: H) g7 K( I, N3 G5 kds/dt = βS(t)*I(t)/N
$ W) V) O/ Q* ], f7 e9 l8 n2 g分别将时刻t处于易感状态和感染状态的个体所占比例记为,. m9 j7 q( @9 n P+ P0 D! R
s(t)=S(t)/N) U' K. O# B1 r3 [0 P$ A
i(t)=I(t)/N
/ E; [. {; a' `5 [# y显然有,& D: F8 |- E$ m
s(t)+i(t)恒等于1,此时之前的公式可以记做+ b3 J0 w0 S( j# G7 k( s c6 c
ds/dt=-βsi
9 m/ ]/ S+ q0 t- Zdi/dt=βsi3 n" F! n6 Z: G$ a6 `; v
即
3 j, J% I' J8 e! Adi/dt=βi(1-i)
% t" z' P; j& j7 M$ `$ r4 h上式也成为Logistic增长方程式(Logistic growth equation),7 y# W4 H7 T+ O6 p
方程的解和图像如图
* i, K9 ` m( M5 e! t
- m) J. u( a: o4 P代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ/ I( n# o e3 r9 V, v: Q
提取码:z4484 O, ^$ N, q/ j" N: h' ^' ~
" f% R* r# k+ V! N% {3 Y& G" G
$ |7 v& Y# F% {; Z" W( z# P( Y'''5 v7 K8 B/ Q, i: ] V, G& a
实验环境Python2.7.13,igraph包,cairo包,numpy包9 S- q' P( ], D
'''
# y1 [4 e2 @2 r+ P: D# C# -*- coding:utf8 -*7 O8 u# b, b! Q: I, A3 w& V) k
from igraph import *
: Z* O0 t5 k7 }3 V. j& ~% U0 limport numpy as numpy
: ?6 F7 q& C. n/ v8 N/ ?- wfrom numpy import *
% e4 n' X* Y: `import random; G! i! x; Y8 f2 ?6 Q
- n; Z! K) Y( ?" [% d" Xdef len_arr(infected_array,nodes_num):#获取感染数组长度9 s3 U( {( j# s& |
len_value=0#初始化长度7 H: q J* q3 P! n
len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)1 [ Y; D/ z3 |1 n, F" l
return len_value
* ?2 \, u. h' Z$ X& ?" _% I
; @! X _# {0 n- E1 eg=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)
* |, w; l) f. a0 ^3 _summary(g)
! G$ X7 ?: V: }# H6 d* e, @, W# e# r2 gnodes_num=g.vcount()#统计图中的结点个数6 k9 c$ V' _& }" D, K s
net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat& S& U& d$ p8 U( D4 U s
g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色6 F3 w- o/ _! Q
a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a
( k+ F# _; k( ?* [9 B2 q! x$ ]nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!)! h8 k$ k6 l8 F, U3 i
#第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间
' ~1 G, B: Q; @' J2 pprint(nodes_state)3 w* R; V, @" {4 B3 @
infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染 34代表网络节点数
% O7 m2 N0 C, B K5 xprint(infected_array)8 m a, H( u( \4 C# O% k
' a0 R$ Z5 b8 t" P5 qinfe_rate=1#传播率(感染率) 1代表邻接点100%被感染' o0 D+ B n/ j, i+ C' h( P' j: r
set_time=2#传播次数(感染次数) 2次1 B3 |, b( U ~$ x/ D
source_seed=1#感染源位置' F3 E9 v" j' a) ]
nodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1
9 c3 b5 y9 {# z6 enodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态
( Y2 k0 ~8 B7 r3 T: Y4 snodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1' U1 N9 v; L; R1 V8 Q5 ~ y6 f
g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红2 _6 k8 H' c3 [9 I% H+ T- i q9 H8 b
infected_array[0]=source_seed#将感染源的位置存入被感染节点列表3 ]( c( u+ j8 E0 e/ X5 Z; Y
plot(g)#绘制5 G* u! q, R& g2 |6 p
B; N8 }3 B$ n9 v( ~- j. _* G! z p# istop=False#感染过程结束的标记
; _) m: V) b- @1 I5 ctemp_time=0#第几次感染; H8 [# m: A% p' m. g1 R
temp_len=0#本轮的感染源数量初始化1 ?; Z2 U% h( G* |: w. O
. `' o$ T- l2 ?/ w$ F! {
while not stop:4 J6 B9 M- }- K; ~
i=0#记录让每个感染源都传播一次- O# ^& e& K- o$ j2 `8 X
if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行$ W5 o' V3 l7 p0 _ h
temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量6 Q$ y+ f$ m* X/ v( d. R
while i<temp_len:
% O" M0 j1 Q Z0 H+ t- ], B temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间. I- L& f; x; i
nei_count=0#下一轮可以被感染到的节点数量
' C r: J" e# p5 P% Q #生成下一轮可能被感染的节点的集合nei_arr) |7 {& g5 ~/ e( \2 ] P) ]: u) @' E
for j in range(nodes_num):#遍历节点! j. j7 n. U- F& _) c
if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染
6 u, ?* K" y/ [6 x0 y' H1 ^( ~ nei_count=nei_count+1#下一轮可以被感染到的节点数量++
! H/ d# H( \* N9 |& u, M nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染
* E9 p* M; u% k4 s3 k0 ~ t=0- N" f" d8 V! |2 v4 W
for j in range(nodes_num):/ }: [0 Y1 g2 g
if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:8 {6 J% }4 {: `- w3 P2 o9 U/ A+ G* j
nei_arr[t]=j+1. z3 z: A6 O1 c, a) h7 W
t=t+1- b5 v; D- s& y# {$ D. f) O; J
ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组
# x- p( w2 e8 | #random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象8 r% ^- W- r* M
if len(ran_infe_arr)>0:#存在需要被感染的节点0 z4 m1 x5 H3 S5 K) W" s
t=0#让ran_infe_arr内每个感染源都被感染8 f5 w; |! D) U: v( P/ a
while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染
; B, Q# i% [" F1 n& w% D* i nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态
: L% K/ |% N, _' ] z# N nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
' R* x& W" u: G infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中
' w' A# I/ O, T$ G% S8 s g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色
1 k! C0 q/ A1 C) F0 n% ~& F plot(g)#绘制' u3 w! g$ a* o, m; O
t=t+1
; U9 K# u+ O: b: P4 k i=i+1 `3 ^1 m l: q( W- F3 ^8 }# f
if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染0 M9 T2 C7 q, W' ?! J' r% m0 r
stop=True / X% y4 ^9 Z- w* [
5 ~1 m: W$ @8 V7 Q) T
" o: c3 S2 ]: H
视频演示bilibili传送门3 m" F4 N, D: b. n
效果图
; c. B1 q$ g/ ~) y; u( l+ D2 j9 V i1 b) b
- c, P) v8 m* k5 K) p" H1 m( F
8 \ I5 n* }, d0 @5 K& p2 V1 S& N0 F3 p
4 R5 C* n9 x$ X1 f
7 i, Q4 ]# c) f) v, ~- _3 ~
3 h) |. x4 N+ w# v$ d9 S1 _
* y' x V0 t% S! u
& O4 h, y" S6 L5 K2 q4 [: ]/ R/ A/ ]0 N# e5 r* P- d
3 y0 i5 n1 [3 K$ b f: Y
/ y" A ^- h4 b
————————————————2 ]% |; ^ a% F/ ^1 q) e: j0 ]" H
版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, T1 C8 }+ J, V* a8 _6 B原文链接:https://blog.csdn.net/wdays83892469/article/details/808788625 w7 A: S! g7 `$ }! m
1 G' `0 g, n7 n9 a8 V9 C) Y! _3 w" E$ R" Y. L
|
zan
|