9 K& a# w* j. `
代码和相关文件以及环境链接:链接:https://pan.baidu.com/s/1JSfHuTPaglFimeEBLdSDyQ9 ?' i! O* D, c1 C$ o
提取码:z4484 ~& p* \4 L& Z
: M g# w$ r: H. P e) L; ]) D
1 K, I) E; t& r; ]1 E''' + L' g! y/ a/ n$ ~, T. {实验环境Python2.7.13,igraph包,cairo包,numpy包1 z, Z! [, v- \5 }2 x8 }# E
''' * B- k" ]) V# { [0 L# -*- coding:utf8 -*- m; ?; T4 @0 L; C b1 r
from igraph import *# O5 {5 c: d' Z) {; M. J3 c: t9 j9 L
import numpy as numpy / I, I9 y% [: V t: Dfrom numpy import *. s; r6 O, @- j- ]: J9 n9 M
import random . q7 A9 q( K7 a% v4 U+ d. R' V& i4 y) v6 k- {8 M' g! i9 c& L0 K: t) [
def len_arr(infected_array,nodes_num):#获取感染数组长度) `6 @. L: U- m! b/ c# ~+ ] [9 z
len_value=0#初始化长度 & r3 F* { e3 I4 M# H' E4 Y len_value=nodes_num-infected_array.count(-1)#被感染数量是结点总数减去未感染节点数(未感染的结点被标记为-1) 8 h; t/ P7 K) V m' U1 \# |, r( a9 j return len_value- O" m- m& d; e9 b6 M
( K& Z" O0 C# j+ C
g=Graph.Read_GML("C:\python27\e1.gml")#将本地保存的网络数据读入变量g(生成图)/ v' P3 M+ d0 E) m3 H- c
summary(g) * C9 \+ b9 U! a4 c) \, g/ |nodes_num=g.vcount()#统计图中的结点个数 9 Z) ^* q7 K y2 n a) P3 t5 ~net_mat=g.get_adjacency(type=GET_ADJACENCY_BOTH)#将网络数据转换为邻接矩阵存储在变量net_mat ( d* W4 Z. N, {5 [) R% K& fg.vs["color"]=["white"]#给图的顶点序列颜色赋值白色7 w1 r: [) \8 k
a=[arange(nodes_num)+1]*3#声明一个N行3列的数组a {' A% x+ G# O/ d0 O4 W
nodes_state=matrix(a).T#nodes_state通过转置a矩阵创建,用于存放每个节点的状态信息以及其被感染的时间(这个是理解算法的重中之重!!!), z4 e* N$ e( S4 p5 G4 c K
#第一列是节点编号,第二列是节点状态,感染状态用-2表示,第三列是节点感染的时间! D# o0 @. o9 s$ @8 ~" V
print(nodes_state); U1 \4 {, x6 I. v0 B) v
infected_array=[-1]*34#用于存放本轮被感染的结点, 这些结点将参与下一次感染 34代表网络节点数3 V' ]5 p, x; h5 P H
print(infected_array) + p$ E' O# s7 b. E& E8 g/ D6 ^) ^9 E5 H
infe_rate=1#传播率(感染率) 1代表邻接点100%被感染+ b q1 _) z, O ?$ U( I
set_time=2#传播次数(感染次数) 2次 8 b/ b8 j6 z- t" ^9 Xsource_seed=1#感染源位置0 L( Z2 x- T/ L
nodes_state[0:nodes_num,2]=-1#给所有节点初始化感染时间为-1 / g* B6 r" }( F5 f2 I: V" h! ]3 Onodes_state[source_seed-1,1]=-2#设置第一个感染源感染状态 -2代表感染状态 ; H8 c0 | ]: Z. j1 T% Z( @nodes_state[source_seed-1,2]=1#设置第一个感染源的感染时间为1 # |, ^) `, _7 |6 ^9 K n' {+ }g.vs[source_seed-1]["color"]="red"#将感染的顶点颜色标红 , t- i6 i i: I, r: Q! q! Kinfected_array[0]=source_seed#将感染源的位置存入被感染节点列表$ A# D8 O# d+ h& g7 a3 P" }
plot(g)#绘制 ( ^, w% U" E$ F: J% @. [6 H, y4 R 0 J! O) O5 a# h' O B4 G& \stop=False#感染过程结束的标记 " g9 B! A W# N5 K- gtemp_time=0#第几次感染 u L; q* B" e4 m, w' R
temp_len=0#本轮的感染源数量初始化. v! Q; A8 V/ G& ?2 y9 m
! M5 \/ h3 B% m6 P& r L: F2 f p
while not stop:0 m& R/ ^- f8 y/ G9 t
i=0#记录让每个感染源都传播一次! P; O( o. i! E) I7 B
if len_arr(infected_array,nodes_num)>0 and len_arr(infected_array,nodes_num)<=nodes_num:#感染可以进行 ^6 s5 K8 z" T( t% a. [' o/ J temp_len=len_arr(infected_array,nodes_num)#获取本轮的感染源数量 C0 f. \2 o) ]3 B, p3 e! V while i<temp_len:9 W: \" Z, B7 I
temp_time=nodes_state[infected_array-1,2]#获取每一个节点的感染时间7 [. J1 F, R/ P2 ]
nei_count=0#下一轮可以被感染到的节点数量 ( d' I9 |- ?; B2 W/ l) X4 U #生成下一轮可能被感染的节点的集合nei_arr0 O0 ]2 j9 ~# R/ X9 h7 n
for j in range(nodes_num):#遍历节点9 O. f4 K" K7 d& h
if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:#是邻接节点而且未被感染 2 }( o4 B) n s' m* ?* e nei_count=nei_count+1#下一轮可以被感染到的节点数量++4 }3 g0 N( M- a+ S0 B5 s
nei_arr=[-1]*nei_count#用于临时存放本轮被感染的结点, 这些结点将参与下一次感染 / z% Y! V/ k! a$ ^6 U' E t=0 6 B5 d. @/ W- y- U$ I0 o1 i9 X: V for j in range(nodes_num):6 A% r+ w6 R* `, _3 v+ M; Y
if net_mat[infected_array-1,j]==1 and nodes_state[j,1]!=-2:; j) l# X( G/ M' D
nei_arr[t]=j+1" F5 ?, d+ A/ j/ B
t=t+1 % @9 g1 y/ L( Q ran_infe_arr=random.sample(range(nei_count),int(nei_count*infe_rate))#随机生成会被感染的节点的数组8 ^3 k% W+ V5 Y+ {( E6 q5 W5 j0 o
#random.simple(arg1,num) 从arg1集合中随机取num个数据生成一个对象. O1 X' ?+ A) M5 n6 E( ?. [, \9 W
if len(ran_infe_arr)>0:#存在需要被感染的节点 5 k, j9 R6 s+ B5 I- l! y* U+ } t=0#让ran_infe_arr内每个感染源都被感染 9 T r4 D9 X+ D, o# v8 R while t<len(ran_infe_arr):#对刚才生成的会被感染的数组内的节点进行感染# a# W& R+ c) j9 B8 B& w& c/ k
nodes_state[nei_arr[ran_infe_arr[t]]-1,1]=-2#标记为感染状态 4 J6 a0 x$ A( J" l nodes_state[nei_arr[ran_infe_arr[t]]-1,2]=temp_time+1#记录感染时间 9 n$ [/ M- ? e8 l i2 G infected_array[len_arr(infected_array,nodes_num)]=nei_arr[ran_infe_arr[t]]#将此次感染节点放入总的感染节点数组中 0 `5 l: o# k9 G$ x* A. S g.vs[nei_arr[ran_infe_arr[t]]-1]["color"]="pink"#将此次感染的节点集的所有节点颜色置为粉色 * E; a* b) F+ j1 q plot(g)#绘制 . B) v0 @1 B# o& U t=t+1 ; n- n7 \& o! K1 Z i=i+1 . w/ f6 l+ h- E; ^7 v8 s if temp_time>set_time-1:#当执行感染的次数等于设置的次数结束感染 ! v$ h. M3 Y: a) e$ Y8 f stop=True / W% P$ ^7 m3 r! D' G( V7 h1 O6 E
& r0 j6 m2 L' k1 S1 S
) n' R7 G! r6 H$ ~/ H% K6 O
视频演示bilibili传送门 1 L _' Q# p) b( j( Z; F效果图3 V% N* c ?- G3 R7 {+ ?5 V- c
———————————————— % M8 {. ?$ e. J% X6 k7 P版权声明:本文为CSDN博主「eck_燃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* k/ ]' m a' A' T, ]1 \
原文链接:https://blog.csdn.net/wdays83892469/article/details/808788620 ]" _; B( V' ^& c/ I
5 ?% C+ r. _6 A) M