function spreadingability=sir(A,beta,mu) for i=1:length(A) for N=1:50%隨機次數 InitialState=zeros(length(A),1);InitialState(i)=1; time=5;%傳播時間 I(N,:)=sire(A,InitialState,beta,mu,time); end spreadingability(i,1)=mean(mean(I));%節點i的傳播能力 end end function I=sire(A,InitialState,beta,mu,time) %****************************** % A鄰接矩陣 % InitialState初始感染狀態 % beta感染率 % mu恢復率 % time傳播時間 %***************************** Infected=InitialState;recover=[]; Infected_temp=zeros(size(Infected)); for t=1:1:time %一共進行時長time的演化 %% %若i是易感節點, 則對i以一定概率進行傳染 x1=find(Infected==0); a1=rand(size(x1)); b1=beta*(A(x1,:)*Infected);%已經被感染的節點以一定概率去感染其他節點 xx1=setdiff(find(a1<b1),recover); Infected_temp(x1(xx1))=1;%不是recover的節點以一定概率被感染 xx2=setdiff(find(a1>=b1),recover); Infected_temp(x1(xx2))=0;%對不是recover且沒被感染的其他節點保留易感狀態 %% %若i是染病節點, 則對i以一定概率進行移除(recover) x2=find(Infected==1); %如果是已經被感染的節點 a2=rand(size(x2)); xx3=find(a2<mu);%對染病節點以一定概率進行recover recover=[recover;xx3];%更新被recover節點; xx4=find(a2>=mu); Infected_temp(x2(xx4))=1;%余下未被recover的節點仍保留感染能力 Infected=Infected_temp; I(t)=sum(Infected); %記錄每個時間步的染病節點數量 end end
susceptible-infected-recovered(SIR)傳染病模型常用來計算節點影響力標准測量。在SIR模型中,節點有三個狀態:易感者(susceptible),感染者(infected),恢復者(recovered)。易感者能夠被感染者染病,感染者染病且有感染易感者的能力,恢復者由感染者恢復而成,不再具備感染能力同時也不會再被感染。傳染病模型參數有恢復率μ,傳染概率β,重復仿真次數T,仿真時間timespace。仿真過程如下:選擇網絡中一個節點i作為感染者節點,以傳染概率β向i連接的鄰居易感者節點傳染病毒,被染病的節點繼續以β的概率向他們的鄰居易感者節點傳染。同時每個染病節點在每階段以μ的概率轉變成恢復節點。當μ=0時,網絡中只存在感染者和易感者,此時模型被稱為Susceptible-infected(SI)模型。仿真結束后,可以得到每個節點i的傳染能力Si
其中ki(t)表示節點第t次仿真時傳染的節點個數,網絡中節點傳染能力S=[S1,S2,…,SN]
2018/11/20 更新:經過網友的指正,需要說明的是下面的代碼是SIS傳染病模型,recover節點仍具有再次被感染的能力。和SIR模型中recover節點不再被感染還是有區別的