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’我们内部已经按顺序排序了谢谢!你说得对,创建列表花了一些时间(我应该测试一下)。
对海龟进行排序
也更好。