使用列表与代理集

Using Lists vs Agentsets

代理列表和代理集是NetLogo中两种不同的数据类型(可以用turtle-setsort转换)。该文档指出您将列表用于有序的代理集合,并将集合用于无序集合。列表可用的匿名程序似乎使列表比代理集更灵活。另一方面,将 'ask' 与代理集结合使用在示例模型中更为常见,并且据说更具可读性。

能否将列表和匿名过程的任意组合转换为使用代理集和 'ask' 的语句?特别是,您能否使用 ask 和代理集提供 filtermap 的等价物?请告知其中一种或另一种更合适的情况,以及该结构提供的好处。

you use lists for an ordered collection of agents and sets for an unordered collection. I feel there is more to it though.

有序与无序是一个重要的区别,但还有另一个重要的区别:列表可以包含重复项,代理集不能。

I do not know how to properly implement an equivalent to filter or map using ask.

您不需要实施那些:它们已经存在!

filter 的 agentset 版本是 with:

my-agent-set with [ color = red ]

等同于:

filter [ a -> [ color = red ] of a ] my-agent-list

map 的 agentset 版本是 of:

[ color ] of my-agent-set

等同于:

map [ a -> [ color ] of a ] my-agent-list

而且,您现在可能已经凭直觉意识到,ask 等同于 foreach

掌握这些相似性是迈向 NetLogo 启蒙的重要一步。 (甚至是一般的编程启蒙。)

之前已经讨论过统一(或以某种方式概括)这两种类型的集合的语法和原语的想法(例如,here and here),但这种大的语言变化往往不会发生经常。

using agentsets (and 'ask') is more in line with the idea of Netlogo. It might be faster or easier to read.

正如上面的代码示例很好地说明的那样,代理集确实具有更好的语法。这是一件好事,因为在进行基于代理的建模时,您通常需要唯一代理的无序集合。

不过,它们并非天生就更快。添加到它们,特别是,比添加到列表慢。要使用人为的示例,这样做要快得多:

let my-list []
repeat 50 [ set my-list lput one-of turtles my-list ]
let my-agentset turtle-set my-list

比做:

let my-agentset no-turtles
repeat 50 [ set my-agentset (turtle-set my-agenset one-of turtles) ]

What is your experience on this matter?

大部分时间都需要代理集,但偶尔也需要列表。

Jen 使用它们实现内存的例子很好,但还有其他用例。希望您在看到它们时会认识它们。