NetLogo有没有办法让海龟(不同的世代)有不同的年龄?

NetLogo有没有办法让海龟(不同的世代)有不同的年龄?,netlogo,Netlogo,我想模拟森林中不同树种之间的相互作用。为此,我还必须模拟森林的生长/蔓延。 在这方面,我面临以下两个问题: 我想让这些树达到一个最低年龄,从这个年龄开始,它们每年可以孵化一棵新树。但我只知道如何让它们每20年繁殖一次 还有一个固定的年龄,在这个年龄,树木被砍掉。问题是,当达到这个年龄时,同一品种的所有树木都会被砍掉,即使它们的年龄实际上应该小于它们的收获年龄 以下是我的代码的相关部分: to go ask oaks [set age ticks] end to set-harvest-age

我想模拟森林中不同树种之间的相互作用。为此,我还必须模拟森林的生长/蔓延。 在这方面,我面临以下两个问题:

  • 我想让这些树达到一个最低年龄,从这个年龄开始,它们每年可以孵化一棵新树。但我只知道如何让它们每20年繁殖一次
  • 还有一个固定的年龄,在这个年龄,树木被砍掉。问题是,当达到这个年龄时,同一品种的所有树木都会被砍掉,即使它们的年龄实际上应该小于它们的收获年龄
  • 以下是我的代码的相关部分:

    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”似乎不起作用。也许你们中的某个人有个想法。
    谢谢大家!

    我认为您的主要问题是这里的流程顺序。每次调用
    go
    ,所有橡树都会将其年龄设置为当前的
    ticks
    。这包括你孵化的任何新树苗,因此即使它们孵化时的年龄是1岁,这些树苗也会立即被设置为与所有其他橡树相同的年龄(这只是蜱的数量。相反,你应该使用你的
    橡树自己的
    (或任何你想要的物种)变量跟踪每只海龟的年龄,方法是在每一个刻度上递增,而不是将其设置为刻度

    此外,最好使用
    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
    
    然后,让他们在树苗成熟时开始培育树苗。我在这里加入了一个
    如果有的话?其他橡树
    限定词,这样种群规模不会立即爆炸(因为树苗只能在没有成熟橡树的地方存活),但您将以对您的模型有意义的任何方式限制这种增长

    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
    
    现在只需使用
    go
    以正确的顺序调用这些过程:

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

    这是一个有点愚蠢的例子,但希望能为您指明正确的方向!

    我认为您的主要问题是这里的处理顺序。每次调用
    go
    ,所有橡树都会将其年龄设置为当前的
    滴答声
    。这包括您孵化的任何新树苗,因此即使它们孵化时的年龄为1,这些树苗也会被忽略树苗会立即被设置为与所有其他橡树相同的年龄(这只是蜱的数量。相反,你应该使用你的
    橡树自己的
    (或任何你想要的物种)变量来跟踪每个海龟的年龄,方法是每蜱一次递增,而不是设置为蜱一次

    此外,最好使用
    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
    
    然后,让他们在树苗成熟时开始培育树苗。我在这里加入了一个
    如果有的话?其他橡树
    限定词,这样种群规模不会立即爆炸(因为树苗只能在没有成熟橡树的地方存活),但您将以对您的模型有意义的任何方式限制这种增长

    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
    
    现在只需使用
    go
    以正确的顺序调用这些过程:

    to go
      ; Use the go procedure to schedule subprocedures
      ask oaks [
        get-older
        spread
        chop-down
      ]
      tick
    end
    
    这是一个有点傻的例子,但希望能为你指明正确的方向