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

Нестандартный эксперимент

Нестандартный эксперимент запускает эксперимент нестандартного сценария, полностью написанного пользователем.

Нестандартный эксперимент дает пользователю неограниченную гибкость в вопросах задания параметров, управления "прогонами" модели, принятия решений. Он просто предоставляет одно поле, в котором вы можете написать код, выполняющий все вышеперечисленные задачи (а также и многие другие) путем использования программного интерфейса класса исполняющего модуля AnyLogic (такие методы, как run(), stop() и т.д.).

У этого типа эксперимента нет ни предопределенного поведения, ни встроенного графического интерфейса.

Чтобы создать нестандартный эксперимент

  1. В панели Проекты щелкните правой кнопкой мыши по элементу модели и выберите Создать > Эксперимент из контекстного меню. Появится диалоговое окно Новый эксперимент.
  2. Выберите Нестандартный из списка Тип эксперимента.
  3. Введите имя эксперимента в поле Имя.
  4. Выберите тип агента эксперимента из выпадающего списка Агент верхнего уровня.
  5. Если вы хотите применить к создаваемому эксперименту временные установки другого эксперимента, оставьте установленным флажок Копировать установки модельного времени из и выберите эксперимент из расположенного справа выпадающего списка.
  6. Щелкните мышью по кнопке Далее, чтобы перейти к следующей странице Мастера.
  7. Здесь вы можете указать, хотите ли вы загружать агента верхнего уровня этого эксперимента из файла сохраненного состояния модели. Если да, то установите флажок на этой странице и выберите файл состояния модели с помощью кнопки Выбрать.
  8. Завершите создание эксперимента, щелкнув мышью по кнопке Готово.

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

Чтобы узнать, как в рамках нестандартного эксперимента сохранять и загружать полное состояние модели из файла сохраненного состояния, см. здесь.

Примеры

Ниже представлены ссылки на демонстрационные модели, в которых заданы нестандартные эксперименты. Изучите код каждого эксперимента в секции Код, чтобы понять, как реализован его сценарий.

В данной модели представлен простейший нестандартный эксперимент. Код эксперимента создает исполняющий модуль и модель, настраивает и запускает симуляцию и выводит результат выполнения в консоль:

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

В данной модели в коде нестандартного эксперимента реализовано взаимодействие с пользователем через консоль:

Демо-модель: Custom Experiment Interacting with Console Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

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

Демо-модель: Optimization in Custom Experiment Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

В данной модели нестандартный эксперимент используется для калибровки параметров в процессе выполнения симуляции. Запустите симуляцию, и вы увидите кнопку, запускающую нестандартный эксперимент, с помощью которого выполняется калибровка параметров:

Демо-модель: Calibration from Within Simulation Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Свойства

Основные

Имя – Имя эксперимента.

Поскольку AnyLogic генерирует для каждого эксперимента соответствующий Java класс, при задании имени эксперимента нужно руководствоваться правилами названия классов в Java. Начинайте имя эксперимента с заглавной буквы.

Исключить – Если опция выбрана, то эксперимент будет исключен из модели.

Код

Код – Здесь вы пишете код эксперимента. По умолчанию Мастер создания эксперимента сгенерирует код, который:

  1. создаст исполняющий модуль
  2. инициализирует генератор случайных чисел
  3. задаст конечное время моделирования
  4. создаст нового агента верхнего уровня
  5. проинициализирует агента верхнего уровня
  6. подготовит исполняющий модуль
  7. запустит моделирование в быстром режиме
  8. и после всех этих действий уничтожит модель

Вам нужно будет добавить нужные вам строки кода, которые будут, например, собирать и анализировать результаты моделирования.

Свойства приложения

Максимальный размер памяти – Максимальный размер памяти Java, выделенный для данной модели.

Аргументы Java машины – [Параметр приложения] Задайте здесь аргументы Java машины, которые будут применяться при запуске модели. Подробное описание возможных аргументов дано на сайте Java Documentation: https://docs.oracle.com/en/java/javase/11/tools/java.html

Аргументы командной строки – [Параметр приложения] Здесь вы можете задать аргументы командной строки, с помощью которых вы хотите передать модели определенные данные. Значения переданных аргументов доступны во всех кодовых полях с помощью метода String[] getCommandLineArguments(). Единственное ограничение: вы не можете вызывать этот метод, чтобы задавать значение статических переменных.

