Как правильно смоделировать скорость заражения?

Я практикую свои навыки работы с Netlogo, пытаясь имитировать скорость вирусного заражения в закрытой среде. Моделирование, которое я придумал, работает хорошо, но после просмотра результатов что-то кажется неправильным с точки зрения того, как агенты заражают других агентов. Вот мой код «заражения» («нормальные» — здоровые люди, а «носители» — наоборот):

ask carriers [
    if any? other normals-here [
    let r random 50
      if r < 50 [set virus? false]
    if r < 50 + Infectivity [
        ask normals-here [set virus? true] 
        ask normals-here [set color red]
      ]
   ]
  ]

Моя общая идея заключается в том, что при взаимодействии на одном и том же участке между носителем и нормальным агентом, если нормальный агент имеет r + инфекционность (контролируемая переменная в моделировании с коэффициентом 0-50) = число больше, чем 50, то агент получает вирус. Я хочу, чтобы у каждого нормального агента была случайная переменная r от 0 до 50, и если эта переменная становится больше 50 при добавлении уровня «заразности», этот агент получает вирус. Если r остается ниже 50 при добавлении коэффициента «инфекционности», он остается «нормальным».

мой код выглядит нормально? Я чувствую, что здесь что-то не так, но я не могу этого увидеть.


person Dani    schedule 20.03.2020    source источник


Ответы (1)


Просто обращаясь к вашему конкретному коду: (1) предполагая, что носители и нормалы - разные породы, вам не нужен other, потому что носители все равно не будут в normals-here. (2) Ваше использование случайного числа не делает то, что вы думаете, но я не могу понять, как это исправить, потому что логика все равно не работает.

Во-первых, вы создаете случайное значение для r от 0 до 49. Допустим, это 20. Это всегда будет ‹50, потому что генератор случайных чисел всегда возвращает число от 0 до 49. Итак, код установит переменную вирус? к ложному для перевозчика. Поскольку заразность не является отрицательной, r также будет ‹50 + заразность. Так что теперь запустится и остальной код, который установит вирус? на true для всех нормалей на патче (и сделать их красными).

Итак, судя по вашему описанию, вы хотите иметь if r + Infectivity < 50 []. Это будет хотя бы вирус? становятся верными для некоторых значений Infectivity. Но с этим есть еще одна проблема: более низкое значение Заразности с большей вероятностью сохранит значение ‹50, что противоположно естественному значению Заразности.

В общем, вы отделили носителей от нормальных. Но это не то, как работает грипп. Кто-то заражается и затем может заразить других людей, это не разные группы людей. Итак, что вам действительно нужно, так это что-то вроде следующих строк для дизайна:

  1. Люди имеют состояние (обычные термины восприимчивы, инфицированы, удалены или выздоровели)
  2. Большинство начинают в восприимчивом состоянии (нормально в ваших терминах), но некоторые начинают в зараженном состоянии (носители в ваших терминах).
  3. Вы получаете каждого человека, который в настоящее время находится в зараженном состоянии, чтобы иметь некоторый шанс изменить состояние ближайших восприимчивых на зараженных.
  4. Каждый зараженный имеет некоторый шанс изменить статус на удаленный.

Еще одна вещь, которая вам нужна, — это лучший способ обработки вероятности. Скажем, вы хотите, чтобы что-то произошло с вероятностью 20%, это типичный способ сделать это:

let num random 100
if num < 20 [ do something ]

Таким образом, вы генерируете случайное число, а затем выполняете действие, если это число меньше желаемой вероятности. В вашем случае у вас может быть, например, if num < Infectivity.

person JenB    schedule 20.03.2020
comment
Спасибо за ваш комментарий JenB! Это помогло мне понять, что моя первоначальная проблема заключалась в обращении к носителям вместо нормалей, и что я неправильно написал код заражения. Я разделил их на породы, потому что хочу, чтобы заражать могли только первоначальные носители (насколько я знаю, вы не сразу заразны при заражении определенным вирусом), так как модель должна имитировать заражение в замкнутом пространстве в продолжительность 120 минут. - person Dani; 24.03.2020