Netlogo 如何';询问';名单上的所有海龟
我想使用Netlogo 如何';询问';名单上的所有海龟,netlogo,Netlogo,我想使用ask循环遍历我所有的海龟,但我不希望顺序是随机的。我的解决方案是将所有海龟添加到一个列表中,按它们的ID排序,然后循环此列表: let sorted-turtles sort-on [who] turtles foreach sorted-turtles [ x -> ask x [ ; x is the turtle ; do something ] ] 这是正确的,但大大降低了我的模型的速度 我的问题是:这是要求所有海龟按预定顺序做某事的最佳方式吗 我曾
ask
循环遍历我所有的海龟,但我不希望顺序是随机的。我的解决方案是将所有海龟添加到一个列表中,按它们的ID排序,然后循环此列表:
let sorted-turtles sort-on [who] turtles
foreach sorted-turtles [
x -> ask x [ ; x is the turtle
; do something
]
]
这是正确的,但大大降低了我的模型的速度
我的问题是:这是要求所有海龟按预定顺序做某事的最佳方式吗
我曾尝试直接在列表中使用ask
(例如ask sorted turtles[print who]
,但NetLogo表示ask
需要一个代理集,而不是列表
提前感谢,,
尼克首先,你可以使用
对海龟进行排序
而不是对[谁]海龟进行排序。它做同样的事情,但它更简短、更惯用。不过,不确定它是否更快(可能有点帮助)
foreach sorted turtles[x->ask x[…]
模式应该足够快。创建列表的成本很高
因此,提高模型速度的主要方法是将已排序的海龟列表存储在全局变量中,并重用该列表,而不是每次都重新排序
但是,如果您不经常创建和/或杀死海龟,那么这只会起作用。在这种情况下,您每次都必须重新创建排序列表。“…要重新创建排序列表”或者更新列表。例如,如果您要创建一个新的turtle,请将其插入已排序列表中的正确位置。@mattsap这是一个很好的观点。插入很容易,因为它们可能发生在列表的末尾(即O(1)),但删除则更为棘手,因为您必须在列表中扫描正确的代理,即O(n)。或者你可以将死去的代理留在列表中,并在循环中添加一个检查
!=nobody
,但如果创建/杀死了很多代理,这可能会变得难以管理……根据情况,这可能值得,也可能不值得……如果我没记错的话,对海龟进行排序
实际上不需要对海龟进行排序,因为它们是We’我们内部已经按顺序排序了谢谢!你说得对,创建列表花了一些时间(我应该测试一下)。对海龟进行排序
也更好。