Функции для сбора статистики по популяции агентов

AnyLogic предлагает ряд функций для сбора статистики по агентам, которые находятся в популяции агентов. Эти функции определены в классе UtilitiesCollection и являются глобальными (доступными из любой части модельного кода). Любую функцию из списка ниже можно вызвать, просто напечатав ее имя без префикса с именем популяции: count( people, p -> p.income > 10000 );

Демо модель: Statistics on Agent Population

Подсчет агентов, удовлетворяющих конкретному условию

int count( популяция, условие ) - Подсчитывает число агентов в заданной популяции, удовлетворяющих заданному условию.

Примеры: count( people, p -> p.income > 10000 );

В этом примере мы ведем подсчет агентов, находящихся в популяции people, доход income которых превышает 10000. В качестве первого аргумента функции мы указываем имя популяции, относительно которой будем выполнять итерацию. В качестве второго аргумента, мы указываем условие, которое будет проверяться для каждого агента. В условии мы сначала указываем локальную переменную (в нашем случае она называется p, но может называться как угодно), которую можем использовать для обращения к агенту, которого в данный момент проверяем. После этого мы вставляем Java оператор ARROW -> (он состоит из двух символов) и определяем условие (содержащее локальную переменную p): p.income>10000. Функция count() выполняет итерацию для каждого агента в популяции people и проверяет доход income каждого агента. Если уровень дохода отдельно взятого агента превышает 10000 (результат вычисления заданного условия condition равен true), мы считаем этого агента.

count( people, p -> p.sex == MALE && p.age >= 18);

В этом примере мы проверяем два условия (используем логический оператор AND &&, чтобы указать AnyLogic, что оба условия должны быть выполнены: и первое, и второе) и считаем только тех агентов, которые удовлетворяют обоим условиям. 

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

Получение среднего значения (атрибуты агентов и т.д.) в популяции

double average( популяция, значение ) - Возвращает среднее значение в популяции агентов.

Пример: average( people, p -> p.income );

Здесь мы вычисляем средний доход агентов income в популяции people.

double averageWhere( популяция, значение, условие ) - Возвращает среднее арифметическое значений в популяции среди агентов, удовлетворяющих заданному условию.

Пример: average( people, p -> p.income, p -> p.age > 18 );

Здесь мы вычисляем средний доход income агентов старше 18 лет. Первый аргумент функции задает популяцию people, второй определяет значение value (мы будет считать среднее значение value для всех агентов популяции people), а третьим аргументом является условие: мы будем вычислять среднее значение только для тех агентов, которые этому условию удовлетворяют. Обратите внимание, мы снова задаем локальную переменную p до того, как описать условие. 

Получение минимального (максимального) значения в рамках популяции

double max( популяция, значение ) - Возвращает максимальное значение в заданной популяции.

double maxWhere( популяция, значение, условие ) - Возвращает максимальное значение в популяции среди агентов, которые удовлетворяют заданному условию.

double min( популяция, значение ) - Возвращает минимальное значение в заданной популяции.

double minWhere( популяция, значение, условие ) - Возвращает минимальное значение в заданной популяции среди агентов, которые удовлетворяют заданному условию.

Примеры: maxWhere( people, p -> p.income );   В этом примере мы получаем максимальный доход income всех агентов.

maxWhere( people, p -> p.income, p -> p.sex == FEMALE );   В этом примере мы получаем максимальный доход income всех агентов женского пола в популяции people.

Вычисление суммы значений aгентов

double sum( популяция, значение ) - Возвращает сумму значений в заданной популяции.

Пример:  sum( people, p -> p.income );   В этом примере мы вычисляем общий доход income всех агентов в популяции people.

double sumWhere( популяция, значение, условие ) - Возвращает сумму значений в заданной популяции среди агентов, которые удовлетворяют заданному условию.

Пример:  sumWhere( people, p -> p.income, p -> p.age > 18 );   В этом примере мы вычисляем общий доход income взрослых (агентов старше 18 лет).