我正在研究一个由鱼类、鲨鱼和浮游生物组成的生态系统模型。鱼吃浮游生物来获取能量,鲨鱼则吃鱼。然而,我需要鲨鱼和鱼随着年龄的增长而变大。然而,当我使用下面的代码时,鲨鱼和鱼并没有逐渐增加;它们一开始很小,但经过几次蜱虫后,它们立即长到最大的尺寸。
我已经尝试了以下代码,但正如我所解释的,鱼和鲨鱼的尺寸并不是逐渐变大,而是在几秒钟后立即变大。
to sharkGrow
ask sharks
[
set age age + 1
ifelse age < 12
[
set size size + 0.01 ; Growth rate
]
[
set size 12 ; Maximum size limit
]
]
end
to fishGrow
ask fishes
[
set age age + 1
ifelse age < 10
[
set size size + 0.1
]
[
set size 6
]
]
end
我有在主程序中调用的这两个子程序。
很容易看出您的成长模式(从尺寸 1 开始)是
1.01、1.02、1.03 ... 1.10、1.11、12.0(!!!) 从 1.11 到 12.0 的跳跃是因为 1+12*0.01 不是 12
如果每个刻度调用此方法,鲨鱼将在 12 个刻度内达到最大尺寸,这通常相当快。 如果你想让鲨鱼继续逐渐成长,你需要大幅增加你的
if
声明的价值。
类似的东西
to sharkGrow
ask sharks
[
set age age + 1
ifelse age < 110
[
set size size + 0.1 ; Growth rate
]
[
set size 12 ; Maximum size limit
]
]
end
将从尺寸1平滑成长到尺寸1+110*0.1=12。
你的代码工作得很好,鱼和鲨鱼都会变大。我认为唯一的问题是,您只是看不到差异(除非您的代码中其他地方有错误)。与最终尺寸相比,尺寸的增加很小。
假设您从 0 岁开始,体型为 1,您的鲨鱼将从体型 1(年龄=0)增长到体型 1.11(年龄=11),然后突然增加到体型 12(年龄=0) = 12)。鱼也是如此,但不太重要。
要进行测试,您可以右键单击其中一条鲨鱼/鱼并检查它(或使用命令中心中的
inspect one-of sharks
)。您可以在检查窗口的属性中找到大小。以低速开始模拟,看看尺寸如何增加。
因此,要解决您的问题,您需要调整尺寸的增加。如果您想逐渐增加,我建议将其缩放到您的最终尺寸(增加= Final_size / Final_age)。
所以对于你的代码来说,这可能看起来像:
to sharkGrow
ask sharks
[
set age age + 1
ifelse age < 12
[
set size size + 12 / 12 ; Growth rate
]
[
set size 12 ; Maximum size limit
]
]
end
to fishGrow
ask fishes
[
set age age + 1
ifelse age < 10
[
set size size + 6 / 10
]
[
set size 6
]
]
end