设定蚊子和人的潜伏期
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 之间的滴答数),但有一个等待发生的错误。
我的感染模型运行良好。现在我想增加蚊子或人类感染的潜伏期。潜伏期为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 之间的滴答数),但有一个等待发生的错误。