从两层深的托盘货架中挑选前面的物品

Pick front item from a two deep pallet rack

我将两个代理存储在一个带有 rackStore 块的托盘架中。当我使用 rackStore 从货架中取出物品时,它会尝试先拿走后面的代理,但我收到以下错误消息,说它无法被挑选,因为它前面有其他代理。

有人知道我怎样才能从前面挑选吗?

这是 AnyLogic 软件的一个大失败,他们必须紧急修复。因为涉及到深仓,你必须手动控制一切。

我会给你一个例子,这个例子对于如何解决你的特定问题来说绝对不是最佳的,这只是你理解如何将它扩展到比这更多的东西的一个步骤。因为尽管这应该是一个非常简单的问题,但事实并非如此。这将仅适用于 2 层深、1 层高和唯一行的 2 个机架。

所以这是您需要的结构:

由于我不知道你的产品在货架上停留了多长时间,我会假设一些事情,即在活动中,我将每 5 秒决定是否从货架上取下产品 (这绝对是任意的)。

您将需要一个自定义代理来存储深仓。我打电话给代理人 Box,我会有很多盒子。不在图片中我也将代理添加到自定义人口 boxes.The box 代理将有 2 个变量:deep 和 position 将存储代理在机架中的位置和深度(您还需要 level 和 row如果你有一个更复杂的机架)

现在,对于每 5 秒循环运行一次的事件,我有以下操作:(如果有箱子在等待,如果有可用资源并且没有叉车将产品移动到托盘架)我必须这样做,因为在箱子已经在托盘架上之前,我不知道叉车要把箱子放在哪里。然后我用 findFirst 函数检查一个盒子是否在另一个盒子后面,如果一切正常,一个盒子被发送以供选择。

if(wait.size()>0 && resourcePool.idle()>0 && rackStore.size()==0){
    Box bx=findFirst(wait,b->b.deep==0);

    if(bx!=null)
        wait.free(bx);
}

在 rackStore 出口我需要存储位置,所以在 "on exit" 操作中,这段代码会有所帮助(你检查是否有另一个盒子在同一位置,如果有,你更新deep 变量的值。然后你存储新代理的位置和深度的值)

Box box=findFirst(wait,b->b.position==position);
if(box!=null){
    box.deep++;
}
agent.deep=0;
agent.position=position;

最后在 rackPick on exit 操作上,一旦产品被挑选和交付,您更新它后面的盒子的深度值(如果有的话)

Box bx2=findFirst(wait,b->b.position==agent.position);
if(bx2!=null){
    bx2.deep--;
}

我知道这一切看起来有点疯狂,但是在使用深层时,您必须自己创建所有逻辑...