Это большой сбой в программном обеспечении AnyLogic, и его нужно срочно исправить. Поскольку, когда дело доходит до глубоких позиций, вы должны контролировать все вручную.
Я приведу вам пример, который определенно не оптимален в том, как решить ваш конкретный вопрос, и для вас это будет просто шагом к пониманию того, как расширить его до чего-то большего, чем это. Потому что, хотя это должен быть очень простой вопрос, это не так. Это будет работать только с 2 стойками с 2 уровнями глубины, 1 уровнем высоты и уникальным рядом.
Итак, эта структура вам нужна:
Поскольку я понятия не имею, как долго ваши продукты будут храниться в стойке, я предположу кое-что, а именно: с событием я буду принимать решение о том, доставлять продукт из стойки или нет, каждые 5 секунд (это абсолютно произвольно).
Вам понадобится специальный агент для хранения глубокой позиции. Я звоню в ящик агента, и у меня будет набор ящиков. Не на картинке, что я также добавляю агентов в настраиваемые ящики для заполнения. У агента ящика будет 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 мне нужно сохранить позиции, поэтому в действии «при выходе» этот код поможет (вы проверяете, есть ли еще одна коробка в той же позиции, и, если она есть, вы обновляете значение Глубокая переменная. Затем вы сохраняете значение позиции и глубины нового агента)
Box box=findFirst(wait,b->b.position==position);
if(box!=null){
box.deep++;
}
agent.deep=0;
agent.position=position;
И, наконец, в результате выполнения команды rackPick при выходе, после того, как продукт выбран и доставлен, вы обновляете глубинное значение находящегося за ним ящика (если есть)
Box bx2=findFirst(wait,b->b.position==agent.position);
if(bx2!=null){
bx2.deep--;
}
Я знаю, что все это выглядит немного сумасшедшим, но вы должны сами создавать всю логику, когда дело доходит до использования глубоких уровней ...