Anylogic-----------集合Collection
Collection
智能体可以包含变量。变量通常用于存储模型模拟的结果,对一些随着时间变化的数据或对象特征进行建模。
Variable是任务标量类型或Java类得简单变量。
集合表示一组对象,称其为元素。一些集合允许重复元素,而另一些则不允许。有些是有序的,有些是无序的。集合用于定义将多个元素分组为单个单元的数据对象。集合用于存储、检索和操作聚合数据。通常,他们表示形成一个自然组的数据项,例如队列(再本例中,元素表示在队列中等待的人员),或autopark(元素是卡车),或电话目录(集合执行名称到电话号码的映射)。
与其他Anylogic变量一样,在整个模型模拟过程中,可以从代码访问集合,因此可以通过集合API简单地访问和修改它们的内容。
案例
•在基于智能体的模型中,集合可用于存储一组智能体或者变量——例如,给定智能体的邻居或同事。
•在离散事件模型中,您可以使用集合来控制在队列或服务对象中持有的智能体,方法是在对象进入动作时将智能体添加到集合中,在退出时将智能体从那里移除。
集合的使用方法:
1.将集合元素从智能体选项板拖到智能体类型或实验的图形关系图上。
2.设置集合属性。
3.在“名称”编辑框中键入集合的名称。名称用于标识和访问代码中的变量。
4. 指定集合的类。您可以从“集合类”组合框中选择最常用的一个类,也可以指定任何其他您希望的集合类。
5.如果集合是列表或集合(集合类是ArrayList、LinkedList、LinkedHashSet或TreeSet),请在这里指定集合元素的类。您可以从Elements类组合框中选择一个最常用的类,或者指定任何其他Java类。选择Object可以让集合存储任何Java类的元素。
6. 可以初始化集合,其中包含在其初始内容部分中指定的元素集。要添加元素,单击按钮从下拉列表中选择元素,或者首先单击该按钮,然后在图形编辑器中选择元素。只能选择与集合的elements类对应的元素。
如果在初始内容部分没有选择任何元素,则集合将初始化为空。您可以在以后使用集合API动态地修改集合的内容。
7.如果集合是映射(集合类是TreeMap或LinkedHashMap),则在Key elements类字段中指定该映射维护的键的类型,并在Value elements类属性中指定映射值的类型。
Properties属性
General
名称——集合的名称。名称用于标识和访问代码中的集合。
显示名称——如果被选中,则集合的名称将显示在表示关系图上。
忽略—如果选择,则该集合将从模型中排除。
可见——如果选中,则集合在运行时在表示上可见。
集合类——集合的类,请参阅下面的详细信息。您可以从提供的一组最常用的集合类型(ArrayList、LinkedList、LinkedHashSet、TreeSet、TreeMap、LinkedHashMap)中进行选择,或者在这里指定一些其他的集合类。
元素类-[如果选择ArrayList, LinkedList, LinkedHashSet或TreeSet作为集合类,则可见]集合元素的类。选择一个最常用的类,或者指定您希望的任何其他Java类。在这里指定类时,将集合限制为只包含指定类的元素。选择Object时,可以让collection存储任何Java类的元素。
Key elements类-[如果选择TreeMap或LinkedHashMap作为集合类,则可见]该映射维护的键的类型。
值元素类-[如果选择TreeMap或LinkedHashMap作为集合类,则可见]映射值的类型。
初始内容-[如果选择ArrayList、LinkedList、LinkedHashSet或TreeSet作为集合类,则可见]该控件允许您显式地选择要包含在集合中的元素。您可以从列表中选择元素,也可以在图形编辑器中单击它们。请注意,只能选择与集合的elements类对应的类型的元素。
Advanced
Access—集合的访问类型。有四种访问类型:
公共-收藏可以从任何地方访问。
隐私 -只能从这个代理类访问集合。
保护——可以从这个代理类及其子类访问集合。
默认值——可以在此模型中的任何位置访问集合。
保存在快照中——如果选中,集合将保存在模型快照中。
关键字--如果选中该集合,则该集合是静态的,也就是说,它对于模型中这个类的所有实例(例如种群中的所有代理)具有相同的值。
如果您计划在不同的处理器内核上并行地运行复杂实验的迭代(优化、参数变化等),则不要使用静态集合(这是由实验的允许并行计算高级选项设置的)。
当您保存/恢复运行模型的状态时,静态集合不会保存到snaphot文件中。如果不更改模型中静态集合的内容,则恢复模型的状态将与将其保存到快照中的状态完全相同。但是,如果你以某种方式改变了静态集合的内容(例如在代理的On startup代码中),修改的内容将不会保存到快照中,模型的恢复状态将与之前保存的状态不同。
集合类型
有多种集合实现。它们的不同之处在于数据项的存储方式以及检索和操作它们的方式。
AnyLogic支持Java集合框架中定义的所有集合实现。下面的集合实现是最常用的,因此在集合类字段中作为选项提供:
List接口的可调整大小的数组实现。实现所有可选的列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些函数来操作用于在内部存储List的数组的大小。(这个类大致相当于Vector,只是它没有同步。)
size、isEmpty、get、set、iterator和listIterator操作在常量时间内运行。添加操作在平摊常数时间内运行,即添加n个元素需要O(n)时间。所有其他操作都在线性时间内运行(粗略地说)。与LinkedList的实现相比,常数因子较低。
每个ArrayList实例都有一个容量。容量是用于存储列表中的元素的数组的大小。它总是至少和列表大小一样大。随着元素被添加到ArrayList中,它的容量会自动增长。除了增加一个元素的平摊时间成本是常数之外,增长策略的细节没有指定。
在使用ensureCapacity操作添加大量元素之前,应用程序可以增加ArrayList实例的容量。这可能会减少增量重新分配的数量。
注意,这个实现没有同步。如果多个线程并发地访问一个ArrayList实例,并且至少有一个线程修改了这个列表的结构,那么它必须在外部同步。(结构修改是添加或删除一个或多个元素,或显式调整后备数组大小的任何操作;仅仅设置元素的值并不是结构上的修改。)
双链表实现的list和Deque接口。实现所有可选的列表操作,并允许所有元素(包括null)。对双链表执行的所有操作都与预期的一样。索引到列表中的操作将从列表的开始或结束(以更接近指定索引的为准)遍历该列表。
注意,这个实现没有同步。如果多个线程并发地访问链表,并且至少有一个线程修改了链表的结构,则必须在外部同步链表。(结构修改是添加或删除一个或多个元素的任何操作;仅仅设置元素的值并不是结构上的修改。)
hash表和链表的集合实现接口,具有可预测的迭代顺序。这个实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链列表。这个链表定义了迭代顺序,即元素插入到集合中的顺序(插入顺序)。注意,如果一个元素被重新插入到集合中,插入顺序不会受到影响(如果s.add(e)被调用,而s.contains(e)将在调用之前立即返回true,那么元素e将重新插入到集合s中)。
这个实现使客户端免受HashSet提供的未指定的、通常混乱的排序,而不会增加与TreeSet相关的成本。
这个类提供了所有可选的集合操作,并允许空元素。与HashSet一样,它为基本操作(添加、包含和删除)提供恒定时间的性能,假设哈希函数将元素正确地分散到存储段中。性能可能略低于HashSet,这是因为维护链表的开销增加了,但有一个例外:对LinkedHashSet进行迭代所需要的时间与集合的大小成正比,而与它的容量无关。在HashSet上的迭代可能更昂贵,需要的时间与其容量成比例。
链接哈希集有两个影响其性能的参数:初始容量和装载因子。它们的定义与HashSet一样精确。但是请注意,为初始容量选择过高值对该类的影响要小于对HashSet的影响,因为该类的迭代时间不受容量的影响。
注意,这个实现没有同步。如果多个线程并发地访问链接的散列集,并且至少有一个线程修改了该集,则必须在外部同步该散列集。
一个基于树图的导航集实现。元素按照它们的自然顺序排列,或者根据使用的构造函数,通过在设置创建时提供的比较器排列。
这个实现为基本操作(添加、删除和包含)提供了有保证的日志(n)时间开销。
注意,这个实现没有同步。如果多个线程并发地访问树集,并且至少有一个线程修改了该集,则必须在外部同步该集。
基于红黑树的NavigableMap实现。映射根据其键的自然顺序进行排序,或者通过在映射创建时提供的比较器进行排序,具体取决于使用的构造函数。
这个实现为containsKey、get、put和remove操作提供了保证的日志(n)时间开销。算法是对Cormen, Leiserson和Rivest的《算法导论》中的算法的改编。
请注意,与任何排序映射一样,树映射维护的顺序,以及无论是否提供显式比较器,如果这个排序映射要正确实现map接口,则必须与equals保持一致。(参见Comparable或Comparator对相等一致的精确定义。)这是因为映射接口是根据equals操作定义的,但是排序映射使用它的compareTo(或compare)方法执行所有键比较,所以从排序映射的角度来看,这个方法认为相等的两个键是相等的。一个排序映射的行为是定义良好的,即使它的排序是不一致的equals;它只是没有遵守地图界面的一般约定。
Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现维护一个贯穿其所有条目的双链表。这个链表定义了迭代顺序,它可以是键插入到映射中的顺序(插入顺序),也可以是最近访问它的条目的顺序(从最近访问到最近访问)。
注意,这个实现没有同步。如果多个线程并发地访问一个链接的哈希映射,并且至少有一个线程修改了映射的结构,那么它必须在外部同步。结构修改是添加或删除一个或多个映射的操作,或者在访问顺序链接哈希映射的情况下影响迭代顺序的操作。在访问顺序链接哈希映射中,仅仅使用get查询映射就是一种结构上的修改。在插入顺序链接哈希映射中,仅仅改变与映射中已经包含的键相关联的值不是结构修改。