在我的模拟中,每个乌龟都有一个my-home变量,它是补丁代理家族所在,因此具有相同Family-ID的代理具有相同的my-home,直到其中一个代理移出或家庭成长为超过7个代理。
当代理人想要搬出时,我必须检查附近是否有任何补丁而不是另一个代理我的家,我所做的是将所有我的家都存放在一个列表中并检查是否有任何可能的选择下一个家不是这个列表的成员,但我相信应该有更好的方法来做到这一点:
let all-homes [my-home] of agents with [belongs_to = BS]
set my-home min-one-of patches with [not member? self all-homes and label_ = BS][distance m]
答案 0 :(得分:2)
min-one-of patches with ...
评估整个世界的每个补丁。那会很慢。我建议先搜索附近的补丁,然后再搜索更远的补丁,等等。大多数情况下,乌龟只会在非常简短的搜索后找到一个新家,所以你将用代码为O(1)-ish的补丁数替换代码为O(n)的代码。这应该可以解决此代码的主要性能问题。
我能想到的最简单的搜索程序是让乌龟简单地沿着随机方向前进并继续移动fd 1
直到它落在免费补丁上。但是如果你想做一些更加严谨的事情,总能找到最近的新家,你也可以这样做;你只需要编写更多代码。
构建all-homes
列表可能只是次要的性能问题,但它也可以解决。我能想到的最简单的解决方法是添加:
patches-own [home?]
使用ask patches [ set home? false ]
初始化它,然后确保只要乌龟采用补丁作为其主页,它就会ask my-home [ set home? true ]
。现在,您可以使用member? self all-homes
替换home?
。毕竟,你真的不需要知道所有家庭补丁是什么;你只需要知道一些特定的补丁是否是一个家庭补丁。