Как просчитать коронавирус? Моделирование распространения вирусов и инфекций по сетям в Python

В свете глобальной пандемии коронавируса COVID-19 самое время поговорить о моделировании инфекционных процессов. В данной статье рассмотрен один из способов моделирования распространения вирусов по сетевым структурам. Для построения графа использован пакет networkx, для моделирования процесса вспышки и распространения инфекции использован пакет EoN (Epydemics on Networks)

Для начала необходимо сгенерировать или загрузить модель сети, на которой мы будем запускать моделирование инфекционных процессов. Тому, как моделировать сети в Python с помощью модуля networkx посвящена отдельная статья.

Прежде чем приступать к моделированию обратимся к математическим моделям, которые обычно используются для моделирования инфекционных процессов. Две основные модели для моделирования распространения вирусов - SIR и SIS. Модели типа SIR предполагают три возможных состояния узлов сети - восприимчивые к инфекции (S - Susceptible), инфицированные (I - Infected) и выбывшые (R - Removed). Третья категория (R) включает как выздоровевшие так и уничтоженые элементы сети (в рамках модели SIR эти два состояния равноценны, так как подразумевается, что через них инфекция передаваться не может).

Второй тип модели - SIS отличается от SIR тем, что узлы могут быть инфицированны повторно.

В качестве первого примера построим модель простейшей двухмерной сети и смоделируем инфекционный процесс типа SIS:

import EoN
import networkx as nx
import matplotlib.pyplot as plt
tmax = 10
tau = 0.05
gamma = 0.001

G = nx.grid_2d_graph(100,100) #each node is (u,v) where 0<=u,v<=99

initial_infections = [(u,v) for (u,v) in G if 45<u<55 and 45<v<55]

sim = EoN.fast_SIS(G, tau, gamma, initial_infecteds = initial_infections,
               return_full_data=True, tmax = tmax)
pos = {node:node for node in G}
sim.set_pos(pos)
sim.display(10, node_size = 20)

входные параметры:

tmax - время течения процесса распространения инфекции,

tau - "заразность" инфекционного процесса,

gamma - вероятность выздоровления узла сети в следующий момент времени (t+1).

В этой модели на этапе t0 мы инфецируем участок в центре сети размером 5 на 5. 

В результате симуляция инфекционного процесса, запечатленного в момент времени t=10 будет выглядеть примерно так:

Добавив один цикл в последнюю строку кода мы получим картину распространения инфекционного процесса в каждый момент времени t.