Anylogic скользящее среднее время обработки - PullRequest
0 голосов
/ 19 ноября 2018

в моей модели у меня 9 различных сервисных блоков, и каждый сервис может создавать 9 различных функций. Каждая комбинация имеет различное время задержки и стандартное отклонение. Например, для функции 3 требуется 5 минут в сервисном блоке 8 с отклонением 0,05, но требуется только 3 минуты с отклонением 0,1 в сервисном блоке 4.

Как я могу постоянно отслеживать последние 5 необходимых времен каждой комбинации и вычислять среднее (например, скользящее среднее)? Я хочу использовать среднее значение, чтобы продукты могли решить, какой сервисный блок выбрать для соответствующей функции в соответствии с сокращенным временем, сравнивая прошлые времена всех машин для соответствующей функции. У агентов продукта уже есть параметр для времени входа в сервис и один для вычисления времени обработки путем вычитания времени ввода из времени, выходящего из сервисного блока.

Спасибо за вашу поддержку!

1 Ответ

0 голосов
/ 19 ноября 2018

Я не уверен, что понимаю, о чем вы спрашиваете, но это может быть ответом:

для отслеживания последних 5 необходимых раз вы можете использовать набор данных из палитры анализа, ограничивая количество выборок до 5 ...

dataset

вы обновите набор данных, используя dataset.add(yourTimeVariable);, чтобы вы могли оставить значение вертикальной оси набора данных пустым.

Полагаю, вам потребуется 1 набор данных для каждой функции

Затем вы можете рассчитать скользящее среднее, выполнив:

dataset.getYMean();

Если вам нужно 81 набор данных, вы можете создать коллекцию в виде ArrayList с типом элемента DataSet. А в Главных свойствах в При запуске вы можете добавить следующий код, и он будет иметь тот же эффект.

for(int i=0;i<81;i++){
    collection.add(new DataSet( 5, new DataUpdater_xjal() {
        double _lastUpdateX = Double.NaN;
        @Override
        public void update( DataSet _d ) {
          if ( time() == _lastUpdateX ) { return; }
          _d.add( time(), 0 );
          _lastUpdateX = time();
        }
        @Override
        public double getDataXValue() {
          return time();
        }
      } )
  );
}

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

collection.get(4).getYMean();

и добавить новое значение в набор данных:

collection.get(2).add(yourTimeVariable);
...