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

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

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

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

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


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

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

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

Демо модель: Dynamic Event Models Product Delivery

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

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

Свойства

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

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

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

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

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

Параметры

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

Действие

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

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

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

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

Пример:

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

create_ArrivalEvent(15, MINUTE);

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

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

create_ArrivalEvent(15);

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

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

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

create_DeliveryEvent( 2, DAY, 12, this );

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

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

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

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

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

void reset() - Отменяет запланированное событие (вы сможете по-прежнему планировать новые события этого типа, но конкретно это событие "перезапустить" будет уже невозможно).

double getRest() - Возвращает время, остающееся до запланированного происхождения данного события.

double getRest(TimeUnits units) - Возвращает время, оставшееся до запланированного происхождения события в заданных единицах времени. Если событие не запланировано, то возвращает значение Double.POSITIVE_INFINITY.
Параметр: unitsконстанта единиц измерения времени.

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

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

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

MyDynamicEvent de = create_MyDynamicEvent(7.5);
dynamicEvents.add(de);


См. также

 Событие

 Справочник классов: Класс DynamicEvent