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

bfu*_*uda 3 netlogo

我正在尝试建立一个蝴蝶运动模型,其中蝴蝶被它们寄主植物的斑块所吸引。这种吸引力表示为概率,该概率存储在称为“attr-prob”的变量中。如果蝴蝶位于宿主植物斑块 (pcolor = 9.9) 的 25 m 内,它将以 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]]]
Run Code Online (Sandbox Code Playgroud)

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

我在 64 位 Java 中运行 Netlogo。

Bry*_*ead 5

尝试这样的事情:

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
  ]
]
Run Code Online (Sandbox Code Playgroud)

由于几个原因,这应该更快。

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

其次,使用in-radius前期而不是检查最后的距离会减少您正在查看的补丁数量。基本上,您将只检查半径中补丁的颜色和距离,而不是世界上的所有补丁。

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