- a* P; l) `9 x
代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ4 F+ b B7 w- m$ S+ t. P
提取码:z448 ! Y/ R- I6 D- i( t7 E& Q' g. _: L3 j8 R' Z/ |) X e3 O
C0 p; a0 ]" `/ u, A''' $ w( R: g+ N' [4 I4 _6 n实验环境Python2.7.13,igraph包,cairo包,numpy包" Q/ w: W7 t, `2 s
'''* y& C. y9 _7 r; I; S0 Y
# -*- coding:utf8 -*8 B6 ?' |- R9 p6 u/ T
from igraph import * , e/ \6 w3 Q9 n; m# D2 l+ ?- Uimport numpy as numpy + @; q" v/ |& \+ }; @& J0 `from numpy import * 5 {/ W9 }9 n0 z9 N# himport random ) [7 _* n: I! {+ i" N4 q) A, }" y, E5 L
def len_arr(infected_array,nodes_num):#获取感染数组长度 _' g9 i* C5 I
len_value=0#初始化长度0 n- V3 ?: E1 Y, m- _8 n
len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1), m* h2 r3 l6 \' U7 M- S
return len_value ) z! J$ ?' \7 p' z5 X" W$ l , {% X; Z, A+ p e( j8 rg=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图) & @/ A1 B$ R9 [2 p. K6 Rsummary(g) 7 `5 v* v& B; @nodes_num=g.vcount()#统计图中的结点个数# a% u3 P6 x# u3 X) |# C
net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat8 Y% M; W! S" }& p1 \$ u k. {
g.vs["color"]=["white"]#给图的顶点序列颜色赋值白色2 M( G: U1 h' i5 [. E8 X( [3 c! B
a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a) l; k7 l9 g3 ?# w
nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!) 6 m$ t+ H1 Z" S6 z5 L #第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间 + _) k! [' E+ C6 T9 S3 x/ gprint(nodes_state)* x0 F( ?* `6 p3 n4 r/ h
infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染 34代表网络节点数8 ~0 R$ r+ p6 [) G0 b7 [# c
print(infected_array) ; \2 P: n# P$ B/ @ 1 b- v) V3 V6 [* w/ I+ oinfe_rate=1#传播率(感染率) 1代表邻接点100%被感染 }0 J: u% w" L1 ]# ~4 {set_time=2#传播次数(感染次数) 2次! k4 V5 i( y2 S& W! z
source_seed=1#感染源位置 8 |6 M. ]; g) w2 Z' Onodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1 5 N5 {: B! v7 `4 z8 j) _8 M! h* Unodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态# [& o9 Q/ B0 Y$ Y& i
nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1% i8 {+ e; z( @& L# q
g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红 " F7 h; ]/ [( { m. l% b6 @infected_array[0]=source_seed#将感染源的位置存入被感染节点列表 9 |4 Z7 }- e9 Iplot(g)#绘制 T7 ?' h! N' o 7 s, i: `* H: H: y1 N, V/ y0 [4 i# [stop=False#感染过程结束的标记 ) ~, B" l# S: M2 O0 d' c t6 `temp_time=0#第几次感染; ^* V- t5 s$ a) e7 m; c
temp_len=0#本轮的感染源数量初始化' _) g4 }* W' M/ {
8 U, K* A3 u% j: F
while not stop:: B) }* G; z0 `; S( a+ r# U
i=0#记录让每个感染源都传播一次 ) G7 N4 v2 V3 H, l4 k6 j if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行 d! F$ [# s5 K% C8 S4 y
temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量 " o2 T" T' {8 u' v( V% m+ G while i<temp_len:7 p4 s: X9 n; G# I" n3 V
temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间 * ]7 [% g8 J/ i! S Q nei_count=0#下一轮可以被感染到的节点数量: J- u' J0 { G! f- T( s
#生成下一轮可能被感染的节点的集合nei_arr . m" S6 j- G2 R9 o for j in range(nodes_num):#遍历节点/ m W( @; _2 d' p
if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染 7 q, M( g4 X) w& a6 Q nei_count=nei_count+1#下一轮可以被感染到的节点数量++ * Y$ s, g' ~2 P8 ? nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染1 ~6 d- L: u$ t# D+ p0 @
t=0 . m% _7 v5 Z4 R0 ]- Y7 S; `, c for j in range(nodes_num): 5 D* S) L+ i& Q$ y. v& M$ ~- H if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:* C% F6 Z8 u) X
nei_arr[t]=j+1) e4 C. u9 R1 J B: w
t=t+1: f( Q" ~: S6 H6 h
ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组8 G% W9 Y- b# F9 o. a5 D1 V7 f
#random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象 ' Y, s9 e: h& |9 a if len(ran_infe_arr)>0:#存在需要被感染的节点 $ @& [0 d% w" T" `% W8 i t=0#让ran_infe_arr内每个感染源都被感染6 |& s$ d( C$ |* P, ~ Z0 C ?/ ?
while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染" ^% Y K+ p" I( ]8 u6 g. T
nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态 w t5 f0 u# O0 w6 s5 k
nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间 ; E1 `# `% o0 D/ R, n7 H! ~ infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中 H% w/ q) s# f- {& U3 J3 L e
g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色0 D$ i4 y D+ }2 g" D4 s; I4 ~
plot(g)#绘制3 D8 Z5 K" @. f
t=t+1 # s, M+ E0 \6 q& o d0 ~9 a; \ i=i+1 V3 e" y" u3 a
if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染 ' k! a1 J5 i' } stop=True + Q J# w. q, \- h/ l3 Z9 x* L+ s! U8 ?) q6 g$ l+ r# m# \" C" A0 m( E
8 v6 A: d3 v: |& u" ?* d2 j. o
视频演示bilibili传送门 6 }; s0 r/ P# o效果图7 s0 r# _6 d* u1 E7 @: W$ u