如何正确模拟感染率?

How do I properly simulate a rate of infection?

我正在通过尝试在封闭环境中模拟病毒感染率来练习我的 Netlogo 技能。我想出的模拟运行良好,但在查看结果后,在代理如何感染其他代理方面似乎有些不对劲。这是我的 "infection" 代码("normals" 是健康人,而 "carriers" 则相反):

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]
      ]
   ]
  ]

我的大体思路是,携带者和正常人在同一个patch上的交互中,如果正常人有r + infectivity(模拟中的一个控制变量,0-50的比率) = 大于 50 的数字,则代理会感染病毒。我希望每个普通代理都有一个 0-50 的随机 r 变量,如果在添加 "infectivity" 速率时该变量增长大于 50,则该代理会收到病毒。如果在添加 "infectivity" 率后 r 仍然低于 50,他仍然是 "normal".

我的代码看起来没问题吗?我觉得这里有些不对劲,但我看不太清楚。

只需解决您的特定代码:(1) 假设承运人和正常人是不同的品种,您不需要 other 因为承运人无论如何都不在 normals-here 中。 (2) 你对随机数的使用不是你想的那样,但我不知道如何解决它,因为逻辑无论如何都不起作用。

首先,您为 r 创建一个从 0 到 49 的随机值。假设它是 20。它总是 <50,因为随机数生成器总是 returns 一个 0 到 49 之间的数字。所以代码会设置变量病毒吗?对于承运人来说是假的。由于传染性不是负数,r 也将 <50 + 传染性。那么现在剩下的代码也会运行,哪个会设置病毒?对于补丁上的所有法线都为真(并将它们变成红色)。

因此,根据您的描述,我认为您想要 if r + Infectivity < 50 []。那至少会有病毒?对于传染性的某些值变为真实。但这还有一个问题,较低的Infectivity值将更可能保持该值<50,这与Infectivity的自然含义相反。

更一般地说,您已将载具与法线分开。但这不是流感的原理。有人被感染,然后能够感染其他人,他们不是不同的人群。因此,您真正需要的是以下设计思路:

  1. 人是有状态的(常用术语是易感、感染、移除或康复)
  2. 大多数开始时处于易感状态(按您的说法是正常的),但有些开始时处于感染状态(按您的说法是携带者)
  3. 你让每个当前处于感染状态的人都有机会将附近易感者的状态更改为感染
  4. 每个被感染的人都有机会将状态更改为已删除

您需要的另一件事是更好地处理概率。假设您希望某事发生的几率为 20%,这是典型的做法:

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

因此您生成一个随机数,然后在该数字小于您想要的概率时执行操作。在你的情况下,你可以有 if num < Infectivity 例如。