使用列表与代理集

Qua*_*lmy 6 netlogo

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

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

Nic*_*tte 7

您将列表用于有序集合以及无序集合的集合.我觉得它还有更多.

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

我不知道如何正确实现等效filtermap使用ask.

你不需要实现它们:它们已经存在!

agentset版本filterwith:

my-agent-set with [ color = red ]
Run Code Online (Sandbox Code Playgroud)

是相同的:

filter [ a -> [ color = red ] of a ] my-agent-list
Run Code Online (Sandbox Code Playgroud)

agentset版本mapof:

[ color ] of my-agent-set
Run Code Online (Sandbox Code Playgroud)

是相同的:

map [ a -> [ color ] of a ] my-agent-list
Run Code Online (Sandbox Code Playgroud)

而且,正如你现在可能已经直觉的那样,ask相当于foreach.

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

之前已经讨论了统一(或以某种方式概括)这两种类型集合的语法和基元的想法(例如,这里这里),但是那种大的语言变化往往不会经常发生.

使用agentsets(和'ask')更符合Netlogo的想法.它可能更快或更容易阅读.

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

不过,它们本身并不快.特别是添加到它们比添加到列表要慢.要使用一个人为的例子,它可以更快地完成:

let my-list []
repeat 50 [ set my-list lput one-of turtles my-list ]
let my-agentset turtle-set my-list
Run Code Online (Sandbox Code Playgroud)

比做:

let my-agentset no-turtles
repeat 50 [ set my-agentset (turtle-set my-agenset one-of turtles) ]
Run Code Online (Sandbox Code Playgroud)

你对这件事的经历是什么?

代理集是大多数时候所需要的,但是列表也需要一次.

Jen使用它们来实现内存的例子很好,但还有其他用例.希望你看到它们时能够了解它们.