在Netlogo中使用嵌套的if或ifelse指定概率

时间:2018-07-25 14:12:01

标签: if-statement netlogo

我在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语句或其他方法?谢谢!

2 个答案:

答案 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也会错过它。除非您使用<=>=之类的东西。

希望能说明..(: