【问题标题】:Release resource when agent can't exit代理无法退出时释放资源
【发布时间】:2018-11-06 09:02:18
【问题描述】:

我正在使用组装块来模拟产品的组装过程。该组装块将组装好的产品推入大小为 1 的队列。有时,当组装块完成其进程时,该队列已满,因此组装等待直到队列空闲。在此期间,资源仍被组装块占用并显示为忙碌。

我想显示资源的空闲时间,因此我希望组装块完成组装,将产品留在原处并释放资源,直到其工作场所再次空闲时才会开始另一个组装。

有没有办法得到这样的行为?

【问题讨论】:

    标签: java simulation anylogic


    【解决方案1】:

    这是使用以下结构的方法,其中您在输入将构成您的产品的每种零件类型之前都有一个等待块......您还有一个辅助队列,位于组装机之后和您的队列之前提到哪个大小为 1...我假设您只有 1 个可用资源,否则我认为拥有大小为 1 的队列是没有意义的,但如果需要,您可以将其扩展为使用更多资源.等待块和辅助队列块具有最大容量:

    现在创建一个名为 startAssembly 的函数,它将执行以下操作:

    if(auxiliaryQueue.size()==0 && wait.size()>=assembler.quantity1 && wait1.size()>=assembler.quantity2 && resourcePool.idle()>0){
        for(int i=0;i<assembler.quantity1;i++)
            wait.free(wait.get(i));
        for(int i=0;i<assembler.quantity2;i++)
            wait1.free(wait1.get(i));
    }
    

    此函数仅在资源空闲、大小为 1 的队列中没有产品且有足够的零件来组装产品时才开始组装过程。

    您将在 3 个不同的地方使用 startAssembly(); 调用此函数

    1. 在汇编程序块的出口处
    2. 在等待块的 on enter 中
    3. 在 wait1 块的 on enter 中

    【讨论】:

    • 谢谢。我收到一个错误“索引 0 超出大小 0 的范围 0”。在 wait1 前面,我添加了您在此处提出的构造:link。在完全出口的传送带中,我有这个代码wait9.free(wait9.get(0));。当我删除这部分时,它可以工作,但它将所有代理直接推送到装配块。我猜wait9.get(0) 有问题。
    • 这样做:if(wait9.size()>0) wait9.free(wait9.get(0));
    • 好吧,一个工作,但现在它组装一个产品,然后停止。等待块中有足够的代理,资源空闲,辅助队列为空。如果我删除函数中对等待块大小的检查,则会返回错误“索引 1 超出大小 1 的范围”。当我此时查看wait1块时,它的数量为1。即使我在前一个等待块上使用freeAll(),代理是否可能一个接一个出现?
    • 这是因为你设计的一切都不正确......而且这个传送带的东西与这里提出的问题不同......我必须给你一个很长的答案来解释到底怎么做...... .
    • 我想你不会向我解释吧?我设计错了什么?
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2017-07-08
    • 2018-01-28
    • 2012-01-08
    • 2012-05-04
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    相关资源
    最近更新 更多