Java для экспертов

Импорт — Выражения импорта import, необходимые для успешной компиляции кода класса эксперимента. Во время генерации Java кода эти выражения вставляются перед строкой объявления Java класса эксперимента.

Дополнительный код класса — Здесь вы можете объявить какие-то служебные переменные кода, вложенные классы, константы и методы. Этот код будет вставлен в объявление класса эксперимента. Все объявленные здесь члены класса будут доступны из кода эксперимента.

Код Java для нестандартного эксперимента

Нестандартный эксперимент может выполняться из другого эксперимента. Для этого другой эксперимент необходимо передать в качестве аргумента конструктору нестандартного эксперимента. Эксперименты запускаются по вызову функции run().

Пример кода для агента Main, выполняющего нестандартный эксперимент:

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

MyCustomExperiment e = new MyCustomExperiment(getExperiment());

// настройте нестандартные поля, заданные в
// дополнительном коде класса MyCustomExperiment:

e.day = getDayOfWeek();

// запустите эксперимент

e.run();

// соберите данные из нестандартных полей, заданных в
// дополнительном коде класса MyCustomExperiment:

traceln( "result: " e.myResult );

(В приведенном выше примере у нестандартного эксперимента внутри функции run() есть код, который возвращает поле "day", заданное в дополнительном коде класса, использует его в эксперименте и задает значение полученного результата в поле myResult).

Примечания к использованию

Используйте функцию createEngine(), чтобы создать новый экземпляр класса Engine. Используйте функцию Engine.runFast(), чтобы запустить эксперимент с максимально доступной скоростью выполнения.

Не забудьте предварительно задать время или дату остановки исполняющего модуля.

Используйте функцию ExperimentOptimization.createOptimization(Engine), чтобы создать новый экземпляр объекта Optimization.

Простейший пример кода функции run():

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

Engine engine = createEngine();

// Задайте время остановки

engine.setStopTime( 100 );

// Задайте нового агента верхнего уровня:

Main root = new Main(engine, null, null);

// Задайте параметры для агента верхнего уровня здесь

root.myParameter = 10;

// Подготовьте экземпляр Engine к простому эксперименту:

engine.start(root);

// Запустите простой эксперимент в быстром режиме:

engine.runFast();

// Получите результаты простого эксперимента здесь

traceln( root.myResult );

// Уничтожьте модель:

engine.stop();

Вы можете использовать следующие функции для управления нестандартным экспериментом. Нестандартный эксперимент использует API исполняющего модуля AnyLogic.

Создание эксперимента
Функция Описание
Engine createEngine() Создает экземпляр класса Engine.
void run() Использует createEngine().
Обработка ошибок
Функция Описание
void onError(Throwable error) Эту функцию можно переопределить для нестандартной обработки ошибок, произошедших во время выполнения модели (т.е. ошибок в коде событий, динамических событий, переходов, действий на входе / выходе из состояний и т.д.). По умолчанию функция ничего не совершает, так как она не определена. Чтобы переопределить функцию, вы можете добавить функцию в эксперимент, назвать ее onError() и задать для нее один аргумент класса java.lang.Throwable.

error - ошибка, возникшая в ходе выполнения события
void onError(Throwable error, Agent root) Схожа с функцией onError(Throwable error) за одним исключением: использует еще один аргумент, чтобы обратиться к агенту верхнего уровня в модели.

error - ошибка, возникшая в ходе выполнения события
root - агент верхнего уровня в модели. Полезен при работе с экспериментами с множественными прогонами, которые выполняются одновременно. В некоторых случаях значение может быть null (например, если ошибка возникла при создании агента верхнего уровня)
Аргументы командной строки
Функция Описание
String[] getCommandLineArguments() Возвращает массив аргументов командной строки, которые передаются данному эксперименту при запуске модели. Никогда не возвращает null: если аргументов нет, возвращает пустой массив. Эту функцию нельзя вызывать из значений статических переменных: такие переменные инициализируются раньше, чем класс эксперимента. Данная функция предназначена для использования внутри функции run().
Как мы можем улучшить эту статью?