报告单个资源池单元的使用情况

Posted

技术标签:

【中文标题】报告单个资源池单元的使用情况【英文标题】:Reporting Utilization of Individual ResourcePool units 【发布时间】:2019-10-13 19:54:45 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

    创建已计算和可访问的单位利用率的资源单位代理。 实际访问单个资源单元。 (ResourcePool 没有 get 函数或类似函数来直接获取其中的代理。)

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

创建特殊资源单元代理

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

然而,这只有在您创建自己的自定义资源单元代理类型时才能访问;当您创建资源池时,默认情况下其中的单元是普通的Agent 对象,并且具有这种特殊的资源单元功能。 (您可以通过其getUtilization 函数获得pool 的整体利用率。)

对于流程建模库,您可以通过三种方式创建一个充当资源单元的自定义类型:

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

流程建模库面板中的 资源类型 元素。 (这有效地显示了与第一种方法相同的向导,但在流程图中的使用不存在并在幕后自动设置。)

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

李>

[Java / 技术说明:您创建自己的代理类型(Java 术语中 Agent 的子类)实现了特殊的 AnyLogic 提供的 IResourceUnit 接口(Java定义所有可用的特殊资源单元 API 函数的东西)。这在以后有关系...]

访问单个资源单元

有几种方法可以做到这一点:

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

所以你必须cast(Java 的东西)unit 有效地说“我知道这实际上是一个 MyResourceAgent,所以请让我把它看作是其中之一”;例如,

((MyResourceAgent) unit).getUtilization()

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

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

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

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

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

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

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

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

【讨论】:

【参考方案2】:

更新答案

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

    定义自定义资源代理类型,如here 所述 将此新的资源池自定义类型设置为新资源单元 添加此自定义资源类型的空填充(此处命名为 myResources) 在Advanced/Population下的资源池中设置这个空的population

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

myResources(x).getUtilization()

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


原答案:

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

    使用 ressourcePool 中的 On captureOn release 代码通知您的自定义资源代理它处于活动/不活动状态。您可以向代理传递消息或调用代理内部的函数。

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

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

【讨论】:

感谢您的回答!我不明白如何为每个单位单独保存这些信息,或者我如何区分哪些数据与哪个确切单位相关。此外,我不完全了解您的意思(通知您的自定义资源代理)。 我发现确实有一种更简单的方法可以做到这一点,尽管当您需要更多而不是仅使用时,可能会使用我的原始答案。请查看更新后的答案! 非常感谢!非常感谢您的帮助。

以上是关于报告单个资源池单元的使用情况的主要内容,如果未能解决你的问题,请参考以下文章

Anylogic中资源池中资源的维护

线程池

华为机试真题 Java 实现VLAN资源池

线程池的工作原理及使用示例

2022华为机试真题 C++ 实现VLAN资源池

华为OD机试 - VLAN资源池(Java) | 机试题+算法思路+考点+代码解析 2023