3

在 Anylogic 中,如何获取各个资源池单元的利用率等统计信息?由于 resourcePool.utilization() 函数返回资源池中所有单元的平均利用率。是否可以访问每个资源池单元的数据?有任何想法吗?提前致谢!

4

2 回答 2

3

[这个答案旨在更全面地解释为什么 弗洛里安的答案有效/是必要的,以及问题的更广泛背景(实际上是两个问题)和解决方案。]

这里有两个相互交织的问题:

  1. 创建具有计算和可访问的单位利用率的资源单位代理。
  2. 实际访问单个资源单元。(ResourcePool没有get直接获取其中的代理的功能或类似功能。)

这在 AnyLogic 帮助中并没有完全解释清楚。

创建特殊资源单元代理

每个资源单元的利用率(以及其他功能)可作为特殊资源单元 API(应用程序编程接口;基本上是一组函数)的一部分,在库参考指南 > 流程建模库 > 资源函数帮助页面中讨论。

但是,只有在您创建自己的自定义资源单元代理类型时才能访问;当您创建Resource Pool时,默认情况下其中的单元是 vanillaAgent对象并且具有此特殊资源单元功能。(您可以通过它的功能获得的整体利用率getUtilization。)

对于 Process Modeling 库,您可以通过三种方式创建一个用作资源单元的自定义类型:

  • 新建 --> 代理类型(在“项目”面板中为您的模型右键单击菜单),指定Agent will be used in flowcharts as: Resource Unit;

  • Process Modeling Library 面板中的Resource Type元素。(这有效地显示了与第一种方法相同的向导,但在流程图中的使用不存在并在幕后自动设置。)

  • create a custom type添加资源池时单击(在New resource type设置下),这会将您带到与上述第二个选项相同的向导。

[ Java / 技术说明:发生的情况是您创建了自己的代理类型(AgentJava 术语中的子类),它实现了特殊的 AnyLogic 提供的IResourceUnit接口(定义所有可用的特殊资源单元 API 功能的 Java 事物)。这是相关的以后...]

访问单个资源单元

做这件事有很多种方法:

(1) 在资源池的操作中,您可以通过特殊关键字访问当前资源单元unit。(在编辑这些操作框时将鼠标悬停在灯泡上以获取有关此信息。)但是,这只是将它们作为香草提供Agent(即使它实际上是自定义资源单元,比如说 type MyResourceAgent)。

因此,您必须强制转换(Java 事物)unit才能有效地说“我知道这实际上是一个MyResourceAgent,所以请让我将其视为其中之一”;例如,

((MyResourceAgent) unit).getUtilization()

(2) 如在Library Reference Guides > Process Modeling Library > Resource functions帮助页面中,您可以访问代理通过该代理的内置resourceUnits集合(列表)获取的所有资源单元。

但是,这又将它们包含为代理,因此您必须施放它们;例如,

((MyResourceAgent) agent.resourceUnits.get(0)).getUtilization()

(3) 如果您设置资源池,以便将其代理添加到自定义群体(而不是“隐藏”默认群体),那么您可以随时通过该群体显式访问它们。

按照前面的示例,您创建一个空种群(假设调用myResourceUnits类型为 的代理MyResourceUnit)并将资源池设置为Add units to: Custom population(在其高级属性中),选择您已设置的种群。

然后,您可以通过例如 访问个人myResourceUnits(0).getUtilization()

注意:您必须在此处了解您在做什么,具体取决于您When capacity decreases在资源池中设置的方式。如果您将其设置为,Units are destroyed那么您的人口将随着池容量的变化(例如通过计划)而改变。

Java/技术说明:在上述所有情况下,您也可以强制转换为,IResourceUnit因为这是所有自定义资源代理类型正在实现的接口。但这不会让您访问您添加到自定义资源类型的任何功能,例如它自己的一组参数。)

于 2019-06-05T11:28:46.077 回答
2

更新的答案

有一种更简单的方法可以获取各个资源单元的利用率:

  1. 定义自定义资源代理类型,如此处所述
  2. 将此新的资源池自定义类型设置为新资源单元
  3. 添加此自定义资源类型的空填充(此处命名为myResources
  4. 高级/人口下的资源池中设置这个空人口

现在您可以访问各个资源池单元的利用率,其中x作为单元的索引:

myResources(x).getUtilization()

为了跟踪更复杂的统计数据,您可能仍需要使用原始答案的更复杂的解决方案。


原答案:

您可以自己构建一些东西:

  1. 使用 ressourcePool 中的On captureOn release代码通知您的自定义资源代理它是活动的/不活动的。您可以将消息传递给代理或调用代理内部的函数。

  2. 资源代理可以将其当前状态保存在变量、状态图或类似物中。

  3. 然后,您可以使用“分析”面板中的标准统计模块来聚合信息,例如获取单个代理的利用率。

于 2019-05-28T10:28:59.133 回答