我正在编写一些代码,为流感流行的人群接种疫苗。有两种疫苗(代码中称为HOV和HEV); HOV已经完成了。我尝试/想要做的是将蓝龟的代理集转换为列表,然后我可以一次迭代一只乌龟。我需要这样做,因为HEV条件必须给每只蓝龟提供略微不同的疫苗(即每种疫苗中的流感病毒株必须略有不同)。但是,NetLogo正在突出显示“foreach [vax-turtles]”,并显示一条错误消息“预期文字值。”
我的代码如下,“if疫苗=”HEV“”这段代码是我需要帮助的:
extensions [csv]
globals [strain_list_list epidemic-threshold cumulative-infections proportion-of-infection currently-infected peak-prevalence vax-strain]
turtles-own [infection-period infection-number tflu-strain immune-label ant-distance cross-immunity]
patches-own [fomite-age pflu-strain]
to setup
clear-all
setup-turtles
set strain_list_list (list t-sorted-strain-list)
print strain_list_list
reset-ticks
end
to-report t-sorted-strain-list
report map [i -> [tflu-strain] of i] sort turtles
end
to setup-turtles
create-turtles 100
ask turtles [setxy random-xcor random-ycor]
ask turtles [set color white set infection-number 0 set immune-label -999999999999 set tflu-strain -999999999999]
ask one-of turtles [set color red set infection-period 0 set infection-number 1 set immune-label 0 set tflu-strain 0]
if vaccine = "HOV" [
ifelse (one-of [1 2] = 1) [
set vax-strain (random ((2 * drift-size) + 1))]
[set vax-strain (-1 * random ((2 * drift-size) + 1))]
ask n-of prop-vax turtles with [color = white] [set color blue set immune-label vax-strain]
]
if vaccine = "HEV" [
let vax-turtles (list turtles with [color = blue])
ask n-of prop-vax turtles with [color = white] [set color blue]
foreach [vax-turtles] [
ifelse (one-of [1 2] = 1) [
set vax-strain (random ((2 * drift-size) + 1))]
[set vax-strain (-1 * random ((2 * drift-size) + 1))]
]
]
set epidemic-threshold "no"
set cumulative-infections 0
set peak-prevalence 0
end
to go
if ticks = flu-season-length [stop]
move-infecteds
move-uninfecteds
transmit
mutate
update-immunity
track-infecteds
set cumulative-infections (count turtles with [infection-period = 1] + cumulative-infections)
set proportion-of-infection (100 - (count turtles with [immune-label = -999999999999]))
set currently-infected (count turtles with [infection-period = 1])
csv:to-file "strains_each_tick.csv" strain_list_list
set strain_list_list lput t-sorted-strain-list strain_list_list
tick
end
to move-uninfecteds ;; uninfected turtles move faster than infected ones
ask turtles with [color = white or color = blue] [
right random 360
forward 5
]
end
to move-infecteds ;; infected turtles move slower than uninfected ones and always transmit infection to patches before they leave them
ask turtles with [color = red] [
if pcolor = black [
set pcolor red
set fomite-age 0
set pflu-strain tflu-strain]
right random 360
forward 3
]
end
to transmit ;; uninfected turtles are infected by fomites (red patches) with some probability. immune-labelling currently first infection
ask turtles with [color = white or color = blue and pcolor = red] [
if immune-label != pflu-strain [
set ant-distance (abs (immune-label - pflu-strain))
set cross-immunity (natural-immunity * (1 - (ant-distance / antigenic-distance-limit)))
if cross-immunity < 0 [set cross-immunity 0]
if random 100 < (((100 - cross-immunity) / 100) * probability-of-infection)
[set color red set infection-period 0 set infection-number infection-number + 1 set tflu-strain pflu-strain]
]
if immune-label = pflu-strain [
if random 100 < (((100 - natural-immunity) / 100) * probability-of-infection)
[set color red set infection-period 0 set infection-number infection-number + 1 set tflu-strain pflu-strain]
]
]
end
to mutate ;; some probability of mutation (change in strain label) when an individual receives infection from a patch
ifelse in-host [
ask turtles with [color = red] [
if random 100 < probability-of-mutation [
ifelse (one-of [1 2] = 1) [
set tflu-strain (tflu-strain + (random (drift-size + 1)))]
[set tflu-strain (tflu-strain - (random (drift-size + 1)))]
]
]
]
[ask turtles with [color = red and infection-period = 0] [
if random 100 < probability-of-mutation [
ifelse (one-of [1 2] = 1) [
set tflu-strain (tflu-strain + (random (drift-size + 1)))]
[set tflu-strain (tflu-strain - (random (drift-size + 1)))]
]
]
]
end
to update-immunity
ask turtles with [color = red and infection-period = 0] [
ifelse immune-labelling = "first-infection" [
if immune-label = -999999999999 [
set immune-label tflu-strain]]
[set immune-label tflu-strain]
]
end
to track-infecteds ;; turtles with given infection period should become uninfected
ask turtles with [color = red] [
set infection-period infection-period + 1
if infection-period = age-infection-max [
set color white set infection-period 0 set tflu-strain -999999999999
]
]
ask patches with [pcolor = red] [
set fomite-age fomite-age + 1
if fomite-age > max-fomite-persistence [
set pcolor black
]
]
end
任何建议都将不胜感激!感谢
答案 0 :(得分:3)
问题在于
行let vax-turtles (list turtles with [color = blue])
list
原语创建一个列表,但不创建turtles with [color = blue]
列表。而是创建一个参数列表,在这种情况下是一个单一的angentset。您需要一个代理集 中的代理列表。由于of
始终返回列表,因此of
记者是最简单的方法。
let vax-turtles [self] of turtles with [color = blue]
或者,如果您希望对列表进行排序,则可以使用sort
,它也始终返回列表。
let vax-turtles sort turtles with [color = blue]
至于你在下面的评论中描述的问题,你需要让每个vax-turtle设置自己的vax-strain(我假设是一个海龟自己的变量)。假设您使用的是NetLogo 6.x,
if vaccine = "HEV" [
let vax-turtles [self] of turtles with [color = blue]
ask n-of prop-vax turtles with [color = white] [set color blue]
foreach [vax-turtles] [t ->
ifelse (one-of [1 2] = 1) [
ask t [set vax-strain (random ((2 * drift-size) + 1))]]
[ask t [set vax-strain (-1 * random ((2 * drift-size) + 1))]]
]
]
但如果所有vax-turtles的漂移大小相同,那么,鉴于random
,JenB的解决方案对于任何两只乌龟的vax-strain都会给出相同的值,那么它是不太可能的不?
查尔斯
答案 1 :(得分:2)
看看你的代码,我看不出为什么你需要进行迭代而不是问,并且坚持要求更加清晰。所以,尝试替换:
if vaccine = "HEV" [
let vax-turtles (list turtles with [color = blue])
ask n-of prop-vax turtles with [color = white] [set color blue]
foreach [vax-turtles] [
ifelse (one-of [1 2] = 1) [
set vax-strain (random ((2 * drift-size) + 1))]
[set vax-strain (-1 * random ((2 * drift-size) + 1))]
]
]
与
if vaccine = "HEV" [
let vax-turtles turtles with [color = blue]
ask n-of prop-vax turtles with [color = white] [set color blue]
ask [vax-turtles] [
ifelse (one-of [1 2] = 1)
[ set vax-strain (random ((2 * drift-size) + 1)) ]
[ set vax-strain (-1 * random ((2 * drift-size) + 1)) ]
]
]
就此而言,我认为不同的值只是相同值的不同符号,所以你可以这样做:
if vaccine = "HEV" [
let vax-turtles turtles with [color = blue]
ask n-of prop-vax turtles with [color = white] [set color blue]
ask [vax-turtles] [
set vax-strain one-of [-1 1] * (random ((2 * drift-size) + 1))
]
]
另外,我不确定你是否故意这样做,但是在创建vax-turtles
agentset后你将比例改为蓝色。这意味着在下一次vax-strain
或下次运行代码时,新更改的海龟将不会被赋予tick
。此外,您拥有的代码将为所有蓝色海龟分配一个新的vax-strain
,即使它们在之前的步骤中变为蓝色。如果您确实希望仅为vax-strain
分配一次并且要更改颜色以显示此颜色,请尝试:
if vaccine = "HEV" [
ask n-of prop-vax turtles with [color = white]
[ set color blue
set vax-strain one-of [-1 1] * (random ((2 * drift-size) + 1))
type "drift-size is " type drift-size type " and vax-strain is " print vax-strain ;; new line here for diagnostics
]
]
更新:ask
为每个代理提供一个新的随机数。您可以通过运行完整的模型来看到这一点:
turtles-own [testnum]
to setup
clear-all
create-turtles 10
[ set testnum random 5 ]
print [testnum] of turtles
end
答案 2 :(得分:0)
我认为
foreach sort-on [who] turtles with [color = blue]
就足够了。