分批大小

时间:2019-08-12 09:29:31

标签: anylogic

我正在尝试通过使用批处理并移动到来模拟托盘行为。除末尾剩余元素的数量小于批处理大小且这些元素永远不会被拾取外,此方法工作正常。有什么办法解决这种情况吗?

尝试弄乱自定义队列,接送对。

详细说明,批处理对象的队列大小为15。但是,一旦处理完整个集合,剩下的元素数少于15,这些元素不会被后续的moveTo块拾取。队列大小降至15以下时,我需要将代理发送到后续块。

3 个答案:

答案 0 :(得分:0)

您可以动态地将Batch对象的批量大小更改为“结束”(无论您是什么意思:-))。您需要找出何时来更改批处理大小(因为这取决于您的型号)。但是一旦该进行调整了,您可以调用myBatchItem.set_batchSize(1),它将立即将各个内容一起批处理。

但是,更好的模型设计可能是在模型结束之前有一个冷却期,即在批处理对象用完代理之前要停止进行模型测量。

答案 1 :(得分:0)

您需要知道最后一个元素是什么,例如,在您的代理中使用一个名为isLast的布尔变量,该变量对最后一个代理是正确的。

并且在批次中,您必须以编程方式更改批次大小。.也许在批次的on enter操作中是这样的:

if(agent.isLast) 
    self.set_batchSize(self.size());

答案 2 :(得分:0)

要确定是否达到“结束”或任何供应不足,我建议超时。我将时间戳记保存在批处理块的OnExit代码中的变量lastBatchDate中:

lastBatchDate = date();

周期性激活的事件checkForLeftovers将不时检查一次是否有等待分批处理的对象并且是否达到了超时时间(此处为10分钟)。在这种情况下,批处理大小将减小为恰好等待的对象数,以使它们在较小的批处理中继续进行:

if( lastBatchDate!=null //prevent a NullPointerError when date is not yet filled
    && ((date().getTime()-lastBatchDate.getTime())/1000)>600 //more than 600 seconds since last batch
    && batch.size()>0 //something is waiting
    && batch.size()<BATCH_SIZE //not more then a normal batch is waiting
){
    batch.set_batchSize(batch.size()); // set the batch size to exactly the amount waiting
}
else{
    batch.set_batchSize(BATCH_SIZE); // reset the batch size to the default value BATCH_SIZE
}

模型将如下所示:

Batch Model

但是,正如本杰明已经指出的那样,如果这是您真正需要建模的模型,则应该小心。例如,在以下方面要小心:

  • 超时时间是否足够长,以至于在正常操作期间不会意外推入较小的批次?
  • 超时是否足够短以产生效果?
  • 在您的流程中可以有一批较小的下游产品吗?

您可能只想确保上游到达批处理站的对象数量始终充满了全部批处理,或者您可能只是在行“干”之前停止模拟。

您可以查看模型并下载源代码here