首页 > 解决方案 > 我的经纪人生了太多孩子

问题描述

我正在研究一个有性繁殖后代的模型,所以有两种代理类型,男性和女性。我要求代理人在达到一定年龄后进行繁殖:400 次,并每隔 400 次继续这样做。

如果有男性,女性应该只生一个孩子。该模型适用于最初的几代人,但随后人口激增。以一名女性和一名男性为起始人口,数字如下:2、3、7、19、575。我不知道为什么它突然从 19 增加到 575。

看起来一些雌性后代在出生后立即繁殖,尽管age = 0它们没有遵循这个命令:

 ask females [
        if  age > 0 and age mod 400  = 0 [
      reproduce
        ] 

这是完整的模型:

turtles-own [age]

breed[males male]
breed[females female]

females-own [ mates max-mate-count mate-count availa-males mother father]


to setup
  clear-all

    crt 2 [
    ifelse random 2 = 1 [set breed males] [set breed females]
  ]
  ask females [set color grey
    setxy random-xcor random-ycor
  ]

  ask males [set color red
    setxy random-xcor random-ycor
  ]

      reset-ticks
end

to go 

  ask turtles [increment-age]

  ask females [
    if  age > 0 and age mod 400  = 0 [
    choose-mates
  ]
  ]

 ask females [
    if  age > 0 and age mod 400  = 0 [
  reproduce
    ]
  ]


  tick
end

to increment-age
  set age (1 + age)
end

to choose-mates 

  ask females   [
    set mates males in-radius 100 with [age >= 400]
  ]
end


to reproduce 
    ask females with [count mates > 0 ]  [
    hatch 1  [
    set mother myself
    set father one-of [mates] of mother


      ifelse random 2 = 1 [set breed males
                          set color red
                        move-to one-of patches with [pcolor = black]
                        set age 0
                       ]

                        [set breed females
                         set color grey
                        move-to one-of patches with [pcolor = black]
                        set mate-count 0
                        set age 0

                        ]]]  
end 

希望你能帮忙!

标签: netlogo

解决方案


不要ask femalesreproduce过程中。见下文。我也提出了一些其他的建议。

turtles-own [age]

breed[males male]
breed[females female]

females-own [ mates max-mate-count mate-count availa-males mother father]


to setup
  clear-all
  create-males 1 [init-male]
  create-females 1 [init-female]
  reset-ticks
end
to init
  set age 0
  move-to one-of patches with [pcolor = black]
  ifelse (breed = males) [init-male][init-female]
end
to init-male
  set color red
end
to init-female
  set color gray
  set mate-count 0
end

to-report fertile
  report (age > 0 and age mod 400  = 0)
end

to go 
  ask turtles [increment-age]
  let _fertile (females with [fertile])
  ask _fertile [choose-mates]
  ask _fertile [reproduce]
  tick
end

to increment-age
  set age (1 + age)
end

to choose-mates 
  ;ask females   [  ;DONT DO THIS!
    set mates (males in-radius 100 with [age >= 400])
  ;]
end


to reproduce ;female proc
  ;ask females with [count mates > 0 ]  [ ;DON'T DO THIS!!
  if (count mates > 0) [  ;DO THIS INSTEAD
    hatch 1  [
      set mother myself
      set father one-of [mates] of mother
      set breed one-of (list males females)
      init
    ]
  ]
end 

推荐阅读