【问题标题】:Manually releasing a seized resource from an agent?从代理手动释放占用的资源?
【发布时间】:2020-11-13 06:17:49
【问题描述】:

我有一个相当简单的过程:

batch-seize-delay process

订单代理类型被批处理为批处理代理类型,然后将第三种代理类型作为该批处理的资源。占用时,会向资源代理的状态图发送一条消息,以便采取一些行动。但是,如果在收到消息后满足某个条件,则 Batch 代理需要释放资源代理并占用另一个资源代理才能完成该过程。我在 Resource 代理中编写了代码,当它被拒绝 (rejectionsCollection.add(Batch)) 时,它会将被拒绝的 Batch 代理添加到上面显示的集合中。然后,使用注入调用将批处理代理重新插入到第二个源块中,并且我使用rejectionsCollection.get(0) 编写了“新代理”选项。但是,我还必须在抓住和延迟块中调用remove(),否则会出现流程图错误(同时在两个块中使用相同的代理)。

当我使用seize.remove(batch) 作为条件满足时采取的操作,但问题是资源代理没有被释放。我还设置了获取高级选项“已取消的单位”等于“去发布”,并将“为已取消的单位发布”设置为我的发布块,但这不起作用。第三个代理仍然被占用,最终我用完了资源代理(这不应该发生)。

我也尝试将其复制到 NewBatch 代理 Batch newBatch = batch;,但它仍然给出流程图错误。我也尝试过使用clone(),但我还没有找到正确的语法(我不是最有经验的java程序员)。我收到“无法从对象转换为批处理”的错误消息。不确定它是否相关,但 Batch 代理中也有两个集合。

我的下一个想法是我可以手动释放资源代理,但帮助文件说即使获取的资源可以公开访问,用户也不应该这样做。我还能尝试什么?

对文字墙感到抱歉,但任何想法都值得赞赏!

【问题讨论】:

    标签: anylogic


    【解决方案1】:

    您不会手动释放资源。该设置以代理为中心,因此您必须告诉代理释放资源。这是通过使代理“移动”到释放块来完成的。

    在您的情况下,您可以将延迟时间设为有条件:如果代理满足您的条件,则延迟时间应为 0,否则为正常延迟时间。

    使用这个符号:agent.condition == true ? 0. : normalDelayTime

    您还可以在“Seize”之后使用“Split”元素,并为您的特工完全绕过“延迟”对象。

    许多选项,但请记住以代理为中心:)

    【讨论】:

    • 感谢本杰明的洞察力。最终,我在资源可用性调度块中发现了问题。似乎如果资源代理在其状态图中处于特定状态时“偏离计划”,则它不会被释放。
    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2012-05-04
    • 2012-07-26
    • 1970-01-01
    • 2019-12-11
    • 2013-01-13
    相关资源
    最近更新 更多