AnyLogic
Развернуть
Размер шрифта

Где я, и как мне получить доступ к…?

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

Большая часть кода, который вы пишете при разработке модели, является кодом типа агента, а если быть точнее — кодом одного из методов этого типа. Не имеет значения, задаете ли вы действие события, инициализируете ли параметр вложенного агента или пишете код действия при запуске — считайте, что вы пишете код для текущего типа агента. В таком случае будут действовать следующие правила (см. рисунок выше):

  • Элементы модели, принадлежащие тому же типу агента, доступны просто по именам (потому что они являются полями того же класса). Скажем, вы пишете код в поле свойства Действие события endOfFY типа агента Company. Чтобы получить доступ к вложенному объекту queue, просто напишите queue. Чтобы увеличить значение переменной revenue, напишите revenue = amount. А чтобы перезапустить событие endOfFY из кода его собственного действия — endOfFY.restart( year() ).
  • Чтобы получить доступ к полю вложенного объекта, вы должны поставить точку . после имени вложенного объекта и затем написать имя этого поля. Например, чтобы получить размер очереди — объекта queue, нужно написать queue.size(). Если вложенный объект является реплицированным, то его имя является именем коллекции объектов, и вам нужно указать, какой именно объект из этой коллекции вам нужен. Чтобы вызвать функцию performance() у элемента под номером 247 из коллекции employees, напишите: employees(246).performance().
  • Чтобы получить доступ к контейнеру текущего объекта (того объекта, куда вложен текущий), вызовите метод через класс контейнера объекта. Например, если агент типа Company вложен в агента типа Main, то чтобы получить доступ к агенту Main из агента Company, вы должны написать main. Поэтому, чтобы вызвать функцию announceSale() агента типа Main, вам нужно написать main.announceSale().
  • Чтобы получить доступ к «равному по иерархии» объекту (объекту, который вложен в тот же контейнер, что и текущий объект), нужно вначале перейти на уровень выше к контейнеру, а затем спуститься по иерархии модели вниз, к нужному вложенному объекту. Чтобы получить значение переменной loyalty определенного агента популяции customers из типа агента Company (см. рисунок выше), нужно вначале обратиться к агенту типа Main, а затем — к агенту Customer (с нужным индексом): main.customers(i).loyalty.
  • Эти правила естественным образом расширяют иерархическую структуру модели AnyLogic. Вы можете получить доступ к любому элементу из любого места модели. Однако мы рекомендуем разрабатывать ваши модели по возможности модульным способом, так, чтобы объекты знали минимум внутренней информации о других объектах, а инициализация и взаимодействие производились посредством параметров, портов, обмена сообщениями и вызовов функций с типом доступа public.
Как мы можем улучшить эту статью?