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

2024-06-09 15:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个模拟,涉及随机、无向、时态网络(即链路状态以一定概率分布逐步变化的复杂网络)上的SI流行病传播(https://institutefordiseasemodeling.github.io/Documentation/general/model-si.html,但具有离散时间)。初始条件只施加一个受感染的节点。 我把网络模拟成一个形状为(T,N,N)的小数组,我的想法是把感染的发展也模拟成一个数组,比如说一个(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

Tags: thein网络nodeforif节点链接