我正在构建一种'蜜蜂'模型,其中蜜蜂是乌龟剂,蜂蜜是补丁特定变量。在我的模型中,每个补丁根据特定分布在1-100之间分配“honey-here”值。
模型开始于蜜蜂只能从蜂蜜= 1的花朵中采集蜂蜜,然后他们将获得1单位的蜂蜜作为回报。在蜜蜂可以“瞄准”蜂蜜= 2的花朵之前,它们需要占据(即花朵上的蜜蜂)花蜜总量的X%= 1。例如,我可能要求蜜蜂达到80%的占用率,这意味着如果总共有10朵花,其中变量honey = 1,那么蜜蜂需要占用其中的8朵花才能开始寻找/定位花蜂蜜= 2.当每只蜜蜂单独行动时,%占用率将为变化
我的占用率计算存在性能问题。理想情况下,计算在乌龟程序中更新,因为它需要应用于循环内的每只乌龟。这是我目前必须找到的变量值,我需要在允许每只蜜蜂行动之前设置当前%占用率:
ask bees
[
;; set up variable based on ratio of number of turtles occupying target patch size against total number target patch size
;; note -- don't do this in one step to avoid divide by 0
let patch-count-current (count patches with [honey-here = bee-honey-target-size])
;; don't want number of bees, want number of unique patches
let patch-target-occupy count patches with [ (count bees-here > 0) and (honey-here = bee-honey-target-size) ]
...
稍后在代码中,在检查以确保patch-count-current不为0之后,我通过patch-target-occupy / patch-count-current
找到我的%占用率事实证明,这对我的处理器性能来说非常昂贵。特别是当我的蜜蜂数量增长时,这在我的模型中是指数级的。
对于循环的每次迭代,是否有更好的方法不会花费我这么多处理器?
谢谢!
-dp
答案 0 :(得分:1)
鉴于您对StephenGuerin的回应,您可以使用全局变量手动跟踪计数。如果一次只有一个bee-honey-target-size
,这很简单。只需制作patch-count-current
全局和patch-target-occupy
。然后,随着事情的变化增加或减少它们。
Sandpile模型(来自模型库)使用此技术来跟踪沙子的总量,而无需迭代补丁。查看total
全局变量的使用方式。
如果您需要一次跟踪所有bee-honey-target-size
的计数,您可以在全局变量中存储计数列表,其中列表的索引对应于值{{1 }}。遗憾的是,这非常麻烦,因此您必须编写辅助函数。
如果有任何需要澄清,请告诉我。
答案 1 :(得分:0)
占用百分比是该组的属性,每个模拟步骤只需计算一次。您的性能影响是由于计算模拟中每只蜜蜂的占用率。给定'目标蜂蜜'的百分比占用率的计算可能如下所示:
to-report calc-occupancy [target-honey]
report (sum [count turtles-here] of patches with [honey-here = target-honey]) / count turtles
end