在Anylogic中,如何获取统计信息,例如各个资源池单元的利用率? 由于resourcePool.utilization()函数返回资源池中所有单元的平均利用率。 是否可以访问每个资源池单元的数据?有任何想法吗? 预先感谢!
答案 0 :(得分:1)
[此答案旨在更全面地说明为什么为什么 Florian's answer有效/必要,以及该问题(实际上是两个问题)的更广泛上下文及其解决方案。]
这里有两个相互关联的问题:
get
函数或类似函数来直接将代理放入其中。)这在AnyLogic帮助中并没有非常清楚地解释。
每个资源单元的利用率(以及其他功能)作为特殊资源单元API(应用程序编程接口;基本上是一组功能)的一部分提供,在库参考指南>流程建模库中进行了讨论>资源功能帮助页面。
但是,仅当您创建自己的自定义资源单元代理类型时才可访问;创建资源池时,默认情况下其中的单位是普通Agent
对象, not 没有这种特殊的资源单位功能。 (您可以通过其getUtilization
函数获得 pool 的整体利用率。)
对于Process Modeling库,您可以创建一种自定义类型,该自定义类型可以通过三种方式充当资源单元:
新建->代理类型(“项目”调板中的模型的右键菜单),指定Agent will be used in flowcharts as: Resource Unit
;
资源类型元素。 (这实际上显示了与第一种方法相同的向导,但是没有在流程图中使用该方法,而是自动在其下设置。)
在添加资源池(在create a custom type
设置下)时,单击New resource type
,将使您进入与上述第二种选择相同的向导。
[ Java /技术说明”:发生的事情是您创建了自己的代理类型(Java术语为Agent
的子类),该类型实现了AnyLogic提供的特殊IResourceUnit
接口(定义所有可用的特殊资源单元API函数的Java事物)。稍后相关...]
有几种方法可以做到这一点:
(1)在资源池的操作中,您可以通过特殊关键字unit
访问当前资源单元。 (编辑这些操作框时,将鼠标悬停在灯泡上以获取有关此信息。) ,这只是将它们提供为原始Agent
(即使它实际上是自定义资源单元,让我们例如MyResourceAgent
类型。
因此,您必须投射(Java内容)unit
,以便有效地说“我知道这实际上是MyResourceAgent
,所以请允许我将其视为其中之一。 “;例如,
((MyResourceAgent) unit).getUtilization()
(2)与库参考指南>流程建模库>资源功能帮助页面中一样,您可以访问代理通过该代理的内置{{ 1}}集合(列表)。
但是,它再次像Agents一样包含它们,因此您必须投射它们;例如,
resourceUnits
(3)如果您设置了资源池,以便将其代理添加到自定义填充中(而不是“隐藏”的默认填充),则可以随时通过该填充显式访问它们。
按照前面的示例,您创建一个空的填充(对于类型为((MyResourceAgent) agent.resourceUnits.get(0)).getUtilization()
的代理来说,称为myResourceUnits
),并将资源池设置为MyResourceUnit
(在其高级属性中),选择您设置的人口。
然后,您可以通过Add units to: Custom population
访问个人。
注意事项:您必须在此处了解自己在做什么,具体取决于您如何在资源池中设置myResourceUnits(0).getUtilization()
设置。如果将其设置为When capacity decreases
,则人口将随着池容量的变化而变化(例如通过时间表)。
( Java /技术说明:在上述所有情况下,您还可以强制转换为Units are destroyed
,因为这是所有自定义资源代理类型都在实现的接口。但这不会使您可以访问添加到自定义资源类型中的任何功能,例如其自己的参数集。)
答案 1 :(得分:0)
有一种更简单的方法来获取各个资源单元的利用率:
现在,您可以使用 x 作为该单元的索引来访问各个资源池单元的利用率:
myResources(x).getUtilization()
为了跟踪更复杂的统计信息,您可能仍然需要使用原始答案的更复杂的解决方案。
您可以自己构建一些东西:
在ressourcePool中使用抓住和发布代码来通知您的自定义资源代理处于活动状态/未活动状态。您可以向代理传递消息或在代理内部调用函数。
资源代理可以将其当前状态保存在变量,状态图或类似变量中。
然后,您可以使用分析面板中的标准统计模块来汇总信息,例如获取单个代理的利用率。