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

Событие, происходящее с заданной интенсивностью

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

Такое событие выполняется периодически с интервалами времени, подчиняющимися экспоненциальному закону распределения с параметром, равным заданной интенсивности. Т.e., если интенсивность равна 5, то событие будет происходить в среднем 5 раз в единицу модельного времени.

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

Демо-модель: Event Generating New Agents Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Чтобы добавить событие, происходящее с заданной интенсивностью

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

Свойства

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

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

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

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

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

Тип события — Тип события:

По таймауту — Событие происходит по истечению таймаута. Событие будет происходить согласно выбранному Режиму.
С заданной интенсивностью — Событие происходит с заданной интенсивностью (которая задается в поле Интенсивность).
При выполнении условия — Событие происходит при выполнении заданного условия (которое задается в поле Условие).

Режим — [Свойство отображается, только если Тип события: По таймауту] Выберите здесь режим события, срабатывающего по таймауту:

"Ручной" — вы будете самостоятельно управлять событием, планируя его происхождение на нужные вам моменты времени. Такое событие будет происходить только при вызове пользователем метода restart() этого события, которому в качестве аргумента передано значение времени, которое должно будет пройти от текущего момента времени до его срабатывания, например: myEvent.restart(15).
Если таймаут будет иметь фиксированное (одно и то же) значение, то можно просто ввести это значение в поле Таймаут и вызывать метод myEvent.restart(), без задания значения таймаута с помощью параметра метода.
Срабатывает один раз — Событие произойдет только один раз, в момент времени, заданный в поле Время срабатывания (абсолютное). Время срабатывания может быть задано как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.
Обратите внимание, что здесь вы задаете абсолютное время, и если это значение будет меньше текущего значения модельного времени, когда вы создадите это событие, то такое событие никогда не произойдет.
Циклический — Событие будет происходить периодически. Вы задаете Время первого срабатывания (абсолютное) и Период. Время первого срабатывания может быть задано как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.
Обратите внимание, что здесь вы оперируете абсолютным временем. Если вы хотите использовать относительные времена (т.e. отсчитывать время первого срабатывания от момента создания события), то используйте функцию time() в поле Время первого срабатывания (абсолютное). Функция time() возвращает текущее значение модельного времени (в данном контексте она будет возвращать время создания события).

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

Время срабатывания (абсолютное) — [Свойство отображается, только если Тип события - По таймауту и выбран Режим Срабатывает один раз] Абсолютное время срабатывания события, заданное как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.

Время первого срабатывания (абсолютное) — [Свойство отображается, только если Тип события: По таймауту и выбран Циклический Режим] Абсолютное время первого срабатывания циклического события, заданное как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.

Период — [Свойство отображается, только если Тип события: По таймауту и выбран Циклический Режим] Период срабатывания циклического события.

Интенсивность — [Свойство отображается, только если Тип события: С заданной интенсивностью] Интенсивность, с которой будет происходить данное событие. С математической точки зрения, событие будет происходить с таймаутом, вычисляемым согласно экспоненциальному закону распределения с параметром, равным заданному в этом поле значению. Т.e., если интенсивность равна 5, то событие будет происходить в среднем 5 раз в единицу модельного времени.

Условие — [Свойство отображается, только если Тип события: При выполнении условия] Условие, при выполнении которого произойдет данное событие.

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

Действие

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

Динамическое изменение интенсивности во время выполнения модели

Значение интенсивности срабатывания события может меняться во время выполнения модели, например, в результате изменения значения параметра, указанного в поле Интенсивность. Если значение интенсивности изменилось (и новое значение отличается от прежнего), то момент срабатывания события планируется заново, т.e. текущее запланированное событие отменяется и планируется другое время срабатывания согласно новому значению интенсивности. Если новое значение интенсивности будет отрицательным или равным нулю, то текущее запланированное событие будет отменено, и планирование событий будет приостановлено до тех пор, пока значение интенсивности не будет изменено на положительное значение, с последующим вызовом функции события restart().

Такие изменения могут быть обнаружены только в том случае, если что-то изменится в агенте, а именно:

  • если в этом агенте происходит какое-то событие, например, срабатывает переход, происходит какое-то другое событие, вызывается Действие при изменении параметра, в порт агента приходит сообщение и т.д.
  • если пользователь явно вызовет метод onChange() агента.
Фактически интенсивность является обновляемым экспоненциальным таймаутом, и поэтому событие, происходящее с интенсивностью, эквивалентно циклическому событию, происходящему по таймауту с периодом 1/интенсивность. Однако есть одно существенное различие: значение таймаута циклического события высчитывается только один раз, при запуске события, и не может быть изменено впоследствии.

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

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

Функция Описание
boolean isActive() Возвращает true, если событие запланировано, или false, если не запланировано.
void reset() Отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем). Циклическое выполнение не возобновится до тех пор, пока не будет вызван метод restart().
void restart() Отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его на другой момент времени согласно текущему значению Интенсивности.
double getRest() Возвращает время, оставшееся до запланированного происхождения события или Double.POSITIVE_INFINITY, если событие в данный момент времени не запланировано.
double getRest(TimeUnits units) Возвращает время, оставшееся до запланированного происхождения события в заданных единицах времени, или Double.POSITIVE_INFINITY, если событие не запланировано.

units — константа единиц измерения времени.
event.getRest(MINUTE) возвращает оставшееся время в минутах.
Как мы можем улучшить эту статью?