我在Netlogo中使用嵌套的ifs来指定鹿繁殖概率时遇到了麻烦。到目前为止,这是我想出的:
to reproduce-adult
let chance-fawn random-float 1.001
let chance-to-reproduce .9
let chance-for-one .3
let chance-for-two .4
let chance-for-three .02
if any? femadults [
ask femadults [
if random-float 1.001 < chance-to-reproduce [
if chance-fawn < chance-for-three
[set births (births + 3)
let new-offspring nobody
hatch-infants 3
[set new-offspring self set color red - 1 set size 1]
set offspring new-offspring]
if chance-fawn > chance-for-two
[set births (births + 2)
let new-offspring nobody
hatch-infants 2
[set new-offspring self set color red - 1 set size 1]
set offspring new-offspring]
if (chance-fawn > .02) and (chance-fawn < chance-for-one)
[set births (births + 1)
let new-offspring nobody
hatch-infants 1
[set new-offspring self set color red - 1 set size 1]
set offspring new-offspring]
]]]
end
基本上,母鹿怀孕的机会是90%。因此,我希望如果母鹿怀孕,她有1、2或3个小鹿。拥有1只小鹿的几率是28%。有2条小鹿的几率是60%。拥有3只小鹿的几率是2%。我当前代码的问题是,如果“ chance-fawn”介于.3和.4之间,则if语句中不应该包含它,而应将它作为具有2条小鹿的60%的一部分。是否有更好的方法,可以使用if语句或其他方法?谢谢!
答案 0 :(得分:3)
您可以使用ifelse
做您想做的事,但是您可能想看看rnd
扩展名,因为它简化了这种事情。具体来说,weighted-one-of-list command允许您选择轮盘赌,在其中为不同的选项分配不同的权重。例如,查看以下设置:
extensions [ rnd ]
globals [ fawn-probs ]
to setup
ca
crt 10 [
setxy random-xcor random-ycor
]
set fawn-probs [ [ 1 0.31 ] [ 2 0.67 ] [ 3 0.02 ] ]
set offspring-list-norm []
set offspring-list-alt []
reset-ticks
end
您有一个名为fawn-probs
的列表,该列表将不同的概率归为不同的出生事件。注意,通过将它们除以0.9,可以使它们的总和等于1;正如p._phidot_指出的那样,您的原始概率没有。现在,您可以使用rnd:weighted-one-of-list
让海龟从fawn-probs
列表中随机选择适当加权的小鹿数量。
to reproduce
ask turtles [
; If a spawning event occurs
if random-float 1 < 0.9 [
; Select the number of fawns to spawn based on the weighted
; probability list 'fawn-probs'
let num-to-spawn first rnd:weighted-one-of-list fawn-probs [ p -> last p ]
hatch num-to-spawn [
rt random 360
fd 1
]
]
]
end
或者,如果您希望将10%的未出生机会捆绑到同一列表中,则可以跳过if random-float ...
块,然后执行以下操作:
to reproduce-alternative
set fawn-probs [ [ 0 0.1 ] [ 1 0.28 ] [ 2 0.6 ] [ 3 0.02 ] ]
ask turtles [
let num-to-spawn first rnd:weighted-one-of-list fawn-probs [ p -> last p ]
hatch num-to-spawn [
rt random 360
fd 1
]
]
end
答案 1 :(得分:1)
好..这是我的画(未按比例绘制):
+---------+---------+---------+---------+---------+--------->
0.0 0.02 0.1 0.3 0.4 0.5
第一个if后面的数字线..您覆盖了:
+=========+---------+---------+---------+---------+--------->
0.0 0.02 0.2 0.3 0.4 0.5
如果在第二天:
+=========+---------+---------+---------+=========+=========>
0.0 0.02 0.2 0.3 0.4 0.5
第三个,如果:
+=========+=========+=========+---------+=========+=========>
0.0 0.02 0.2 0.3 0.4 0.5
因此,逻辑上您的条件不会覆盖0.3到0.4的范围。 (:
还请注意,例如,如果您生成的随机数完全是0.02,则第一个if和第三个if也会错过它。除非您使用<=
或>=
之类的东西。
希望能说明..(: