代理和代理集列表是NetLogo中的两种不同数据类型(可以使用turtle-set
和sort
进行转换)。该文档指出您对无序集合的有序代理集和集合使用列表。似乎列表可用的匿名过程使列表比代理集更灵活。另一方面,将“ask”与代理集结合使用在示例模型中更为常见,并且已被声明更具可读性。
可以使用agentset和'ask'将列表和匿名过程的任意组合转换为语句吗?特别是,您是否可以使用filter
和代理集提供map
或ask
的等效项?请告知一些情况,其中一个或另一个更合适,以及结构提供的好处。
答案 0 :(得分:7)
您将列表用于有序集合以及无序集合的集合。我觉得它还有更多。
有序与无序是一个重要的区别,但还有另一个重要的区别:列表可以包含重复项,代理集则不能。
我不知道如何使用
filter
正确实现map
或ask
的等效内容。
你不需要实现它们:它们已经存在!
filter
的代理集版本为with
:
my-agent-set with [ color = red ]
与:
相同filter [ a -> [ color = red ] of a ] my-agent-list
map
的代理集版本为of
:
[ color ] of my-agent-set
与:
相同map [ a -> [ color ] of a ] my-agent-list
而且,正如您现在所知,ask
相当于foreach
。
掌握这些相似之处是向NetLogo启蒙迈出的重要一步。 (甚至是一般的编程启蒙。)
之前已经讨论过统一(或以某种方式概括)这两种类型集合的语法和基元的想法(例如,here和here),但这种大的语言变化趋于不要经常发生。
使用agentsets(以及' ask')更符合Netlogo的想法。它可能更快或更容易阅读。
正如上面的代码示例很好地说明,代理集确实有更好的语法。这是一件好事,因为无序的独特代理集合通常是您在进行基于代理的建模时所需要的。
但是,它们本身并不快。特别是添加到它们比添加到列表要慢。要使用一个人为的例子,它要快得多: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) ]
您对此事有何经验?
代理集是大多数时间所需要的,但是列表也需要一次。
Jen使用它们来实现内存的例子很好,但还有其他用例。希望你看到它们时能够了解它们。