我正在尝试建立一种蝴蝶运动模型,其中蝴蝶被吸引到寄主植物的斑块上。该吸引力表示为存储在称为“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。
答案 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
的值)。它还提高了可读性。