Вопрос:

Изменение скорости восстановления модели SIR

python numpy networkx eon

57 просмотра

1 ответ

865 Репутация автора

import networkx as nx
from collections import defaultdict
from collections import Counter

def test_transmission(u, v, p):

    return random.random()<p


def discrete_SIR(G,w,initial_infecteds,beta,Vl,duration):

    if G.has_node(initial_infecteds):
        initial_infecteds=[initial_infecteds]           

    N=G.order()
    #t = [tmin]
    S = [N-len(initial_infecteds)]
    #I = [len(initial_infecteds)]
    R = [0]
    V = [0]

    susceptible = defaultdict(lambda: True)  
    #above line is equivalent to u.susceptible=True for all nodes.

    for u in initial_infecteds:
        susceptible[u] = False

    infecteds = [{}]*duration  #bunch of empty sets  
    infecteds[0] = set(initial_infecteds)

    I = [sum(map(len, infecteds))]  #set I[0] to be the total number of infections

    while I[-1]>0 :
        new_infecteds = set()
        vaccinated= set()

        for u in infecteds:
            for v in G.neighbors(u):
                if len(vaccinated)+V[-1]< (Vl*N)  : #check if vaccination over or not


                    if susceptible[v] and test_transmission(u, v, w): 
                        vaccinated.add(v)
                        susceptible[v] = False
         #               print('transmitting vaccination')

                    elif susceptible[v] and test_transmission(u,v,beta):
                        new_infecteds.add(v)
                        susceptible[v]=False
         #               print('transmitting infection')
                else:

        #            print("BYE")
                    if susceptible[v] and test_transmission(u, v,beta): 
                        new_infecteds.add(v)
                        susceptible[v] = False

               #infector[v] = [u]
        recovering_nodes = infecteds.pop()

        infecteds.insert(0,new_infecteds)      


        infecteds = new_infecteds

        I.append(sum(map(len, infecteds)))

        R.append(R[-1]+I[-1])
        V.append(len(vaccinated)+V[-1])
        S.append(N-V[-1]-I[-1]-R[-1])




    return scipy.array(S),scipy.array(V), scipy.array(I),scipy.array(R)



m=100
w=0.2
#ran=nx.gnp_random_graph(100,0.003)
G=nx.grid_2d_graph(m,m,periodic=True)

initial_infections = [(u,v) for (u,v) in G if u==int(m/2) and v==int(m/2)]



S, V, I, R = discrete_SIR(G,w,initial_infecteds=initial_infections,beta=0.5,Vl=1,duration=8)            

Это код модели SIR, но он предназначен для скорости восстановления 1. Я хочу изменить этот код, чтобы включить переменную скорость восстановления параметров, а не значение по умолчанию, равное 1 в этом случае. Я пытался изменить код, чтобы включить это. Основной код модели SIR.

Я добавил изменения, сделанные после публикации в Joels, в мою модифицированную модель SIR.

Автор: ubuntu_noob Источник Размещён: 29.07.2019 03:12

Ответы (1)


0 плюса

11757 Репутация автора

Позвольте infectedsбыть списком наборов, таких infecteds[T]как те, которые только что заражены, infecteds[T-1]те, которые были заражены в течение одного временного шага, и т. Д. Затем выскакивают infecteds[0] [например, recovering_nodes = infecteds.pop(0)] и добавляют недавно зараженные узлы в список.

Затем для каждого временного шага, просто переберите все наборы в зараженных.

Вот некоторый соответствующий псевдокод:

duration = 8
infecteds = [{}]*duration  #bunch of empty sets  
infecteds[0] = {1,2,3}
I = [sum(map(len, infecteds))]  #set I[0] to be the total number of infections

while I[-1] >0:
    new_infecteds = {}
    for infected_set in infecteds:
        for infected_node in infected_set:
            Do some stuff with the node and its neighbors.
            new_infecteds gets some things added to it.
    recovering_nodes = infecteds.pop()

    infecteds.insert(0,new_infecteds)

    for node in recovering_nodes:
        update status and do any bookkeeping.

    I.append(sum(map(len, infecteds)))

Будьте осторожны при использовании слова «скорость». Более высокая скорость должна означать более быстрое восстановление и, следовательно, более короткую продолжительность (продолжительность равна 1 / скорость). Ваш комментарий, кажется, использует слово «скорость», чтобы означать «продолжительность», так что для вас более высокая «скорость» на самом деле больше «продолжительность». Это обратное тому, что большинство людей понимают, что вы имеете в виду.

Автор: Joel Размещён: 31.07.2019 05:24
Вопросы из категории :
32x32