在NetLogo中有没有办法给不同年龄的海龟(不同代)?

时间:2018-01-15 16:02:59

标签: netlogo

我想模仿森林中不同树种的相互作用。为此,我还必须模拟森林的生长/扩散。 我面临以下两个问题:

  1. 我希望树木达到最低年龄,每年它们可以孵化出一棵新树。但我只知道如何使它们每隔20年重现一次。
  2. 树木被砍伐的城镇还有一个固定的年龄。问题是,当达到这个年龄时,一个品种的所有树木都会被砍伐,即使它们的年龄实际上应该低于它们的收获年龄。
  3. 以下是我的代码的相关部分:

    to go
     ask oaks [set age ticks]
    end
    
    to set-harvest-age 
     ask oaks [set harvest-age 240]
    end
    
    to spread 
    ask oaks [
    if (age mod 30 = 0) and (count oaks > 1) [hatch-oaks 1 [setxy random-xcor random-ycor set age 1]]]
    end
    
    to chop-down 
     ask oaks [if (age >= harvest-age) [die]]
    end
    

    "设定年龄1"在"传播"似乎不起作用。也许有人有个主意。 谢谢!

1 个答案:

答案 0 :(得分:2)

我认为你的主要问题是这里的流程订单。每次调用go时,所有橡树都会将其年龄设置为当前ticks。这包括你孵化过的任何新树苗,所以即使它们的年龄是1,当它们孵化时,这些树苗会立即与所有其他橡树的年龄相同(这只是蜱的数量。相反,你应该使用你的oaks-own(或任何你想要的物种)变量来跟踪每只乌龟的年龄,方法是每次滴答都加上它,而不是将它设置为的滴答声。

此外,使用go或类似命名的过程作为调度程序调用所有其他相关过程可能更好。例如,请查看以下设置块:

breed [ oaks oak ]
oaks-own [ age harvest-age ]

to setup
  ca
  spawn-oaks
  reset-ticks
end

to spawn-oaks ; setup procedure
  create-oaks 10 [
    set shape "tree"
    set color green
    setxy random-xcor random-ycor
    ; Set the harvest age
    set harvest-age 100
    ; Randomly choose the age of the first generation
    ; to be somewhere between 50 and 75
    set age 50 + random 25
  ]
end

这会产生10个橡树,其年龄在50到75之间。它还设定了它们的收获年龄。现在,使用一个程序将每个橡木的个体年龄增加一个蜱:

to get-older ; Oak procedure
    set age age + 1
end

然后,让他们在成熟时开始创造树苗。我已经包含了一个if any? other oaks-here限定符,因此人口规模不会立即爆炸(因为树苗只能在没有确定橡树的情况下生存)但是你会以任何方式限制这种增长感觉你的模特。

to spread ; Oak procedure
  ; Get living, mature oaks to spead saplings nearby
  ; only some years (to avoid population explosion)
  if age > 30 and random 50 < 5 [
    hatch 1 [
      ; set sapling age to zero, and have it
      ; move away from its parent randomly
      set age 0
      rt random 360
      fd random 5
      if any? other oaks-here [
        die
      ]
    ]
  ]
end

最后,您的chop-down程序实际上应该可以正常工作,而不会立即更正age问题:

to chop-down ; Oak procedure
  if age >= harvest-age [
    die
  ]
end

现在所需的只是使用go以正确的顺序调用这些程序:

to go
  ; Use the go procedure to schedule subprocedures
  ask oaks [
    get-older
    spread
    chop-down
  ]
  tick
end

有点愚蠢的例子,但希望能让你指出正确的方向!