我有感染模型,效果很好。现在,我想增加潜伏期,以实现感染,无论是在蚊子或人类。潜伏期为10天,当受感染的蚊子与易感人群相互作用时,人类暴露10天后即转为感染状态。
**ask turtles
[
if exposed?;; [set incubation-period incubation-period + 10 ]
[if random-float 10 < incubation-period
[set infected? true set color red]]]**添加以上代码后,海龟跳到受感染的地方,不要先暴露。
发布于 2022-04-06 11:10:43
(注:据我所知,潜伏期并不是生物体被感染后的一段时间,而是由感染开始的,亦是症状出现后的一段时间。然而,在我的回答和它包含的例子中,我将遵循我似乎从你的问题中理解的事情的方案:首先暴露,然后孵化,最后感染。我指出这一点是为了确保你的问题和我的答案之间没有含糊不清的地方)
我不知道你为什么要使用随机数,并且你没有分享你的代码的相关部分,所以我不确定我真的理解你想如何实现这个。
然而,让我们从肯定不起作用的地方开始:您说的是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中的第一个代码块中,每一个孵育疾病的代理将减少1的incubation值,这样,经过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之间),但是有一个bug在等待发生。
https://stackoverflow.com/questions/71761817
复制相似问题