设定蚊子和人的潜伏期

setting incubation period for mosquitoes and human

我的感染模型运行良好。现在我想增加蚊子或人类感染的潜伏期。潜伏期为10天, 当受感染的蚊子与易感人群相互作用时,人类会暴露 10 天,然后变为感染状态。

**ask turtles
  [
    if exposed?;; [set incubation-period incubation-period + 10 ]
   [if random-float 10 < incubation-period
      [set infected? true set color red]]]**

添加以上代码后海龟跳转到infected,不要先暴露

(注意:我理解潜伏期不是生物体被感染后的时间段,而是感染后开始潜伏期,是出现症状的时间段。但是,在我的回复和它包含的示例中,我将遵循我似乎从您的问题中理解的事情的方案:首先暴露,然后孵化,最后感染。我指出这一点是为了确保没有歧义在你的问题和我的回答之间)


我不确定你为什么要使用随机数,而且你没有分享代码的相关部分,所以我不确定我是否真的理解你想要如何实现它。

但是,让我们从那里肯定不起作用的地方开始:你说 set incubation-period incubation-period + 10。无论 incubation-period 之前的值是多少,现在它至少是 10(当然,假设 incubation-period 永远不会为负数)。

然后你检查条件random-float 10 < incubation-period。一方面,我们已经说过 incubation-period 现在至少是 10;另一方面,random-float 10 产生的值严格小于 10。这意味着条件 总是 评估为真,因此每个代理 运行 这些行将跳转到 set infected? true set color red.


现在的问题是:你们打算如何实施孵化?你为什么要考虑那种情况?

我不是医务人员,但根据我的理解,我可以想象你希望你的潜伏期是一段时间后会发生一些事情。

在这种情况下,您需要实施一个计数器,而不是根据随机数检查条件:每个接触受感染蚊子的代理都会开始倒计时,该倒计时等于孵化持续时间;当倒计时为零时,代理被感染。

你说你希望孵化持续 10 天。假设在您的模型中,一滴答等于一天,您可以执行以下操作:

breed [humans human]
breed [mosquitos mosquito]

turtles-own [
  infected?
  incubation
]


to setup
  clear-all
  reset-ticks
  
  set-default-shape humans "person"
  set-default-shape mosquitos "bug" ; The closest to a mosquito that was in the library!
  
  create-humans 100
  create-mosquitos 10
  
  ask turtles [
    setxy random-xcor random-ycor
    set infected? FALSE
    set color white
  ]
  
  ask n-of 2 mosquitos [
    become-infected
  ]
end


to go
  ask turtles with [incubation > 0] [
    set incubation incubation - 1
    if (incubation = 0) [
      become-infected
    ]
  ]
  
  ask turtles [
    right random 360
    forward 1
  ]
  
  ask mosquitos with [infected?] [
    let targets turtles-here with [not infected?]
    if (targets != NOBODY) [
      ask targets [
        start-incubation
      ]
    ]
  ]
  
  tick
end


to start-incubation
  set incubation 10
  set color orange + 1
end


to become-infected
  set infected? TRUE
  set color red
end

正如您在 go 的第三个代码块中看到的那样,当健康代理与受感染的蚊子在同一补丁上时,健康代理会转到 start-incubation 并设置 incubation 到 10.

go中的第一个代码块中,每个正在孵化疾病的代理都会将incubation的值减1,这样,经过10次迭代后,它将达到0。当发生这种情况时,代理会转到 become-infected.

倒计时在 go 开始实施,而不是在检查曝光的行之后的某个时间点实施,原因很简单:如果倒计时是在曝光之后,则意味着代理会将 incubation 设置为 10,但也会在它之后立即将其减少 1,结果是真正的孵化将持续 9 天而不是 10 天。


您可能希望在孵化从个体到个体的实际长度中包含一些随机性。当您在完成孵化的条件中引入随机性时,我不确定这是否是您所考虑的,但无论如何我还是要把它放在这里。

如果你想这样做,随机性只能在确定该个体的孵化时间长度时使用一次。例如,如果您希望孵化时间在 5 到 10 天之间,您可以这样做:

to start-incubation
  set incubation 5 + random 6
  set color orange + 1
end

这样,您可以确保 incubation 以至少 5 的值开头,再加上 0 到 5 之间的数字。

这是在 NetLogo 中使用的有用方案。概括一下:

to start-incubation
  let min-incubation 5
  let max-incubation 10
  set incubation min-incubation + random (max-incubation - min-incubation + 1)
  set color orange + 1
end

最后说明:我强烈建议您避免在这种情况下使用 random-float,除非出于某种我看不到的原因绝对有必要这样做。请改用 random

如果您使用 random-float,您会得到一个十进制数。这意味着,如果您采用将潜伏期设置在一个范围内的方法(如我在 5 到 10 之间的示例中的范围),您可能会从 8.5 开始得到 incubation,这意味着在 8 个滴答之后将是 0.5,在 9 个跳动之后它将是 -0.5。这样,条件 incubation = 0 永远不会评估为真。当然,您可以将其更改为 incubation <= 0,但这与使用 random 的结果完全相同(即孵化持续 5 到 10 之间的滴答数),但有一个等待发生的错误。