Выглядит довольно неплохо для начала, за исключением того, что для первого цикла вы должны помнить, что только восприимчивые люди могут заразиться, а для второго - вылечиться могут только инфицированные люди. Я также считаю, что вероятности перехода по каждому событию (восприимчивое получение сообщения от зараженного соседа, возможно, зараженное выздоровление) не зависит от текущего числа зараженных людей - они постоянны (я думаю, что вы ' вводит в заблуждение вероятности «массового эффекта» применительно к каждому отдельному эпизоду за один шаг времени - они этого не делают).
Немного тоньше то, как вы делаете первый цикл (для меня это не очевидно из модели SIR): я думаю, что вы хотите определить все "сообщения" сначала , , затем , которые одни вызывают переходы восприимчивые -> зараженные - то есть две петли, а не одна - потому что человек, который только что заразился на этом временном шаге, не может заразить других на этом же временном шаге , но только в будущем; Кроме того, переход заражен -> выздоровление невозможен для человека, который только что заразился на этом шаге, поэтому вам придется расположить петли немного по-другому!
Рассмотрите возможность моделирования каждого человека с двумя атрибутами «состояния»:
-- nummsgs, number of "messages" received this time step
-- compartment (susceptible, infected or recovered)
а также фиксированный набор соседей. Тогда:
for each individual:
if individual.compartment != infected:
continue
for each neighbor of the individual:
neighbor.nummsgs += 1
if (random number says so):
individual.compartment = recovered
for each individual:
if individual.compartment != susceptible:
continue
maybe (depending on random number & nummsgs):
individual.compartment = infected
for each individual:
individual.nummsgs = 0
это, кажется, лучше отражает общий поток (за вычетом сбора и регистрации общих подсчетов, что вы можете концептуально сделать как часть последнего цикла).