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

Определение текущего состояния агента

Функции диаграммы состояний

Чтобы определить, какому состоянию в данный момент принадлежит управление диаграммой состояний агента, воспользуйтесь функцией getState() или getActiveSimpleState() диаграммы состояний. Обе функции возвращают простое состояние, которое является активным в данный момент.

К примеру, чтобы определить текущее состояние диаграммы состояний statechart, выполнив код при наступлении некоего события (или в действиях любых других элементов, заданных внутри типа агента), вызовите функцию statechart.getState();

Чтобы определить, активно ли в данный момент какое-либо состояние, воспользуйтесь функцией диаграммы состояний isStateActive(). Вызов этой функции возвращает true, если указанное состояние в данный момент активно и false — в противном случае.

Пример: statechart.isStateActive(Busy);

Функции агента

Для этой цели можно также воспользоваться функцией inState() агента.

В коде агента-грузовика truck типа Truck (или в действиях элементов, заданных внутри данного типа агента) используйте вызов функции следующего вида: inState(Moving).

При вызове функции из кода родительского агента (например, из агента Main, которому принадлежит агент truck) предварительно выполните обращение ко вложенному агенту-грузовику:

truck.inState(Truck.Moving);

Пример

Демо-модель: HIV Diffusion and Syringe Usage Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Изучите использование функции inState() на примере приведенной модели. В этой модели у агентов типа IDUser есть две диаграммы состояний. Синтаксис вызова функции отличается в зависимости от того, откуда эта функция вызывается.

Выполнив поиск текста inState в модели, вы найдете следующие вызовы функции:

  1. В типе агента Main есть популяция агентов IDUsers. В разделе свойств Статистика задана функция сбора статистики NInfected, подсчитывающая количество инфицированных людей. Здесь используется следующий код:

    agent.inState( IDUser.Infected )

    Конкретно в этом свойстве, когда вы задаете Условие функции сбора статистики по популяции агентов, вы получаете доступ к каждому агенту популяции как к agent. В качестве аргумента функции вы передаете имя состояния диаграммы состояний этого агента, предварительно указав имя типа этого агента: IDUser.Infected.

  2. В поле Действие события UpdateHistograms вы можете увидеть такой код:

    for( IDUser user : IDUsers ) {
      if( user.inState( IDUser.Susceptible ) )
        SusceptibleH.add( user.Experience );
      else
        InfectedH.add( user.Experience );
    }

    Это событие задано в типе агента Main. Цикл for последовательно проходит по всем агентам популяции IDUsers, каждый последовательно проверяемый агент доступен тут как user. Поэтому здесь функция вызывается с префиксом user: user.inState( IDUser.Susceptible )

  3. Еще один пример использования функции: динамическое выражение, заданное в поле Цвет заливки фигуры oval в агенте типа IDUser:

    inState( Infected ) ? red : dodgerBlue

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

Как мы можем улучшить эту статью?