Anylogic:如何批处理具有相似参数的代理?
Posted
技术标签:
【中文标题】Anylogic:如何批处理具有相似参数的代理?【英文标题】:Anylogic: how to Batch agents with similar parameters? 【发布时间】:2021-10-24 22:02:15 【问题描述】:我有一个叫 products 的代理,在这个代理中,我分配了一个叫 sp 的参数;在模拟中,我有相同的代理,其 sp 范围从 1 到 5 不同。我想在同一批次中批处理具有相同 sp 的代理,即 10。所以如果我有 200代理,其中 49 个 sp 等于 1,我想将它们分成 5 个批次(10,10,10,10,9),并且 sp 等于 2另一个批次等等。
非常感谢您提供的任何帮助。
【问题讨论】:
【参考方案1】:有多种方法可以做到这一点,但考虑到批次不一致(即批次为 10,最后一个批次为 9),我首先将所有代理放入其中wait
块(或者您可以使用 queue
)然后以编程方式控制它们
举个小例子
我等到我的 200 个“产品”代理到达等待区,然后按下调用函数 batchReleaseCheck()
的“检查批次”按钮
这里是代码
LinkedHashMap<Integer, List<Product>> productsWaiting = new LinkedHashMap<Integer, List<Product>>();
for (int i = 0; i < wait.size(); i ++)
Product product = wait.get(i);
int sp = product.sp;
if (!productsWaiting.containsKey(sp)) productsWaiting.put(sp, new ArrayList<Product>());
productsWaiting.get(sp).add(product);
//Check the batch size if sufficient we release it
if (productsWaiting.get(sp).size() == batchSize)
for (Product p:productsWaiting.get(sp))
wait.free(p);
return; // we exit the loop since we have released a batch
// If we get to the end of the loop we were not able to release any batch we now release each SP type regardless of their current batch size
for (int i = 1; i < 6; i ++)
if (productsWaiting.get(i) == null) continue;
for (Product p:productsWaiting.get(i))
wait.free(p);
batch.set_batchSize(productsWaiting.get(i).size()); //Since the batch is less than the standard we need to change it to what ever we are releasing
return; // we exit the loop since we have released a batch
您创建一个地图以根据产品的sp
编号将产品存储在列表中。如果在任何时候你发现你有足够的单位来创建一个批次,我们会停止并从等待块中释放它们。
如果我们到了 for 循环的末尾,并且我们没有任何 sp 编号有足够的单位来组成一整批,我们简单地释放我们所拥有的。
在此示例中,您需要每次单击按钮来释放批次,或者您可以将批次检查函数调用添加到批次对象的发布代码中。这一切都将顺序发生,但在同一时间步骤
【讨论】:
你应该可以在等待块上调用命令freeAll()
,它们都会被释放。在释放 batch.set_batchSize(wait.size());
之前,您只需将批处理大小设置为等于等待块中的项目数
您好,Jaco,我还有一个问题。如何根据 sp 批量处理不同的批量大小?例如,如果 sp = 1,则批量大小为 20,如果 sp = 2,则批量大小为 7,依此类推。批量大小是固定的,没有发布,因此省略了最后一个 for 循环。非常感谢,我很感激。
您可以设置一个地图,您可以在其中查找SP编号并获得相应的批量大小LinkedHashMap<Integer, Integer>
开始一个新问题以获得更详细的答案和示例。虽然这是标准 Java ;-)
谢谢,雅科。我在这里link 开始了一个新问题,我在第二个问题中尝试了Felipe 的解决方案,但它对我不起作用。我对Java很陌生;这就是原因之一。如果您能提供帮助,我想请您看看另一个问题。非常感谢。以上是关于Anylogic:如何批处理具有相似参数的代理?的主要内容,如果未能解决你的问题,请参考以下文章
基于两个参数的 AnyLogic 优先级队列作为 Java 代码
Anylogic:如何根据代理的参数在 ResourcePool 中对设置时间(工具更换)进行建模?