Как я могу работать с разными материалами на одной блок-схеме в Anylogic? - PullRequest
4 голосов
/ 26 июня 2019

Для моей блок-схемы я генерирую три разных агента из разных источников. Теперь я хочу обрабатывать их по-разному в различных блоках в блок-схеме. Например, я хочу иметь другое время задержки для агентов. Поскольку я новичок в AnyLogic и не очень хорош в Java, у меня проблемы с пониманием того, как обращаться с агентами в моей модели.

Я дал агентам строковый параметр с именем и попытался использовать функцию с оператором if-else для дифференциации агентов по задержке. Мой подход обобщен на следующем изображении (надеюсь, я все сделал правильно):

Код в функции:

if (agent.TypeComponent == "blade" || agent.TypeComponent == "narcelle")
return uniform(3.5, 6);
else return uniform(1, 3);

Я получаю сообщение об ошибке (перевод с немецкого):

Агент не может быть преобразован в переменную.

метод delayPrepFeeder () в типе Main не применим для аргументов (Агент)

Спасибо и всего наилучшего.

1 Ответ

1 голос
/ 26 июня 2019

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


Определение типа агента потоковой диаграммы

Для каждого блока потоковой диаграммы определен тип агента, которого ожидает этот блок:

Flowchart Agent type definition

Вы все еще можете отправлять Агентов через потоковую диаграмму, которые не соответствуют этому определенному типу Агента, но вы не сможете получить доступ ни к одной из его переменных, параметров и функций!Если вы все еще пытаетесь получить доступ к полю типа, который не является определенным типом, вы получите эту ошибку: MyField cannot be resolved or is not a field.Зачем?Потому что когда вы обращаетесь к текущему агенту через agent., тогда тип Java, с которым вы работаете, будет определенного типа агента, или, другими словами, ваш агент был приведен к определенному типу, независимо от его реальноготипа было раньше.

Тип агента источника

Убедитесь, что в ваших Источниках есть Новый агент и Тип агента , установленный для вашего конкретного типа агента:

Source Agent Type Definition

Параметр Новый агент определяет фактический тип создаваемого текущего объекта. Тип агента доступен во всех блоках потоковой диаграммы, он определяет, к какому типу вы можете обращаться с текущим объектом (или в языке Java: к какому типу он приводится при доступе к agent).

Входной параметр функции

В вашей функции delayPrepFeeder() проверьте, что вы определили входной параметр и определили его как правильный тип.Сделайте это так (конечно, используйте ваше собственное имя типа):

Function Input Definition

Код должен использовать имя, которое вы только что определили для вводапараметр (здесь: myAgent).Внутри этой функции вы не можете получить доступ к Агенту напрямую, используя agent, это работает только непосредственно в блоке потоковой диаграммы.Поэтому мы определили входной параметр myAgent и вызвали функцию со ссылкой на agent.Опять же, модуль потока процесса передаст вам вызов agent ссылки на объект типа, определенного в этом блоке блок-схемы, который должен соответствовать как типу, определенному в источнике, так и типу, с которым вы работаете во входных параметрах ифункция.

if (myAgent.TypeComponent.equalsIgnoreCase("blade") || myAgent.TypeComponent.equalsIgnoreCase("narcelle")){
    return uniform(3.5, 6);
}
else {
    return uniform(1, 3);
}

Действительно ли мне нужно несколько разных типов агентов в одной потоковой диаграмме?

Вы, вероятно, нет.

Если ваши типы отличаются только атрибутами, используйте поля (переменные и параметры), чтобы различать их.Например, всегда используйте тип агента Component, а затем дифференцируйте его с параметром type.Этот параметр type может быть строкой (например, «Rotorblade») или, что еще лучше, записью из AnyLogic Option List , где вы заранее определили все возможные типы.

Толькослучай, когда вам действительно нужны разные типы, - это когда у вас есть совершенно разные (сложные) диаграммы состояний, диаграммы действий, визуализация или другие настраиваемые элементы AnyLogic внутри типов ваших агентов.

Что если мне действительно нужно несколько типов агентов в одной потоковой диаграмме?

Вы можете сделать это с помощью наследования.Создайте «базового» агента (который пока является просто обычным агентом), например Component .Этот базовый агент будет тем, который вы указали в качестве типа, проходящего через все блоки потоковой диаграммы.Внутри этого базового агента вы добавляете все переменные, параметры, функции и т. Д., Которые являются общими для всех ваших типов, и , к которым вы хотите получить доступ, в потоковой диаграмме .

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

Inherit Agent

Теперь вы увидите, что вещи, определенные в вашем базовом агенте, также появятся (серый) у ваших унаследованных агентов:

Base Agent and Inherited Agent

Еще одна вещь: вы можете получить доступ к полям и функциям унаследованных агентов, приведя его к базовому типу к его правильному типу с помощью: (MyInheritedAgent)agent. Однако вы должны быть заранее уверены, что этот объект действительно относится к этому типу, в противном случае вы получите ошибку приведения.

Заключение

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

  • Источники: новый агент
  • Источники: Тип агента
  • Блок-схема: тип агента
  • Функции, работающие с текущей agent: входной параметр

Если одного недостаточно, используйте наследование агента.


В качестве дополнительного примечания, пожалуйста, используйте equals() или equalsIgnoreCase() вместо == для сравнения строк, причины объяснения здесь .

...