您将列表用于有序集合以及无序集合的集合.我觉得它还有更多.
有序与无序是一个重要的区别,但还有另一个重要的区别:列表可以包含重复项,代理集则不能.
我不知道如何正确实现等效
filter或map使用ask.
你不需要实现它们:它们已经存在!
agentset版本filter是with:
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版本map是of:
[ 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使用它们来实现内存的例子很好,但还有其他用例.希望你看到它们时能够了解它们.