Python在网络上进行流行病传播的最有效方法是什么?

时间:2019-11-05 08:03:52

标签: python arrays dictionary bioinformatics

我正在进行一个模拟,涉及在随机,无向时间网络(即链接状态以一定概率分布逐步变化的复杂网络)上的SI传播(https://institutefordiseasemodeling.github.io/Documentation/general/model-si.html,但具有离散时间) )。初始条件仅施加一个受感染的节点。 我将网络建模为一个形状为(T,N,N)的Numpy数组,我的想法是也将感染发展也建模为一个数组,例如(T,N),每次与感染状态相关联{ 0,1}。 我对流行病模拟的持续时间完全不满意,因为它需要花费太多时间,这很重要,因为在同一网络的不同实现上,应该重复一百次才能获得静态相关的结果。如果可感染节点链接到受感染的节点,则发生感染,其概率取决于链接持续时间,显然取决于感染率,根据指数分布:从均匀分布中选择一个从0到1的数字,并且如果低于与链接持续时间相关的概率,则发生感染。这是模拟的一部分,即使听起来不太有效,也无法更改。我强调,每个I节点每次都可以感染一个以上的S。 我张贴了感染代码,希望可以清除。我尝试了许多不同的解决方案,但找不到任何比这更快的方法。 你会改变一些东西吗?

    for t in range(1,T):
        if len(infecteds) == N:
            break #infection is complete
        susceptibles = {node for node in range(N) if states_sequence[t-1][node]==0 and neighbourhood(tempnet[t-1],node).intersection(infecteds) != {} }
        for s in susceptibles.copy(): #copy avoids rising an error when the iteration set changes
            for i in neighbourhood(tempnet[t-1],s).intersection(infecteds).copy(): 
                if probabilities[contact_lasting(tempnet,states_sequence,t-1,i,s)]>extractions[t-1,s]: #rand extraction
                    set_infected(s,t) #if successful, change the state of the node, at next t
                    infecteds.add(s)
                    break

0 个答案:

没有答案