等待资源释放

Wait for resource to get free

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

函数 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();称为:

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

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

问题: 这是汇编程序块的正常行为吗?是否有可能避免这种情况并获得正确的空闲()数量?还有其他可能的方法来为我的 "production line" 建模吗?

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

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

create_StartAssembly(0.001);

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

其他地方不需要做同样的事情,只需要在汇编程序的出口处做即可

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

对于此特定示例,您可以进入模拟实验属性并将 "Selection mode for simultaneous events" 设置为 "FIFO (in the order of scheduling)"。正如 Felipe 指出的那样,您需要在第二个源代码和汇编程序之间建立一个队列。完成这两件事后,您的模型将 运行 符合预期。

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

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