海龟移动到最近的某种颜色的补丁 - 如何加快这个过程?

时间:2016-03-15 18:42:58

标签: netlogo

我正在尝试建立一种蝴蝶运动模型,其中蝴蝶被吸引到寄主植物的斑块上。该吸引力表示为存储在称为“attr-prob”的变量中的概率。如果蝴蝶位于宿主植物补丁的25米范围内(pcolor = 9.9),它将移动到最近的宿主植物补丁,其概率为attr-prob。

我写了以下代码:

if (distance (min-one-of (patches with [pcolor = 9.9]) [distance myself]) )     <= 25 
 [if random-float 1 < attr-prob [move-to min-one-of (patches with [pcolor = 9.9]) [distance myself]]]

这段代码似乎正在做我想做的事情,但是,当我将这部分添加到我的模型中时,它会大大减慢它的速度。有没有人有任何替代建议可以更快地编码?

我在64位Java中运行Netlogo。

1 个答案:

答案 0 :(得分:3)

尝试这样的事情:

if random-float 1 < attr-prob [
  let target-patch min-one-of (patches in-radius 25 with [pcolor = 9.9]) [distance myself]
  if target-patch != nobody  [
    move-to target-patch
  ]
]

由于一些原因,这应该更快。

首先,最快的代码是永不运行的代码。因此,在最开始进行概率检查可以让您尽可能跳过计算最接近的补丁。

其次,预先使用in-radius而不是检查最后的距离会减少您要查看的补丁数量。基本上,您只需要检查半径中贴片的颜色和距离,而不是检查世界上的所有贴片。

最后,在您的原始代码中,您找到了最近的补丁两次。相反,您可以将补丁存储在本地变量(我提供的代码中的target-patch)中,这样您只需要找到一次。仅这一点应该使代码的速度加倍(取决于attr-prob的值)。它还提高了可读性。