Выберите передний элемент из двух глубоких поддонов - PullRequest
0 голосов
/ 04 мая 2018

Я храню два агента в одной стойке с поддоном и блоком rackStore. Когда я вынимаю предметы из стойки с помощью rackStore, он сначала пробует взять агентов сзади, и я получаю сообщение об ошибке ниже, в котором говорится, что его невозможно выбрать, поскольку перед ним есть другие агенты.

Кто-нибудь знает, как я могу выбрать с фронта вместо?

enter image description here

1 Ответ

0 голосов
/ 05 мая 2018

Это большой сбой в программном обеспечении AnyLogic, и его нужно срочно исправить. Поскольку, когда дело доходит до глубоких позиций, вы должны контролировать все вручную.

Я приведу вам пример, который определенно не оптимален в том, как решить ваш конкретный вопрос, и для вас это будет просто шагом к пониманию того, как расширить его до чего-то большего, чем это. Потому что, хотя это должен быть очень простой вопрос, это не так. Это будет работать только с 2 стойками с 2 уровнями глубины, 1 уровнем высоты и уникальным рядом.

Итак, эта структура вам нужна: new structure

Поскольку я понятия не имею, как долго ваши продукты будут храниться в стойке, я предположу кое-что, а именно: с событием я буду принимать решение о том, доставлять продукт из стойки или нет, каждые 5 секунд (это абсолютно произвольно).

Вам понадобится специальный агент для хранения глубокой позиции. Я звоню в ящик агента, и у меня будет набор ящиков. Не на картинке, что я также добавляю агентов в настраиваемые ящики для заполнения. У агента ящика будет 2 переменные: deep и position, в которых будут храниться положение и глубокий уровень агента в стойке (вам также понадобятся level и row, если вы иметь более сложную стойку)

source

Теперь для события, которое запускается циклически каждые 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--;
}

Я знаю, что все это выглядит немного сумасшедшим, но вы должны сами создавать всю логику, когда дело доходит до использования глубоких уровней ...

...