报告单个ResourcePool单元的利用率

时间:2019-05-28 09:58:49

标签: anylogic resource-utilization

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

2 个答案:

答案 0 :(得分:1)

[此答案旨在更全面地说明为什么为什么 Florian's answer有效/必要,以及该问题(实际上是两个问题)的更广泛上下文及其解决方案。]

这里有两个相互关联的问题:

  1. 创建具有单位利用率且可访问的资源单位代理。
  2. 实际上访问单个资源单元。 ( ResourcePool 没有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)

更新的答案

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

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

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

myResources(x).getUtilization()

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


原始答案:

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

  1. 在ressourcePool中使用抓住发布代码来通知您的自定义资源代理处于活动状态/未活动状态。您可以向代理传递消息或在代理内部调用函数。

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

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