使用列表与代理集
Using Lists vs Agentsets
代理列表和代理集是NetLogo中两种不同的数据类型(可以用turtle-set
和sort
转换)。该文档指出您将列表用于有序的代理集合,并将集合用于无序集合。列表可用的匿名程序似乎使列表比代理集更灵活。另一方面,将 'ask' 与代理集结合使用在示例模型中更为常见,并且据说更具可读性。
能否将列表和匿名过程的任意组合转换为使用代理集和 'ask' 的语句?特别是,您能否使用 ask
和代理集提供 filter
或 map
的等价物?请告知其中一种或另一种更合适的情况,以及该结构提供的好处。
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 使用它们实现内存的例子很好,但还有其他用例。希望您在看到它们时会认识它们。
代理列表和代理集是NetLogo中两种不同的数据类型(可以用turtle-set
和sort
转换)。该文档指出您将列表用于有序的代理集合,并将集合用于无序集合。列表可用的匿名程序似乎使列表比代理集更灵活。另一方面,将 'ask' 与代理集结合使用在示例模型中更为常见,并且据说更具可读性。
能否将列表和匿名过程的任意组合转换为使用代理集和 'ask' 的语句?特别是,您能否使用 ask
和代理集提供 filter
或 map
的等价物?请告知其中一种或另一种更合适的情况,以及该结构提供的好处。
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
ormap
usingask
.
您不需要实施那些:它们已经存在!
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 使用它们实现内存的例子很好,但还有其他用例。希望您在看到它们时会认识它们。