[此答案旨在更全面地解释why 弗洛里安的回答 https://stackoverflow.com/a/56340186/185055有效/是必要的,以及问题的更广泛背景(实际上是两个问题)及其解决方案。]
这里有两个相互交织的问题:
- 创建计算并可访问每单位利用率的资源单位代理。
- 实际上访问各个资源单元。 (A资源池没有
get
函数或类似的函数来直接获取其中的代理。)
AnyLogic 帮助中对此并没有解释得很清楚。
创建特殊资源单元代理
每个资源单元的利用率(以及其他功能)可作为特殊资源单元 API(应用程序编程接口;基本上是一组函数)的一部分,在库参考指南 > 流程建模库 > 资源函数帮助页面。
However,仅当您创建自己的自定义资源单元代理类型时才可以访问;当你创建一个资源池,默认情况下,其中的单位是普通单位Agent
对象并做not具有这种特殊的资源单元功能。 (您可以得到整体利用率pool通过其getUtilization
功能。)
对于流程建模库,您可以通过三种方式创建充当资源单元的自定义类型:
新建 --> 代理类型(在项目面板中右键单击模型菜单),指定Agent will be used in flowcharts as: Resource Unit
;
The 资源类型流程建模库调色板中的元素。 (这有效地显示了与第一种方法相同的向导,但不存在流程图中的使用,并且在幕后自动设置。)
点击create a custom type
当添加一个资源池(在下面New resource type
设置),这将带您进入与上面第二个选项相同的向导。
[Java / 技术说明:发生的情况是您创建自己的代理类型(Agent
在Java术语中)它实现了特殊的AnyLogic提供的IResourceUnit
接口(一个 Java 事物,定义了所有可用的特殊资源单元 API 函数)。这是稍后相关的...]
访问各个资源单元
做这件事有很多种方法:
(1) 在您的行为中资源池您可以通过特殊关键字访问当前资源单元unit
。 (编辑这些操作框时将鼠标悬停在灯泡上即可获取相关信息。)However,这只是将它们提供为香草Agent
(即使它实际上是一个自定义资源单元,比如说类型MyResourceAgent
).
所以你必须cast(Java 的东西)unit
有效地说“我知道这实际上是MyResourceAgent
所以请让我将其视为其中之一”;例如,
((MyResourceAgent) unit).getUtilization()
(2) 如在库参考指南 > 流程建模库 > 资源函数帮助页面,您可以访问代理通过该代理的内置功能获取的所有资源单元resourceUnits
集合(列表)。
然而,这又包含了他们作为特工,所以你必须铸造他们;例如。,
((MyResourceAgent) agent.resourceUnits.get(0)).getUtilization()
(3) 如果您设置资源池,以便将其代理添加到自定义群体(而不是“隐藏”默认群体)中,则您可以随时通过该群体显式访问它们。
按照前面的示例,您创建一个空群体(假设称为myResourceUnits
对于代理类型MyResourceUnit
)并将资源池设置为Add units to: Custom population
(在其高级属性中),选择您设置的人口。
然后您可以通过以下方式访问个人:myResourceUnits(0).getUtilization()
.
NB:你必须知道你在做什么,这取决于你如何设置When capacity decreases
您的资源池中的设置。如果您将其设置为Units are destroyed
那么你的人口规模将随着池容量的变化而变化(比如通过时间表)。
(Java / 技术说明:在上述所有情况下,您还可以投射到IResourceUnit
因为这是所有自定义资源代理类型正在实现的接口。但这不会让您访问添加到自定义资源类型的任何功能,例如其自己的参数集。)