Как правильно имитировать уровень заражения? - PullRequest
0 голосов
/ 20 марта 2020

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

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 после добавления показателя «инфекционности», он остается «нормальным».

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

1 Ответ

1 голос
/ 20 марта 2020

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

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

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

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

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

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

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

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

...