2016-10-03 6 views
3

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

Моя диаграмма будет состоять из элементов '' source '' и разных '' ассемблерных элементов '', и мне бы хотелось, чтобы последние (ассемблеры) работали как шлюзы. Я прилагаю простую диаграмму, чтобы лучше иллюстрировать ситуацию (example).

Предположим, что '' sourceA '' и '' sourceB '' (размещенные в разных отделах) генерируют два разных документа, реализованных с двумя настраиваемыми агентами (например, агенты, генерируемые из '' sourceA '', имеют параметр 'orderID' ' и агенты, генерируемые из '' sourceB '', имеют параметр '' qualityCheckID ''), которые передаются в соответствующих очередях до достижения компонента ассемблера (размещаются в другом отделе). Очереди с высокой вероятностью не выровнены во время имитации (очередь [10] = агент.orderID установлен в 10, а очередь [10] = агент.qualityIDCheck установлена ​​в 9) из-за того, что отделы не синхронизированы. Я хотел бы, чтобы ассемблер работал в качестве шлюза, поэтому он ожидает, что агенты, которые имеют «orderID», равны «qualityCheckID» (это означает, что продукты по определенному заказу были проверены отделом качества).

Чтение документации Я видел, что агенты попадают в порт ассемблера, когда он свободен, и ждут в очереди иначе. Из-за асинхронизации может случиться так, что в ассемблерных портах присутствуют агенты, у которых нет идентификатора orderID, равного qualityCheckID, и в этом случае я не хочу, чтобы был произведен выход ассемблера. Может случиться, что нужный агент находится в очереди, а не в порту, поэтому «ассемблеру» приходится искать внутри очередей, чтобы найти, присутствует ли соответствующий агент, и если он удаляет его из очереди (замените неправильный агент в порт, доставляющий этот последний в очереди и выдающий результат)

Кто-то может помочь мне понять, как этот сценарий может быть реализован.

ответ

1

Доброе утро, Андреа.

Есть несколько альтернатив этому. Если оба идентификатора генерируются инкрементально (1, 2, 3, ...., N), вы можете использовать блок соответствия, и он синхронизирует ваш поток. Кроме того, вы можете удалить элементы очереди, поскольку этот блок уже включил очереди.

Однако, если идентификаторы генерируются случайным образом, вам может потребоваться выполнить какую-либо работу и использовать код и функции Java. Что бы я сделал бы следующее:

Вместо использования очереди (который посылает агентов, как только следующий блок доступен) Я хотел бы использовать Wait блок (который в значительной степени Queue, но не упорядочивает элементы и не отправляет агенты, пока вы этого не захотите. Прочитайте описание на AnyLogic, и это будет ясно).

Всякий раз, когда агент ввести Wait Block Я хотел бы добавить его в LinkedHashMap или HashMap коллекции с Integer (или типа вашего параметра порядка) ключ и значение Агент (один для каждого Wait блока) , Это облегчило бы доступ к информации (а не поиск по всему содержимому Wait каждый раз, когда я захотел проверить, существует ли конкретный агент). Следующим шагом будет просто проверить, есть ли на другом блоке ожидания элементы, которые мне нужны для выполнения задачи сборки. Если да, освободите их всех (и текущего агента).

Код выглядит следующим образом:

На Введите:

WaitBlockHashMap.put(agent.orderID, agent) 
if (WaitBlockHashMap2.get(agent.orderID)!=null) { //if the matching element 
                //is on the other Wait Block 
    self.free(agent); 
    WaitBlock2.free(WaitBlockHashMap2.get(agent.orderID)); 
} 

или

WaitBlockHashMap.put(agent.qualityCheckID, agent) 
if (WaitBlockHashMap2.get(agent.qualityCheckID)!=null) { //if the matching element 
                 //is on the other Wait Block 
    self.free(agent); 
    WaitBlock2.free(WaitBlockHashMap2.get(agent.qualityCheckID)); 
} 

В зависимости от типа агента в этой Подождите Block.

Я надеюсь, что это полезно, Луиш

+0

Спасибо за вашу помощь. Итак, если я правильно понял, я заменяю все ** очереди ** перед элементом ** ассемблера **, с таким количеством ** wait ** блоков (по одному для каждого необходимого объекта), а затем я сделаю проверяйте, когда новый агент входит в один из блоков ** wait **, а затем я освобожу весь необходимый объект, когда совпадение будет выполнено. P.S. Можете ли вы предложить мне текст или веб-учебник, на котором я могу узнать некоторые основы в блоках программ? (Я уже знаю язык Java) –

+0

Да, я думаю, вы поняли концепцию. Программные блоки? Вы имеете в виду, как использовать блоки Anylogic? Когда я сказал «Wait Block», я имел в виду элемент Wait из библиотеки моделирования процессов! – luizfvpereira

+0

С «программным блоком» «Я имею в виду некоторый учебник о том, как закодировать в обработчиках событий. –

Смежные вопросы