【问题标题】:Wait for resource to get free等待资源释放
【发布时间】:2018-11-08 10:12:24
【问题描述】:

让我描述一下上面的情况:

  • 在每个源块注入 20 种药剂。
  • 等待块有最大容量。
  • 汇编器使用每个源中的 1 个,延迟为 1s。
  • 队列有最大容量
  • QueueSize1 是一个大小为 1 的队列
  • 延迟为 15 秒
  • ResourcePool 的容量为 1

函数 startAssembly():

if(queue.size()==0 && wait.size()>=1 && resourcePool.idle()>=1){
  wait.free(wait.get(0));
}
System.out.println("Queue: " + queue.size());
System.out.println("Wait: " + wait.size());
System.out.println("Idle: " + resourcePool.idle());

函数 startAssembly();被称为:

  • onEntry 等待
  • onExit 汇编器
  • 队列退出

我想要发生什么: 通过队列 (FIFO) 连接两个流程的装配线建模。进程 1(汇编程序)比进程 2(延迟)更快。因此 queueSize1 填满,并且在进程 1 完成第二部分后,它不能再工作了。通常工作人员会显示为busy(),因为代理程序不能离开汇编程序。我希望它在发生这种情况时使用函数、等待和队列显示为 idle()。

会发生什么: 一个代理通过汇编程序,之后没有其他代理能够通过等待块。通过收集 resourcePool.idle() 我注意到即使在代理退出组装块之后也没有可用资源。我还在 if 部分尝试了类似assembler.delaySize()==0 的构造,但也有一些奇怪的行为。用 delaySize-part 替换空闲部分有点工作,但它也会将 2 或 3 个代理传递到汇编程序块中。所以“生产线”包含的工件多于应有的数量。

问题: 这是汇编程序块的正常行为吗?是否有可能避免这种情况并获得正确的空闲()量?有没有其他可能的方法来模拟我的“生产线”?

【问题讨论】:

    标签: java simulation anylogic


    【解决方案1】:

    如果您使用 LIFO 作为同时事件的选择模式,此解决方案是有效的,在这种情况下,代理从组装器移动到队列,然后到 queueSize1,然后到延迟(全部为零时间)并且在资源被释放之后......这有点违反直觉,但这是在 LIFO 选择模式下的工作方式。

    所以你要做的是创建一个名为 StartAssembly 的动态事件,并在动态事件中调用函数:startAssembly(); 然后在您的汇编程序退出时,您将调用动态事件以几乎立即运行:

    create_StartAssembly(0.001);
    

    这将确保资源被释放......并且所有条件都得到满足。

    其他地方不需要这样做,只在汇编器的出口处就可以了

    另外,我认为你应该在 source1 和汇编器之间添加一个队列,否则你可能会出错

    【讨论】:

    • 在我第一次尝试时效果很好。如果我不添加队列,我应该考虑什么样的错误?我停用了强制推送,直到现在它运行良好。
    • 组装机队列只接受与组装最终产品所需的零件数量相等的最大零件数。如果您的 source1 生产零件的速度过快,那么组装机将无法接受它。否则你会没事的
    【解决方案2】:

    对于这个特定示例,您可以进入模拟实验属性并将“同时事件的选择模式”设置为“FIFO(按调度顺序)”。正如 Felipe 指出的那样,您需要在第二个源代码和汇编程序之间建立一个队列。完成这两件事后,您的模型将按预期运行。

    资源的发布被放在活动日历上,与其他活动同时进行。当使用 LIFO 的默认值时,最后一个(即进入队列)首先被执行。如果选择先进先出,则资源的释放在日历上是第一个,因此它在其他项目之前发生。

    我相信 AnyLogic 在 AnyLogic 7 中将默认行为从 FIFO 更改为 LIFO。FIFO 似乎是离散事件模拟包中更常见的方法。

    【讨论】:

    • Felipes 解决方案是否被认为更糟?如果我在实际更大的模型中将选择模式更改为 FIFO,我会遇到一些问题,因为它完全是为 LIFO 构建的。例如,我有一个在开始时应该被阻止的保持块,但是当将选择模式设置为 FIFO 时,一个代理会在开始块之前通过保持块。
    • 别担心我的解决方案没问题...只需多花 0.001 秒即可完成下一个零件...如果您要处理 1000 个零件来组装产品,您将有 1 个额外的零件延迟秒......但如果这对你来说太高了,你甚至可以用 0.000000001 替换 0.001
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2021-03-16
    • 2012-01-08
    • 2012-05-04
    • 2019-03-25
    相关资源
    最近更新 更多