Ассемблер AnyLogic как шлюз

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

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

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

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

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


person Andrea Meneghinello    schedule 03.10.2016    source источник


Ответы (1)


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

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

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

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

Всякий раз, когда агент вводит блок Ожидание, я добавляю его в коллекцию LinkedHashMap или HashMap с целым числом (или типом вашего параметра заказа). ключ и значение агента (по одному для каждого блока ожидания). Это упростило бы доступ к информации (вместо того, чтобы искать по всему содержимому 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));
}

or

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));
}

В зависимости от типа агента в этом блоке Ожидание.

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

person luizfvpereira    schedule 04.10.2016
comment
Спасибо за вашу помощь. Итак, если я правильно понял, я заменяю все очереди перед элементом ассемблера на столько же блоков wait (по одному для каждого необходимого объекта) а затем я буду проверять каждый раз, когда новый агент входит в один из блоков wait, а затем я освобожу все необходимые объекты, когда совпадение будет успешным. P.S. Можете ли вы предложить мне текст или веб-руководство, по которому я могу изучить некоторые основы программных блоков? (Я уже знаю язык Java) - person Andrea Meneghinello; 04.10.2016
comment
Да, я думаю, вы поняли концепцию. Программные блоки? Вы имеете в виду, как использовать блоки Anylogic? Когда я сказал «Блок ожидания», я имел в виду элемент «Ожидание» из библиотеки моделирования процессов! - person luizfvpereira; 04.10.2016
comment
Под "программным блоком" я подразумеваю учебник по программированию в обработчиках событий. - person Andrea Meneghinello; 04.10.2016
comment
К сожалению, я не знаю ни одного учебника, посвященного этому вопросу. Однако помощь от anylogic очень полезна. Кроме того, вы можете создать Anylogic за три дня PDF, который поставляется с Anylogic и к которому вы можете получить доступ через вкладку приветствия. - person luizfvpereira; 04.10.2016
comment
Кто в вашем коде владеет WaitBlockHashMap? Это переменная локального класса? Если да, то как и где я создаю локальные переменные класса? - person Andrea Meneghinello; 04.10.2016
comment
HashMap - это коллекция, принадлежащая агенту среды. Обычно это главный агент. - person luizfvpereira; 04.10.2016
comment
Можно ли использовать hashMap в качестве переменной класса блока ожидания? - person Andrea Meneghinello; 04.10.2016
comment
Я считаю, что нет, поскольку вы не можете редактировать элементы собственной библиотеки Anylogic (по крайней мере, насколько мне известно!) - person luizfvpereira; 04.10.2016
comment
Итак, если моя сеть сложна (много отделов с множеством шлюзов), куда я помещаю HashMap, используемую блочными элементами? - person Andrea Meneghinello; 04.10.2016
comment
Мне нужно создать много HashMap в обработчике событий onStartup главного агента? - person Andrea Meneghinello; 04.10.2016
comment
Вы либо помещаете их в главный агент (где вы разрабатываете свою модель), и вам нужно будет создать по одному для каждого отдела. Однако, если вам нравится Anylogic, вы можете создать агента, который будет вашим отделом. В Anylogic вы можете создавать агентов, которые содержат блок-схемы с элементами PML. Вы также можете добавлять к нему коллекции (как свою хэш-карту). Вы программируете его функциями или тем, что считаете полезным и нужным. Затем вы просто перетаскиваете агент на главную, и в него будет включена коллекция. Однако это будет сложно, если вам не нравится Anylogic. - person luizfvpereira; 04.10.2016
comment
Позже я, вероятно, исправлю сообщение о том, как создавать собственные блоки здесь, в StackOverflow. - person luizfvpereira; 04.10.2016