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

Динамическое событие

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

Сравнение событий и динамических событий

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

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

События и динамические события

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

Понятия параметра и аргумента часто взаимозаменяемы, и для простоты мы используем для динамического события более общедоступный термин ”параметры”. Если же вы строго придерживаетесь терминологии, принятой в программировании, то можете считать, что под параметрами динамического события мы имеем в виду аргументы.

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

  • Если в вашей модели могут одновременно быть запланированы сразу несколько событий, выполняющих схожие действия.
  • Если действие события зависит от какой-то специфической информации.
Демо-модель: Dynamic Event Models Product Delivery Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Чтобы задать динамическое событие

  1. Перетащите элемент Динамическое событие  из палитры Агент на диаграмму типа агентов.
  2. Как только вы создадите событие, вы можете изменить его имя в небольшом текстовом редакторе, который появится справа от элемента в графическом редакторе. Закончив ввод нового имени, нажмите Enter.
    Поскольку AnyLogic генерирует Java класс для каждого динамического события, которое вы добавляете на диаграмму типа агентов, вы должны следовать правилам именования Java. Имя динамического события должно начинаться с заглавной буквы.
  3. Перейдите на панель Свойства, чтобы задать свойства созданного события.
  4. Если действие события зависит от какой-то специфической информации, то вы можете передать эту информацию событию с помощью параметров события. Параметры задаются в таблице Параметры. Каждый параметр задается в отдельной строке таблицы: вы задаете Имя параметра и его Тип. При планировании нового динамического события, вы сможете передать событию какие-то другие значения его параметров, либо оставить значения, заданные по умолчанию.
  5. Задайте действие события в секции Действие. Здесь вы можете написать Java-код, который будет выполняться при происхождении этого события. Все параметры динамического события будут доступны в этом коде. Возможно, более удобно будет задать это действие с помощью функции и поместить сюда вызов этой функции.

Свойства

Основные свойства

Имя — Имя динамического события. Имя используется для идентификации события и доступа к нему из кода.

Поскольку AnyLogic генерирует Java класс для каждого динамического события, которое вы добавляете на диаграмму типа агентов, вы должны следовать правилам именования Java. Имя динамического события должно начинаться с заглавной буквы.

Отображать имя — Если опция выбрана, то имя динамического события будет отображаться в графическом редакторе.

Исключить — Если опция выбрана, то динамическое событие будет исключено из модели.

Видимость — Если опция выбрана, то динамическое событие будет отображаться на презентации во время выполнения модели.

Вести журнал в базе данных — Если опция выбрана, то информация обо всех происходящих событиях будет добавляться в журнал выполнения модели events_log (если в свойствах базы данных выбрана опция вести журналы).

Параметры

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

Действие

Java-код, выполняемый при происхождении данного события. В коде действия доступны все параметры динамического события (если таковые имеются).

Планирование динамических событий

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

create_<имя динамического события>( timeout, timeUnits, parameter1, parameter2, … )

Пример:

Предположим, что в вашей модели задано динамическое событие ArrivalEvent. Чтобы прибытие произошло через 15 минут от текущего модельного времени, вызовите следующую функцию:

create_ArrivalEvent(15, MINUTE);

В качестве первого аргумента функции мы передаем таймаут события (время, через которое оно сработает), а в качестве второго — единицу измерения времени. В качестве единиц времени указывается одна из соответствующих констант: MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR.

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

create_ArrivalEvent(15);

В этом случае в качестве единиц измерения времени будут выступать единицы модельного времени. Например, если в качестве единиц модельного времени указаны часы, то динамическое событие ArrivalEvent произойдет по истечении 15 часов, начиная с текущего момента.

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

Например, в модели задано динамическое событие DeliveryEvent с двумя параметрами — weight и sender. В этом случае вызов функции, передающей значения экземпляру динамического события, выглядит следующим образом:

create_DeliveryEventEvent( 2, DAY, 12, this );

Доступ к параметрам динамического события можно получить в поле Действие этого события.

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

Обратите внимание, что метод create_…() является единственным разрешенным способом планирования динамических событий. Использование Java конструкторов наподобие newMyDynamicEvent() запрещено.

Программное управление событиями

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

Функция Описание
void reset() Отменяет запланированное событие (вы сможете по-прежнему планировать новые события этого типа, но конкретно это событие «перезапустить» будет уже невозможно).
double getRest() Возвращает время, остающееся до запланированного происхождения данного события.
double getRest(TimeUnits units) Возвращает время, оставшееся до запланированного происхождения события в заданных единицах времени. Если событие не запланировано, то возвращает значение Double.POSITIVE_INFINITY.

units — константа единиц измерения времени.

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

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

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

MyDynamicEvent de = create_MyDynamicEvent(7.5);
dynamicEvents.add(de);
Как мы можем улучшить эту статью?