расчет заработной платы водителей в AnyLogic

В Anylogic я пытаюсь рассчитать среднюю зарплату водителя на основе некоторой статистики, которая будет собрана во время выполнения модели. Я понял, как собрать необходимую статистику. Однако я хочу знать, как создать функцию, которая дает результат следующего уравнения в конце моделирования.
Уравнение заработной платы: (коэффициент расстояния) (расстояние) + (коэффициент захвата) (количество посылок) + (коэффициент отсева) * (количество посылок)


person Abdullah Ayoub Abuhilal    schedule 27.06.2019    source источник


Ответы (1)


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

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

Определение агента

Следуя документации, вы, вероятно, создали три статистических элемента для вашей группы драйверов:

Статистика популяции агентов

Расчетная функция

Наконец, к вашему вопросу, простая функция, которая вызывает элементы статистики, чтобы получить значения и объединить их с факторами. Факторы определяются как статические постоянные переменные в Main, а также как функция:

Функция

double averageDistance = drivers.distance();
double averageNumberOfPickups = drivers.numberOfPickups();
double averageNumberOfDropoffs = drivers.numberOfDropoffs();

double salary =  distanceCoefficient * averageDistance 
                + pickupCoefficient * averageNumberOfPickups 
                + dropoffCoefficient * averageNumberOfDropoffs;

return salary;

Вы можете запустить функцию, например, с помощью кода При уничтожении в Main, или выполнить ее по заданному по времени событию и так далее. Вы можете распечатать на консоли с traceln(calculateAverageSalary) или экспортировать в CSV, Excel или показать в своей модели.

person Florian    schedule 28.06.2019
comment
Большое спасибо Флориану за ответ. Однако, если я хочу рассчитать среднюю зарплату для каждого водителя отдельно, следует ли писать в теле функции, например: double averageDistance = drivers (0) .distance () ?? Потому что я пробую это, но получаю сообщение об ошибке (метод не определен для типа Driver) - person Abdullah Ayoub Abuhilal; 28.06.2019
comment
Это было бы неправильно, поэтому ошибка. Если вы хотите раздельно по водителю, вы не используете статистику заполнения (например, drivers.distance ())! Вместо этого вы используете drivers.get (0) .distance. В то время как distance () относится к созданному мною статистическому элементу poulation, в то время как distance - это прямой доступ к переменной отдельного агента. Другой вариант, который у вас есть, - иметь переменные функции и статические константы непосредственно в агентах драйвера и напрямую ссылаться на переменные там, а затем просто вызвать drivers.get (0) .calculateAverageSalary () для каждого драйвера индивидуально. - person Florian; 28.06.2019
comment
drivers.get (0) дает вам тот же элемент, что и драйверы (0), не должно быть разницы - person Florian; 28.06.2019
comment
Ооо, теперь я понял !! вот почему это не сработало, когда я попытался создать эту функцию в основном, используя переменные, определенные в агенте драйвера напрямую (я пробовал это перед тем, как опубликовать свой вопрос), Большое спасибо Флориану !!! - person Abdullah Ayoub Abuhilal; 29.06.2019