java - 等待资源释放

标签 java simulation anylogic

enter image description here

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

  • 每个源 block 注入(inject) 20 种药剂。
  • 等待 block 已达到最大容量。
  • 汇编器使用每个源 1 个,延迟为 1 秒。
  • 队列已达到最大容量
  • QueueSize1 是大小为 1 的队列
  • 延迟15秒
  • 资源池容量为 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(),因为代理无法离开汇编器。当使用函数、等待和队列发生这种情况时,我希望它显示为空闲()。

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

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

最佳答案

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

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

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

screenshot

关于java - 等待资源释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50589713/

相关文章:

java - Anylogic:从图形界面生成的代码抛出类型转换异常

Anylogic道路交通图书馆变道错误

java - 模拟游戏 - 检查代理是否被阻止

r - 模拟每两个变量之间具有不同混合依赖结构的混合数据?

nextInt() 时 JSONParser 上的 Java Android 问题

java - Deque 实现中的 addFirst() 方法

Matlab 与模拟产品(例如 ANSYS 和 COMSOL)

AnyLogic 模型运行配置文件

Java同步以避免ConcurrentModificationExceptions?

java - Java 中的两个 JTree 相等/赋值