我想模仿森林中不同树种的相互作用。为此,我还必须模拟森林的生长/扩散。 我面临以下两个问题:
以下是我的代码的相关部分:
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"在"传播"似乎不起作用。也许有人有个主意。 谢谢!
答案 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
有点愚蠢的例子,但希望能让你指出正确的方向!