Чтобы определить, какому состоянию в данный момент принадлежит управление диаграммой состояний агента, воспользуйтесь функцией 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 в модели, вы найдете следующие вызовы функции:
-
В типе агента Main есть популяция агентов IDUsers. В разделе свойств Статистика задана функция сбора статистики NInfected, подсчитывающая количество инфицированных людей. Здесь используется следующий код:
agent.inState( IDUser.Infected )
Конкретно в этом свойстве, когда вы задаете Условие функции сбора статистики по популяции агентов, вы получаете доступ к каждому агенту популяции как к agent. В качестве аргумента функции вы передаете имя состояния диаграммы состояний этого агента, предварительно указав имя типа этого агента: IDUser.Infected.
-
В поле Действие события 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 )
-
Еще один пример использования функции: динамическое выражение, заданное в поле Цвет заливки фигуры oval в агенте типа IDUser:
inState( Infected ) ? red : dodgerBlue
Здесь красный цвет используется в том случае, если агент в текущий момент находится в состоянии Infected. Обратите внимание, что на этот раз функция вызывается без префикса, поскольку этот код задается для элемента, находящегося в том же типе агента IDUser, что и диаграмма состояний которую мы анализируем. По этой же причине нет префикса и у имени состояния - оно доступно здесь просто как Infected, а не как IDUser.Infected, как мы видели в примерах выше.
-
Как мы можем улучшить эту статью?
-