Python实现简单的SI传播模型
#SI疾病传播模型的原理
在经典的传染病模型中,种(Population)内N个个体的状态可分为如下⼏类
1. 易感状态(Susceptible)。⼀个个体在感染前是处于易感状态的,即该个体有可能被邻居个体感染。
2. 易感状态I(Infected)。⼀个感染上某种病毒的个体就称为是处于感染状态。,即该个体还会以⼀定概率感染其邻居个体。
3. 移除状态(Remove,Refractory或者Recovered)。也成为免疫状态或恢复状态,当⼀个个体经历过⼀个完整的感染周期后,该个体就
不再被感染,因此就可以不再考虑改⾰提。
'''
实验环境Python2.7.13,igraph包,cairo包,numpy包
'''
# -*- coding:utf8 -*
from igraph import *
import numpy as numpy
from numpy import *
import random
def len_arr(infected_array,nodes_num):#获取感染数组长度
len_value=0#初始化长度
python获取数组长度len_value=nodes_unt(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1)
return len_value
g=Graph.Read_GML("C:\l")#将本地保存的⽹络数据读⼊变量g(⽣成图)
summary(g)
nodes_num=g.vcount()#统计图中的结点个数
net__adjacency(type=GET_ADJACENCY_BOTH)#将⽹络数据转换为邻接矩阵存储在变量net_mat
g.vs["color"]=["white"]#给图的顶点序列颜⾊赋值⽩⾊
a=[arange(nodes_num)+1]*3#声明⼀个N⾏3列的数组a
nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,⽤于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重)
#第⼀列是节点编号,第⼆列是节点状态,感染状态⽤-2表⽰,第三列是节点感染的时间
print(nodes_state)
infected_array=[-1]*34#⽤于存放本轮被感染的结点, 这些结点将参与下⼀次感染 34代表⽹络节点数
print(infected_array)
infe_rate=1#传播率(感染率) 1代表邻接点100%被感染
set_time=2#传播次数(感染次数) 2次
source_seed=1#感染源位置
nodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1
nodes_state[source_seed-1,1]=-2#设置第⼀个感染源感染状态 -2代表感染状态
nodes_state[source_seed-1,2]=1#设置第⼀个感染源的感染时间为1
g.vs[source_seed-1]["color"]="red"#将感染的顶点颜⾊标红
infected_array[0]=source_seed#将感染源的位置存⼊被感染节点列表
plot(g)#绘制
stop=False#感染过程结束的标记
temp_time=0#第⼏次感染
temp_len=0#本轮的感染源数量初始化
while not stop:
i=0#记录让每个感染源都传播⼀次
if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进⾏
temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量
while i<temp_len:
temp_time=nodes_state[infected_array[i]-1,2]#获取每⼀个节点的感染时间
nei_count=0#下⼀轮可以被感染到的节点数量
#⽣成下⼀轮可能被感染的节点的集合nei_arr
for j in range(nodes_num):#遍历节点
if net_mat[infected_array[i]-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点⽽且未被感染
nei_count=nei_count+1#下⼀轮可以被感染到的节点数量++
nei_arr=[-1]*nei_count#⽤于临时存放本轮被感染的结点, 这些结点将参与下⼀次感染
nei_arr=[-1]*nei_count#⽤于临时存放本轮被感染的结点, 这些结点将参与下⼀次感染
t=0
for j in range(nodes_num):
if net_mat[infected_array[i]-1,j]==1 and nodes_state[j,1]!=-2:
nei_arr[t]=j+1
t=t+1
ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机⽣成会被感染的节点的数组
#random.simple(arg1,num) 从arg1集合中随机取num个数据⽣成⼀个对象
if len(ran_infe_arr)>0:#存在需要被感染的节点
t=0#让ran_infe_arr内每个感染源都被感染
while t<len(ran_infe_arr):#对刚才⽣成的会被感染的数组内的节点进⾏感染
nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态
nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间
infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放⼊总的感染节点数组中 g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜⾊置为粉⾊
plot(g)#绘制
t=t+1
i=i+1
if temp_time>set_time-1:#当执⾏感染的次数等于设置的次数结束感染
stop=True
视频演⽰
效果图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论