Netlogo 海龟程序中的计算性能问题

Netlogo 海龟程序中的计算性能问题,netlogo,Netlogo,我正在建立一种“蜜蜂”模型,蜜蜂是海龟的代理人,而蜂蜜是一种特定于斑块的变量。在我的模型中,根据特定的分布,每个补丁都被分配一个1-100之间的“蜂蜜” 模型开始时,蜜蜂只能从蜂蜜=1的花朵中采集蜂蜜,然后它们会得到1单位的蜂蜜作为回报。在蜜蜂能够“瞄准”蜂蜜为2的花朵之前,它们需要占据蜂蜜为1的花朵总数的X%(即蜜蜂在花朵上)。例如,我可能要求蜜蜂达到80%的占有率,这意味着如果变量蜂蜜=1时总共有10朵花,那么蜜蜂需要占据其中的8朵花,然后才能开始寻找/瞄准蜂蜜=2的花。当每只蜜蜂单独行动时

我正在建立一种“蜜蜂”模型,蜜蜂是海龟的代理人,而蜂蜜是一种特定于斑块的变量。在我的模型中,根据特定的分布,每个补丁都被分配一个1-100之间的“蜂蜜”

模型开始时,蜜蜂只能从蜂蜜=1的花朵中采集蜂蜜,然后它们会得到1单位的蜂蜜作为回报。在蜜蜂能够“瞄准”蜂蜜为2的花朵之前,它们需要占据蜂蜜为1的花朵总数的X%(即蜜蜂在花朵上)。例如,我可能要求蜜蜂达到80%的占有率,这意味着如果变量蜂蜜=1时总共有10朵花,那么蜜蜂需要占据其中的8朵花,然后才能开始寻找/瞄准蜂蜜=2的花。当每只蜜蜂单独行动时,占用率百分比值将发生变化

我在计算入住率时遇到了性能问题。理想情况下,计算会在turtle过程中更新,因为它需要应用于循环中的每个turtle。以下是我目前必须找到的变量值,在允许每个蜜蜂行动之前,我需要设置当前占用率百分比:

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) ] 
...
在代码的后面,在检查确保当前补丁计数不是0之后,我通过补丁目标占用/当前补丁计数找到了我的占用百分比

事实证明,这对我的处理器性能是一个非常昂贵的打击。特别是随着我的蜜蜂数量的增长,这在我的模型中是指数型的

有没有一种更好的方法,在循环的每次迭代中都不会花费我这么多处理器

谢谢


-dp

入住率是集团的一个属性,每个模拟步骤只需计算一次。您的性能损失是由于计算模拟中每个蜜蜂的占用率。给定“目标蜂蜜”的入住率计算如下:

to-report calc-occupancy [target-honey]
   report (sum [count turtles-here] of patches with [honey-here = target-honey]) / count turtles
end

根据您对StephenGuerin的回复,您可以使用全局变量手动跟踪计数。如果一次只有一个蜂蜜目标大小,这是非常简单的。只需将
补丁计数设置为当前
全局,并将
补丁目标设置为占用
。然后,随着情况的变化,增加或减少它们

沙堆模型(来自模型库)使用此技术来跟踪沙子的总量,而无需对补丁进行迭代。查看如何使用
total
全局变量

如果需要一次跟踪所有
蜜蜂目标大小的计数,可以将计数列表存储在全局变量中,其中列表的索引对应于
蜜蜂目标大小的值。不幸的是,这要复杂得多,所以您肯定要编写帮助函数


如果需要澄清,请告知我。

理解并同意。在我的模拟中,我想知道/希望是否有一种方法可以在整个海龟程序中运行此计算,以更新每个海龟。但目前我使用了与上面类似的方法,将此计算转移到一个组过程中。这是我的处理器能处理的唯一方法。谢谢