Если вам нужно изучить поведение модели при каких-то заданных условиях или улучшить производительность модели, найдя значения параметров, при которых достигается наилучший результат работы модели, то вы можете воспользоваться возможностью оптимизации модели AnyLogic. Оптимизация модели AnyLogic заключается в последовательном выполнении нескольких прогонов модели с различными значениями параметров и нахождении оптимальных для данной задачи значений параметров.
Оптимизационный эксперимент предоставляет возможность выбора между двумя оптимизаторами:
- Генетический оптимизатор основан на эволюционном алгоритме. Его цель — сохранить разнообразие возможных решений и избежать выбора субоптимальных решений. Этот оптимизатор генерирует не одно решение на каждом шаге, а популяцию решений. Лучшие из них сохраняются для следующего шага. Процесс воспроизводится до тех пор, пока не будет найдено наилучшее из возможных решений.
- OptQuest — это решение от компании OptTek Systems, Inc., представляющее собой алгоритм-«черный ящик» для глобальной оптимизации общего назначения.
AnyLogic обеспечивает графический интерфейс для настройки и управления оптимизацией для обоих оптимизаторов, а также поддерживает экспорт моделей с оптимизационными экспериментами в виде независимых Java-приложений.
Оптимизация состоит из нескольких последовательных прогонов модели с различными значениями параметров.
- Оптимизатор выбирает допустимые значения оптимизационных параметров и запускает модель с этими значениями.
- Завершив «прогон» модели, оптимизатор вычисляет значение целевой функции на момент завершения.
- Оптимизатор анализирует полученное значение, изменяет значения оптимизационных параметров в соответствии с алгоритмом оптимизации и процесс повторяется заново.
Вы можете управлять оптимизационным экспериментом с помощью набора соответствующих функций.
Чтобы оптимизировать модель
- В панели Проекты щелкните правой кнопкой мыши по элементу модели и выберите Создать > Эксперимент из контекстного меню. Появится диалоговое окно Новый эксперимент.
- Выберите Оптимизация из списка Тип эксперимента.
- Введите имя эксперимента в поле Имя.
- Выберите тип агента для этого эксперимента из выпадающего списка Агент верхнего уровня.
- Если вы хотите применить к создаваемому эксперименту временные установки другого эксперимента, оставьте установленным флажок Копировать установки модельного времени из и выберите эксперимент из расположенного справа выпадающего списка.
- Щелкните по кнопке Готово.
- Выберите оптимизатор.
- Задайте оптимизационные параметры (параметры, значения которых будут меняться).
- Создайте интерфейс оптимизационного эксперимента.
- Задайте целевой функционал (функцию, которую нужно минимизировать или максимизировать).
- Задайте ограничения, которые будут наложены на значения параметров и переменных (опционально).
- Задайте условия остановки прогона.
- Задайте условия остановки оптимизации.
- Запустите оптимизационный эксперимент.
- Основные
-
Имя — Имя эксперимента.
Поскольку AnyLogic генерирует для каждого эксперимента соответствующий Java класс, при задании имени эксперимента нужно руководствоваться правилами названия классов в Java. Начинайте имя эксперимента с заглавной буквы.Исключить — Если опция выбрана, то эксперимент будет исключен из модели.
Агент верхнего уровня — Здесь задается агент верхнего уровня этого эксперимента. Агент этого типа будет играть роль корня иерархического дерева агентов модели, запускаемой этим экспериментом.
Оптимизатор — Оптимизатор, который будет использоваться этим экспериментом: OptQuest или Генетический.
Целевая функция — Целевая функция, значение которой вы хотите оптимизировать (минимизировать или максимизировать). Агент верхнего уровня доступен здесь как root.
Количество итераций — Если опция выбрана, то эксперимент будет остановлен, если будет выполнено максимальное количество итераций, заданное в расположенном справа поле.
Бесконечное количество итераций не поддерживается Генетическим оптимизатором.Автоматическая остановка — Если опция выбрана, то эксперимент будет остановлен, если значение целевой функции перестанет существенно улучшаться (эта опция называется автоостановом оптимизации).
При использовании Генетического оптимизатора, опция Автоматическая остановка становится невидимой: из-за особенностей реализации оптимизатора она включена всегда.Максимальный размер памяти — Максимальный размер памяти Java, выделенный для данной модели.
Создать интерфейс — Кнопка создает для эксперимента пользовательский интерфейс по умолчанию согласно текущим настройкам эксперимента.
Эту кнопку следует нажимать только после того, как вы закончите настройку эксперимента, задав его целевую функцию и параметры оптимизации в секции свойств Параметры. При этом, если интерфейс ранее уже был создан, то он будет удален, и вместо него будет создан новый, интерфейс по умолчанию для текущих настроек эксперимента. - Параметры
-
Параметры — Здесь пользователь задает набор параметров, которые будут варьироваться оптимизатором (оптимизационные параметры). В таблице перечислены все параметры агента верхнего уровня. Чтобы разрешить варьирование параметра оптимизатором, перейдите на соответствующую строку таблицы Параметры, щелкните мышью в ячейке Тип и выберите тип параметра, отличный от значения фиксированный.
Список возможных значений будет меняться в зависимости от типа параметра: дискретный для целочисленных параметров типа int; непрерывный и дискретный для вещественных параметров типа double и т.д. Задайте диапазон допустимых значений параметра. Введите нижнюю границу диапазона в ячейке Мин и верхнюю — в ячейке Макс. Для дискретных параметров нужно также указать в ячейке Шаг величину шага (инкремента), с помощью которого будут определяться допустимые значения данного параметра (первое допустимое значение равно заданной нижней границе интервала, следующее равно сумме первого значения и заданного шага и т.д.). - Модельное время
-
Остановить — Здесь вам нужно задать время остановки прогона модели. Если вы хотите, чтобы моделирование продолжалось бесконечно, до тех пор, пока вы сами его не остановите, выберите из выпадающего списка Нет. Если же вы хотите, чтобы моделирование длилось до заданного времени или заданной даты, выберите здесь соответственно В заданное время или В заданную дату. В этом случае время остановки будет задаваться элементом управления Начальное время/Начальная дата.
Начальное время — Начальное время моделируемого интервала времени.
Начальная дата — Начальная календарная дата моделируемого интервала времени.
Конечное время — [Доступно если Остановить: В заданное время] Конечное время моделируемого интервала времени (количество единиц модельного времени, по прошествии которого модель будет остановлена).
Конечная дата — [Доступно если Остановить: В заданную дату] Конечная календарная дата моделируемого интервала времени.
Дополнительные условия остановки оптимизации — Здесь вы можете задать любое количество дополнительных условий остановки оптимизации. Когда выполнится любое из этих условий, оптимизация будет остановлена. Условие может включать в себя проверку значений переменных, средних значений наборов данных и т.д. Агент верхнего уровня эксперимента доступен здесь как root, поэтому если вы хотите, например, остановить оптимизацию, когда значение переменной plainVar агента верхнего уровня эксперимента превзойдет некоторое пороговое значение (скажем, 11), напишите здесь root.plainVar > 11.
Чтобы сделать условие активным, установите флажок в соответствующей строке таблицы. - Ограничения
-
Здесь пользователь может задать ограничения — дополнительные ограничения, накладываемые на параметры и найденные решения оптимизатором.
Ограничения, накладываемые на параметры (проверяются перед запуском) — В этой таблице вы можете задать ограничения — дополнительные ограничения, накладываемые на значения оптимизационных параметров. Оптимизатор будет использовать только допустимые значения параметров, удовлетворяющие заданным ограничениям — тем самым, вы сузите пространство поиска и оптимизация будет производиться быстрее.
Ограничение представляет собой арифметическое выражение, задающее более узкий диапазон допустимых значений параметров. Оно всегда представляет собой ограничение, задающее верхнюю или нижнюю границу диапазона значений параметра, например: parameter1 >= 10. Ограничения рассчитываются перед запуском модели и инициализацией агента верхнего уровня, поэтому они не могут обращаться к содержимому этого агента.
Чтобы отключить ограничение, сбросьте флажок в ячейке Вкл. соответствующей строки таблицы.
- Требования
-
Требования (проверяются после "прогона" для определения того, допустимо ли найденное решение) — В этой таблице вы можете задать требования — дополнительные ограничения, накладываемые на получаемые оптимизатором решения. Если на момент окончания прогона модели заданные требования будут выполняться, то полученный оптимизатором набор значений параметров будет признан допустимым, и результат оптимизации будет запомнен оптимизатором. Если ограничения удовлетворены не будут, то найденные значения параметров и решение будут считаться недопустимыми.
Выражение требования может содержать любые арифметические операции над данными модели. В выражении также можно вызывать созданные вами функции, а также предопределенные функции (sin(), cos(), sqrt() и т.д.). Тип агента верхнего уровня эксперимента доступен здесь как root.
Чтобы отключить требование, сбросьте флажок в ячейке Вкл. соответствующей строки таблицы.
- Случайность
-
Генератор случайных чисел — В стохастических моделях важную роль играет заданное вами начальное число генератора случайных чисел — от этого будет зависеть, будут ли «прогоны» стохастической модели уникальными или воспроизводимыми. Здесь вы можете выбрать, хотите ли вы задать случайное число, чтобы «прогоны» были уникальными, фиксированное число, чтобы они были воспроизводимыми, или вообще задать свой собственный генератор случайных чисел вместо используемого AnyLogic по умолчанию.
Случайное начальное число (уникальные "прогоны") — Если опция выбрана, то «прогоны» модели будут уникальными и не смогут быть воспроизведены в силу того, что при каждом новом запуске модели генератор случайных чисел будет инициализироваться другим числом.
Фиксированное начальное число (воспроизводимые "прогоны") — Если опция выбрана, то генератор случайных чисел модели будет всегда инициализироваться одним и тем же начальным числом (оно задается в поле Начальное число), поэтому все запуски модели будут идентичными и воспроизводимыми.
Нестандартный генератор (подкласс класса Random) — Если по каким-либо причинам вас не устраивает качество стандартного генератора Random, то вы можете использовать вместо него ваш собственный ГСЧ. Для этого создайте его (это должен быть подкласс Java класса Random, например, MyRandom), выберите данную опцию и введите выражение, возвращающее экземпляр класса вашего ГСЧ, в расположенном справа поле, например: new MyRandom() или new MyRandom(1234). Подробнее см. здесь. - Репликации
-
Использовать репликации — Если опция выбрана, то оптимизатор будет выполнять несколько репликаций за один "прогон". Это нужно тогда, когда в вашей модели есть стохастика. В этом случае результаты «прогонов» будут уникальными, и значения оптимизируемой функции, полученные для «прогонов», произведенных при одних и тех же значениях оптимизационных параметров, скорее всего, будут отличаться. В этом случае мы не можем производить всего лишь один «прогон», принимать его результат в качестве результата для данной итерации и продолжать оптимизацию дальше, проверяя другие значения параметров. Чтобы получить репрезентативные данные, которым можно доверять, нам нужно провести несколько "прогонов" (называемых в данном контексте репликациями) для одного набора значений параметров и принять в качестве значений целевой функции среднее значение результатов всех репликаций.
Фиксированное количество репликаций — Если опция выбрана, то в рамках одной итерации будет производиться фиксированное количество репликаций.
Кол-во репликаций за итерацию — [Доступно, если выбрана опция Фиксированное количество репликаций] количество репликаций, которое будет производиться в рамках одной итерации.
Переменное кол-во репликаций (останов после выполнения минимального кол-ва репликаций, при достижении доверительного интервала) — Если опция выбрана, то в рамках одной итерации будет производиться переменное количество репликаций.
Для оптимизации с переменным количеством репликаций в одной итерации задаются минимальное и максимальное количество репликаций. За одну итерацию оптимизатор OptQuest всегда выполняет заданное минимальное количество репликаций. Необходимость выполнения дополнительных репликаций определяется оптимизатором. Прекращение выполнения дополнительных репликаций произойдет в одном из следующих случаев:
- Доверительный интервал для всех репликаций в рамках текущей итерации достаточно мал, чтобы попасть в интервал, заданный степенью доверия (то есть, искомое значение целевой функции для данной итерации несущественно отличается от среднего значения всех репликаций, что свидетельствует о том, что выборка репрезентативна, и найденному к данному моменту значению можно доверять).
- Значение целевой функции в текущей репликации существенно отстоит от текущего лучшего значения и очевидно, что при выбранных в текущей итерации значения оптимизационных параметров оптимальное решение найдено быть не может.
- Было выполнено заданное максимальное количество репликаций.
Переменное кол-во репликаций не поддерживается Генетическим оптимизатором.Минимальное кол-во репликаций — [Доступно, если выбрана опция Переменное кол-во репликаций (останов после выполнения минимального кол-ва репликаций, при достижении доверительного интервала)] — Минимальное количество репликаций, которые будет производить оптимизатор OptQuest за одну итерацию.
Максимальное кол-во репликаций — [Доступно, если выбрана опция Переменное кол-во репликаций (останов после выполнения минимального кол-ва репликаций, при достижении доверительного интервала)] — Максимальное количество репликаций, которые будет производить оптимизатор OptQuest за одну итерацию.
Доверительная вероятность — [Доступно, если выбрана опция Переменное кол-во репликаций (останов после выполнения минимального кол-ва репликаций, при достижении доверительного интервала)] — Значение доверительной вероятности для получаемых значений целевой функции. Доверительная вероятность показывает, с какой вероятностью случайный ответ попадет в доверительный интервал. Для простоты можно понимать её как точность выборки. Как правило, используется 95%, но в тех случаях, когда высокая точность не нужна, вероятностью можно пожертвовать и понизить её уровень до 90% и даже до 85%. И наоборот, чем большую выборку может себе позволить исследователь, тем выше можно установить точность полученных данных. Доверительный интервал можно понимать как погрешность, задает размах части кривой распределения по обе стороны от выбранной точки, куда могут попадать ответы.
Относительный уровень ошибки — [Доступно, если выбрана опция Переменное кол-во репликаций (останов после выполнения минимального кол-ва репликаций, при достижении доверительного интервала)] — Значение от 0 до 1, определяющее размер доверительного интервала, который нас будет устраивать в качестве условия прекращения выполнения дополнительных репликаций для текущей итерации. Интервал считается как (текущее среднее значение - текущее среднее значение * относительный уровень ошибки, текущее среднее значение + текущее среднее значение * относительный уровень ошибки). - Окно
-
Свойства, расположенные на странице Окно, отвечают за внешний вид и настройки окна модели, которое отображается при запуске эксперимента. Обратите внимание, что размеры окна модели задаются с помощью объекта Рамка и являются общими для всех типов агентов и экспериментов вашей модели.
Заголовок — Заголовок, который будет показан в окне презентации.
Разрешить изменение масштаба и перетаскивание — Если опция выбрана, то пользователь сможет изменять масштаб содержимого окна презентации во время моделирования и перемещать холст окна презентации с помощью мыши (перемещая мышь с нажатой правой кнопкой).
Панель разработчика — Если опция выбрана, панель разработчика будет доступна в окне модели.
Показать панель разработчика при старте модели — [Параметр доступен, если выбрана опция Панель разработчика] Если опция выбрана, панель разработчика будет по умолчанию отображаться в окне модели при каждом запуске эксперимента.
- Действия Java
-
Код инициализации эксперимента — Код инициализации эксперимента, который выполняется, когда эксперимент и его интерфейс уже созданы.
Действие перед запуском каждого эксперимента — Код, который выполняется перед запуском каждого эксперимента.
Действие перед "прогоном" модели — Код, выполняемый перед каждым «прогоном» модели. Этот код запускается при инициализации модели. К этому моменту агент верхнего уровня модели уже создан, но модель еще не запущена. Здесь вы можете выполнять действия с элементами агента верхнего уровня, например, присвоить другие значения его параметрам.
Действие после "прогона" модели — Код, выполняемый после каждого «прогона» модели. Этот код выполняется, когда исполняющий модуль завершает выполнение модели (вызывается функция остановки Engine.finished()).
Действие после итерации — Код, выполняемый после каждой итерации.
Действие по окончании эксперимента — Код, выполняемый после завершения эксперимента.
- Java для экспертов
-
Импорт — Выражения импорта import, необходимые для успешной компиляции кода класса эксперимента. Во время генерации Java кода эти выражения вставляются перед строкой объявления Java класса эксперимента.
Дополнительный код класса — Здесь вы можете объявить какие-то служебные переменные кода, вложенные классы, константы и методы. Этот код будет вставлен в объявление класса эксперимента. Все объявленные здесь члены класса будут доступны из кода эксперимента.
Аргументы Java машины — [Параметр приложения] Задайте здесь аргументы Java машины, которые будут применяться при запуске модели. Подробное описание возможных аргументов дано на сайте Oracle: https://docs.oracle.com/en/java/javase/11/tools/java.html.
Аргументы командной строки — [Параметр приложения] Здесь вы можете задать аргументы командной строки, с помощью которых вы хотите передать модели определенные данные. Значения переданных аргументов доступны во всех кодовых полях с помощью метода String[] getCommandLineArguments(). Единственное ограничение: вы не можете вызывать этот метод, чтобы задавать значение статических переменных.
- Специфические
-
Разрешить параллельное выполнение итераций — Если опция выбрана, то при наличии у процессора пользовательского компьютера нескольких ядер, сразу несколько итераций эксперимента будет параллельно выполняться на разных ядрах процессора. Это приведет к многократному увеличению производительности и завершению эксперимента за значительно меньшее время. Возможность отключения параллельного выполнения предоставляется потому, что в редких случаях такое выполнение может нарушить стратегию оптимизатора, что в итоге может потребовать проведения большего числа итераций для нахождения оптимального решения.
Если параллельное выполнение итераций разрешено, не используйте в модели статические переменные, коллекции, табличные функции и эмпирические распределения. Проверьте, что у таких элементов опция Статическая в секции свойств Специфические отключена.Загрузить агента верхнего уровня из файла сохраненного состояния — Если опция выбрана, то агент верхнего уровня эксперимента будет загружаться из файла сохраненного состояния модели, указанного в расположенном справа поле. Эксперимент будет запущен с того момента модельного времени, когда было сохранено состояние модели.
Целью оптимизации является нахождение таких значений параметров, при которых функция, выбранная в качестве целевой, примет максимальное или минимальное значение. Целевой функцией может быть математическое выражение, описывающее связь оптимизационных параметров, или результат какой-либо операции (например, прогона модели), входными параметрами которой являются параметры оптимизации. Цель оптимизации задается целевой функцией и условием оптимизации. Условие оптимизации определяет, является ли целью оптимизации минимизация или максимизация значения целевой функции.
Чтобы задать целевую функцию
- В панели Проекты щелкните мышью по оптимизационному эксперименту.
- В панели Свойства введите выражение целевой функции в поле Целевая функция. В качестве целевой функции можно задать любое выражение Java, в том числе и арифметическое выражение или вызов метода. Поскольку это выражение будет рассматриваться в контексте агента верхнего уровня оптимизационного эксперимента, то вы можете ссылаться в нем на переменные и параметры этого агента (агент верхнего уровня доступен как root). Если вы хотите задать функцию сложного вида, то лучше создать ее в агенте верхнего уровня явно с помощью функции и поместить вызов этой функции в поле Целевая функция, например: root.totalCost().
- Задайте условие оптимизации. Выберите, хотите ли вы минимизировать или максимизировать заданную целевую функцию.
Оптимизатор производит вычисление целевой функции в конце каждого прогона, после чего анализирует результат (в случае использования Генетического оптимизатора анализируется сразу набор результатов), модифицирует параметры оптимизации в соответствии с алгоритмом и начинает новый прогон.
Таким образом, оптимизация — это итеративный процесс, при котором:
- Оптимизатор рассчитывает возможные решения для параметров.
- С учетом полученных решений рассчитываются целевая функция и соответствие ограничениям.
- Результат анализируется оптимизатором, после чего генерируется новый набор решений.
Оптимизационный параметр (называемый также переменной решения) — это параметр модели, значение которого необходимо оптимизировать. Например, в модели госпиталя оптимизационным параметром может быть количество медсестер, необходимое для проведения утреннего осмотра больных.
Оптимизация модели AnyLogic заключается в последовательном выполнении нескольких прогонов модели с различными значениями оптимизационных параметров и нахождении тех значений параметров, при которых достигается оптимальное значение заданной целевой функции.
Оптимизационным параметром может быть только параметр агента верхнего уровня эксперимента. Если вам нужно оптимизировать параметры вложенных агентов, то вам будет нужно воспользоваться механизмом связывания параметров. Из этого вытекает и другое требование — чтобы проводить оптимизационные эксперименты, агент верхнего уровня этого эксперимента должен содержать хотя бы один параметр.
Вы можете задать неограниченное количество оптимизационных параметров для одного эксперимента.
Размерность оптимизационной области зависит от количества оптимизационных параметров. Каждый новый параметр расширяет область поиска, замедляя процесс оптимизации. Если оптимизируются значения N параметров, то их диапазоны образуют N-размерную область поиска. Очевидно, что эта область должна быть достаточно велика, чтобы вы могли быть уверены в том, что искомая точка оптимума лежит именно в ней. В то же время, чем больше будет область поиска, тем больше будет требоваться времени на нахождение оптимального решения. Поэтому большое значение будут иметь предлагаемые вами значения параметров, с которых начнется процесс поиска оптимального решения.
В процессе оптимизации оптимизационный параметр принимает значения из заданного интервала допустимых значений по правилам, принятым для данного типа параметра. AnyLogic поддерживает три типа оптимизационных параметров:
- Булев параметр (boolean) может принимать значение true или false.
- Непрерывный параметр может принимать любое значение из заданного интервала. Заданная точность параметров определяет минимальное значение, на которое может изменяться значение непрерывного параметра.
- Дискретный параметр тоже является численным параметром, но он принимает значения только из заданного набора допустимых значений. Эти значения считаются следующим образом — первое допустимое значение равно заданной нижней границе интервала, следующее равно сумме первого значения и заданного шага и т.д. до достижения верхней границы интервала.
Иногда интервал и шаг, которые нужно задать для оптимизационного параметра, вытекают из самой постановки задачи оптимизации; но обычно их приходится выбирать самому. Если вы зададите для параметра шаг, то при оптимизации будут рассматриваться значения параметра только в определенных дискретных точках, так что вы сможете найти оптимальные значения параметров только с точностью до заданного вами шага. Поэтому если вы не уверены в том, какой шаг вам следует задать для параметра, то используйте не дискретный, а непрерывный параметр.
Оптимизационные параметры задаются в таблице Параметры в соответствующей секции свойств оптимизационного эксперимента. Каждый параметр задается в отдельной строке таблицы.
Чтобы сделать параметр эксперимента оптимизационным
- Выберите оптимизационный эксперимент в панели Проекты.
- В секции Параметры панели Свойства перейдите к той строке таблицы Параметры, которая содержит параметр, который вы хотите сделать оптимизационным.
-
Щелкните мышью в ячейке Тип и выберите тип оптимизационного параметра, отличный от значения фиксированный. Список возможных значений будет меняться в зависимости от типа параметра.
Если вы оставите значение фиксированный, то параметр не станет оптимизационным, и решатель оптимизатора будет использовать значение параметра по умолчанию для всех итераций.
- Для параметра типа boolean, выберите опцию boolean.
-
Для параметра типа int, выберите дискретный. Параметр может принимать только определенные целочисленные значения из заданного интервала (задается параметром Шаг).
Пример: Мин: 0, Макс: 4, Шаг: 2. Возможные значения: 0, 2, 4. -
Для параметра типа double, или параметра, у которого заданы единицы измерения (например, Время или Скорость), выберите одну из следующих опций:
- непрерывный — Самая востребованная опция. Параметр может принимать любые значения из заданного интервала.
-
дискретный — Параметр может принимать только определенные значения из заданного интервала (задается шагом параметра).
Пример: Мин: 0, Макс: 1, Шаг: 0.5. Возможные значения: 0, 0.5, 1.
- Задайте диапазон допустимых значений параметра. Введите нижнюю границу диапазона в ячейке Мин и верхнюю — в ячейке Макс.
- Для дискретных параметров нужно также указать в ячейке Шаг величину шага (инкремента), с помощью которого будут определяться допустимые значения данного параметра (первое допустимое значение равно заданной нижней границе интервала, следующее равно сумме первого значения и заданного шага и т.д.).
-
При использовании оптимизатора OptQuest вы можете также задать Начальное значение параметра в соответствующем поле. По умолчанию в нем устанавливается значение параметра по умолчанию, но вы можете указать любое другое.
Начальное значение не поддерживается Генетическим оптимизатором.
Вы можете использовать следующие функции для управления экспериментом оптимизации и сбора данных о состоянии его выполнения, на основании которых вы сможете построить собственный интерфейс пользователя для эксперимента.
- Управление выполнением
-
Функция Описание void run() Начинает выполнение эксперимента из его текущего состояния. Если модель еще не существует, функция перезапускает эксперимент, создает и запускает модель. void pause() Приостанавливает выполнение эксперимента. void step() Выполняет один шаг эксперимента. Если модель еще не существует, функция перезапускает эксперимент, создает и запускает модель. void stop() Прекращает выполнение эксперимента. void close() Функция мгновенно возвращает управление и выполняет следующие действия в параллельном потоке:
Останавливает эксперимент, если он не остановлен
Уничтожает модель
Закрывает окно эксперимента (только если модель запущена в режиме отдельного приложения)Experiment.State getState() Возвращает текущее состояние эксперимента:
IDLE
PAUSED
RUNNING
FINISHED
ERROR
PLEASE_WAITdouble getRunTimeSeconds() Возвращает длительность выполнения эксперимента в секундах (за вычетом времени, когда эксперимент был приостановлен). int getRunCount() Возвращает номер текущего запуска, т.е. сколько раз модель была уничтожена. double getProgress() Возвращает степень выполнения эксперимента: число от 0 до 1, соответствующее завершенной на данный момент части эксперимента (доля выполненных итераций от их общего числа). Если степень выполнения невозможно вычислить, то возвращает -1. int getParallelEvaluatorsCount() Возвращает количество параллельных вычислителей, используемых в данной модели. На многоядерных / мультипроцессорных системах, которые позволяют осуществить параллельный запуск, это число может превышать 1. - Целевая функция
-
Функция Описание double getCurrentObjectiveValue() Возвращает значение целевой функции для текущего решения. double getBestObjectiveValue() Возвращает значение целевой функции для наилучшего из найденных на данный момент решений. Обратите внимание на то, что решение может быть невыполнимым. Чтобы проверить, выполняется ли решение, вызовите функцию isBestSolutionFeasible(). double getSelectedNthBestObjectiveValue() Возвращает целевое значение для энного наилучшего решения, определенного с помощью вызова функции selectNthBestSolution(int). Эта функция не поддерживается Генетическим оптимизатором. - Решение
-
Функция Описание boolean isBestSolutionFeasible() Возвращает true, если наилучшее решение удовлетворяет всем ограничениям и требованиям; в противном случае возвращает false. boolean isCurrentSolutionBest() Возвращает true, если решение на данный момент является наилучшим; в противном случае возвращает false. boolean isCurrentSolutionFeasible() Возвращает true, если текущее решение удовлетворяет всем ограничениям и требованиям; в противном случае возвращает false. boolean isSelectedNthBestSolutionFeasible() Возвращает true, если N-ое наилучшее решение удовлетворяет всем ограничениям и требованиям; в противном случае возвращает false. Эта функция не поддерживается Генетическим оптимизатором.void selectNthBestSolution(int bestSolutionIndex) Эта функция находит N-ое лучшее решение и задает данные для последующих вызовов функции, которые возвращают конкретную информацию (например, для функций getSelectedNthBestObjectiveValue() и getSelectedNthBestParamValue(IVariable)).
bestSolutionIndex — индекс наилучших решений (если передать в качестве аргумента 1, функция вернет наилучшее решение, если 2 — второе наиболее подходящее и т.д.)Эта функция не поддерживается Генетическим оптимизатором. - Параметры оптимизации
-
Функция Описание double getCurrentParamValue(IVariable optimizationParameterVariable) Возвращает значение переменной заданного параметра оптимизации для текущего решения. double getBestParamValue(IVariable optimizationParameterVariable) Возвращает значение переменной данного параметра оптимизации для наилучшего из найденных решений. Решение может быть невыполнимым. Чтобы проверить, выполняется ли решение, вызовите функцию isBestSolutionFeasible().double getSelectedNthBestParamValue(IVariable optimizationParameterVariable) Возвращает значение переменной для N-го наилучшего решения, определенного с помощью вызова функции selectNthBestSolution(int). Эта функция не поддерживается Генетическим оптимизатором. - Итерации
-
Возвращает итерацию, которая привела к наилучшему из найденных на данный момент решений.
Обратите внимание на то, что решение может быть невыполнимым. Чтобы проверить, выполняется ли решение, вызовите функцию isBestSolutionFeasible().
Функция Описание int getCurrentIteration() Возвращает текущее значение счетчика итераций. int getBestIteration() Возвращает итерацию, в ходе которой было получено наилучшее решение. Обратите внимание на то, что решение может быть невыполнимым. Чтобы проверить, выполняется ли решение, вызовите функцию isBestSolutionFeasible(). int getMaximumIterations() Возвращает общее количество итераций. int getNumberOfCompletedIterations() Возвращает количество выполненных итераций. int getSelectedNthBestIteration() Возвращает номер итерации для N-го наилучшего решения, определенного с помощью вызова функции selectNthBestSolution(int). Эта функция не поддерживается Генетическим оптимизатором. - Репликации
-
Прежде чем вызывать функции эксперимента оптимизации, вам необходимо убедиться, что репликации используются. Это можно сделать, вызвав функцию isUseReplications()
Функция Описание boolean isUseReplications() Возвращает true, если эксперимент использует репликации; в противном случае возвращает false. int getCurrentReplication() Возвращает количество репликаций, выполненных на данный момент для решения, которое проходит проверку. int getBestReplicationsNumber() Возвращает количество репликаций, выполненных для того, чтобы получить наилучшее решение. Обратите внимание на то, что решение может быть невыполнимым. Чтобы проверить, выполняется ли решение, вызовите функцию isBestSolutionFeasible(). int getSelectedNthBestReplicationsNumber() Возвращает количество репликаций для N-го наилучшего решения, определенного с помощью вызова функции selectNthBestSolution(int). Эта функция не поддерживается Генетическим оптимизатором. - Доступ к модели
-
Функция Описание Engine getEngine() Возвращает исполняющий модуль AnyLogic. Чтобы получить доступ к агенту верхнего уровня (как правило, Main), вызовите функцию getEngine().getRoot(); IExperimentHost getExperimentHost() Возвращает хост эксперимента модели или пустой объект, лишенный функциональности, если хост не существует. - Восстановление сохраненного состояния модели
-
Функция Описание void setLoadRootFromSnapshot(String snapshotFileName) По вызову этой функции простой эксперимент загружает агента верхнего уровня из файла состояния модели AnyLogic. Данная функция доступна только в AnyLogic Professional.
snapshotFileName — имя файла состояния модели AnyLogic, например: "C:\My Model.als"boolean isLoadRootFromSnapshot() Возвращает true, если эксперимент настроен так, чтобы запускать модель из состояния, загружаемого из файла состояния модели; в противном случае возвращает false. String getSnapshotFileName() Возвращает имя файла состояния модели, из которого, в соответствии с настройками эксперимента, запускается модель. - Обработка ошибок
-
Функция Описание RuntimeException error(Throwable cause, String errorText) Сообщает об ошибке во время выполнения модели: выдает исключение RuntimeException с соответствующим текстом errorText, предварив его полным именем агента. Эта функция никогда ничего не возвращает, лишь выдает исключение. Тип возвращаемого объекта задается в тех случаях, когда вы хотите использовать следующий способ вызова: throw error("my message");
cause — причина (сохраняется для более подробного сообщения), может быть null
errorText — текст с описанием ошибки для отображенияRuntimeException errorInModel(Throwable cause, String errorText) Сообщает об ошибке во время выполнения модели: выдает исключение ModelException с заданным текстом ошибки, предварив его полным именем агента. Эта функция никогда ничего не возвращает, лишь выдает исключение. Тип возвращаемого объекта задается в тех случаях, когда вы хотите использовать следующий способ вызова: throw errorInModel("my message");
Данная функция отличается от функции error() тем, как отображается сообщение об ошибке: ошибки в логике модели не так "серьезны" по сравнению с другими ошибками. Они случаются довольно часто и сообщают разработчику о необходимости изменить некоторые параметры модели. Примером могут послужить такие сообщения: "агент не смог покинуть блок диаграммы процесса, поскольку следующий блок занят" или "недостаточная вместимость стеллажа".
cause — причина (сохраняется для более подробного сообщения), может быть null
errorText — текст с описанием ошибки для отображенияvoid onError(Throwable error) Эту функцию можно переопределить для нестандартной обработки ошибок, произошедших во время выполнения модели (т.е. ошибок в коде событий, динамических событий, переходов, действий на входе / выходе из состояний и т.д.). По умолчанию функция ничего не совершает, так как она не определена. Чтобы переопределить функцию, вы можете добавить функцию в эксперимент, назвать ее onError и задать для нее один аргумент класса java.lang.Throwable.
error — ошибка, возникшая в ходе выполнения событияvoid onError(Throwable error, Agent root) Схожа с функцией onError(Throwable error) за одним исключением: предоставляет еще один аргумент для доступа к агенту верхнего уровня модели. Функция особенно полезна при работе с экспериментами с множественными прогонами, которые выполняются одновременно.
error — ошибка, возникшая в ходе выполнения события
root — агент верхнего уровня модели. В некоторых случаях значение может быть равно null (например, если ошибка возникла при создании агента верхнего уровня) - Аргументы командной строки
-
Функция Описание String[] getCommandLineArguments() Возвращает массив аргументов командной строки, которые передаются данному эксперименту при запуске модели. Никогда не возвращает null: если аргументов нет, возвращает пустой массив. Эту функцию нельзя вызывать из значений статических переменных: такие переменные инициализируются раньше, чем класс эксперимента.
AnyLogic позволяет задавать дополнительные условия оптимизации, накладывая ограничения на значения оптимизационных параметров и на получаемые оптимизатором решения — ограничения и требования соответственно.
Ограничение — это строгое условие для параметров оптимизации, которое проверяется каждый раз при генерации нового набора значений оптимизатором. Ограничение используется в тех случаях, когда значение переменной решения должно быть задано точнее простого диапазона в настройках оптимизационного параметра.
Каждое ограничение — это корректно сформированное арифметическое выражение, задающее отношение между параметрами оптимизации.
parameterA + parameterB + 2 * parameterC = 10
parameterC - parameterA*parameterB >= 300
- Линейное ограничение задает линейное отношение между параметрами. Оптимизатор может проверить значение на соответствие линейному ограничению без запуска модели;
- Нелинейное ограничение относится к тем случаям, когда для задания отношения используется нелинейное выражение или внутри выражения содержится результат эксперимента (то есть значение, контролируемое пользователем). В случае с нелинейными ограничениями для проверки необходим запуск модели.
Чтобы задать ограничение
- Выберите оптимизационный эксперимент, щелкнув по нему мышью в панели Проекты.
- Перейдите в секцию Ограничения панели Свойства.
- Щелкните по кнопке справа от таблицы Ограничения, накладываемые на параметры (проверяются перед запуском).
- Введите выражение ограничения в поле таблицы Выражение.
Требование является дополнительным ограничением, накладываемым на решения, которые будет находить оптимизатор. Если на момент окончания прогона модели заданные требования будут выполняться, то полученный оптимизатором набор значений параметров будет признан допустимым, и результат оптимизации будет запомнен оптимизатором. Если ограничения удовлетворены не будут, то найденные значения параметров и решение будут считаться недопустимыми.
Выражение требования может содержать любые арифметические операции над данными модели. В выражении также можно вызывать созданные вами функции, а также предопределенные функции (sin(), cos(), sqrt() и т.д.). Агент верхнего уровня эксперимента доступен здесь как root:
0 <= 2 * root.variable - root.statistics.max() <= 500
sqrt(variableC) >= 49
Чтобы задать требование
- Выберите оптимизационный эксперимент в панели Проекты.
- Перейдите в секцию Требования панели Свойства.
- Щелкните по кнопке справа от таблицы Требования (проверяются после "прогона" для определения того, допустимо ли найденное решение).
- Введите выражение требования в поле таблицы Выражение.
Допустимым решением является такое решение, которое удовлетворяет всем заданным ограничениям и требованиям. Нахождение допустимого решения является первоочередной задачей оптимизатора.
Тот факт, что найденное решение будет недопустимым, еще не говорит о том, что задача не имеет решений вообще. Хотя такие задачи и существуют, например, следующая:
parameterA + parameterB <= 4
parameterA + parameterB >= 5
Очевидно, что решения, удовлетворяющего обоим этим условиям, нет.
Если оптимизационная задача является решаемой, то оптимизатор всегда найдет допустимое решение и будет искать оптимальное решение (т.е., наилучшее решение, удовлетворяющее всем ограничениям).
Если оптимизатор не может найти допустимое решение, то это означает, что в заданном ограничениями и требованиями поле поиска решения нет. Вы должны будете проверить ваши ограничения, попытаться найти противоречия между ними или между каким-то ограничением и интервалом допустимых значений присутствующего в выражении ограничения параметра и устранить их.
Вы можете отключить ограничение, сделав его неактивным. Неактивные ограничения исключаются из оптимизационного процесса и не влияют на определение допустимых решений.
Чтобы отключить или включить ограничение
- Выберите оптимизационный эксперимент в панели Проекты.
- В секции Ограничения панели Свойства перейдите к строке таблицы Ограничения, накладываемые на параметры (проверяются перед запуском), содержащей нужное вам ограничение.
- Сбросьте/установите флажок в столбце Вкл.
Чтобы отключить или включить требование
- Выберите оптимизационный эксперимент в панели Проекты.
- В секции Требования панели Свойства перейдите к строке таблицы Требования (проверяются после "прогона" для определения того, допустимо ли найденное решение), содержащей нужное вам требование.
- Сбросьте/установите флажок в столбце Вкл.
Чтобы оптимизатор мог успешно работать, вам обязательно нужно задать условие остановки «прогона» модели. Если вы не зададите такое условие, то модель будет работать бесконечно, и оптимизатор не получит ни одного значения целевой функции, которое он должен запоминать в конце прогона модели. Обычно в качестве условия остановки модели задается какой-то момент времени, в который вам важно знать значение целевой функции. Поведение модели в этот момент должно быть устойчивым, а временные процессы должны быть завершены, чтобы полученная статистика была репрезентативной.
Сам же процесс оптимизации может завершиться в результате выполнения одного из следующих условий: если будет достигнуто максимальное количество «прогонов» модели, или если получаемые оптимизатором значения целевой функции перестанут улучшаться. Последнее условие известно как условие автоматической остановки. Вы можете использовать любое из этих условий в качестве условия остановки оптимизации. Если вы зададите оба условия, то оптимизация остановится при первом выполнении любого из этих условий.
Чтобы остановить оптимизацию после выполнения заданного числа итераций
- В панели Проекты выделите нужный вам эксперимент.
- Перейдите в панель Свойства.
- В секции свойств Условия остановки оптимизации задайте количество итераций в поле Количество итераций. Оптимизация завершится, когда будет выполнено заданное количество итераций (если ранее не сработает условие автоматической остановки).
Чтобы включить условие автоматической остановки
- В панели Проекты выделите нужный вам эксперимент.
- Перейдите в панель Свойства.
- В секции свойств Условия остановки оптимизации установите флажок Автоматическая остановка.
Вы также можете указать дополнительные условия остановки, используя таблицу в секции Модельное время свойств эксперимента оптимизации. Когда любое из перечисленных в таблице условий будет равно true, эксперимент остановится.
Как и у других экспериментов, у оптимизационного эксперимента есть своя графическая диаграмма, на которой вы можете нарисовать презентацию для этого эксперимента. Эта презентация будет отображена в окне презентации, которое откроется после запуска оптимизационного эксперимента.
По умолчанию на презентации оптимизационного эксперимента нет ничего. Но AnyLogic поддерживает механизм автоматического создания типового интерфейса, содержащего элементы управления, отображающие текущий прогресс оптимизации и помогающие экспортировать полученное решение в другие эксперименты модели. Единственным условием, которое нужно при этом соблюсти — перед тем, как создать используемый по умолчанию интерфейс, вы должны задать все свойства оптимизационных параметров этого эксперимента.
Мы советуем вам вначале создать типовой интерфейс, а потом изменять его в соответствии с вашими требованиями.
Чтобы создать интерфейс оптимизационного эксперимента
- В панели Проекты щелкните мышью по оптимизационному эксперименту.
- Перейдите в панель Свойства.
- Щелкните мышью по кнопке Создать интерфейс. При этом будет создан использующийся по умолчанию интерфейс эксперимента — на презентацию будут добавлены элементы управления, отображающие текущий прогресс оптимизации и облегчающие управление процессом.
Кнопка Запустить оптимизацию выполняет запуск оптимизационного процесса.
В правой части расположен график, визуально отображающий ход оптимизации. По оси X откладываются номера итераций, а по оси Y — Текущее, Лучшее допустимое и Лучшее недопустимое значения, найденные для каждой итерации.
Таблица, расположенная в левой части окна, отображает всю необходимую информацию о ходе оптимизационного процесса.
В столбце Текущее отображаются: номер последней завершенной итерации, значение целевой функции и значения параметров, при которых оно было получено на момент окончания этой итерации.
В столбце Лучшее отображается та же информация для найденного решения, которое является оптимальным к текущему моменту: номер итерации, когда это значение было получено, собственно, само значение целевого функционала, и значения параметров, при которых оно было получено.
По завершении оптимизации это решение будет считаться оптимальным найденным решением. Вы можете экспортировать полученное решение в другие эксперименты модели, щелкнув по кнопке Copy best и вставив его в дальнейшем в нужный вам эксперимент с помощью кнопки Вставить из буфера, расположенной в секции Параметры панели Свойства этого эксперимента.
После того, как вы зададите все настройки оптимизационного эксперимента, вы можете запустить оптимизацию вашей модели.
Процесс оптимизации моделируемой вами системы включает в себя следующие шаги:
- Вы запускаете оптимизацию
- Запустив оптимизацию, вы сможете изучать состояние системы и следить за тем, как оптимизатор решает оптимизационную задачу, предлагая более оптимальные значения целевой функции и оптимизационных параметров.
- После того, как оптимизатор закончит оптимизацию модели, вам будут выданы полученные оптимальное значение целевой функции и те значения параметров, при которых это значение было достигнуто. Если вы планируете в дальнейшем использовать полученные оптимальные значения в вашей имитационной модели, то вы можете скопировать эти значения в другой эксперимент (обычно это простой эксперимент) этой модели, щелкнув по кнопке копировать в окне презентации эксперимента.
Чтобы запустить оптимизационный эксперимент
- В панели Проекты щелкните правой кнопкой мыши по эксперименту, который вы хотите запустить, и выберите Запуск из контекстного меню. Либо выберите Модель > Запуск из главного меню или щелкните по кнопке со стрелкой справа от кнопки панели инструментов Запуск и выберите эксперимент, который вы хотите запустить, из выпадающего списка.
При запуске эксперимента AnyLogic автоматически производит построение запускаемой модели. Поэтому в случае обнаружения ошибки вам будет показано сообщение об ошибке (ошибках), а более подробная информация будет выведена в панель Консоль.
Чтобы запустить последний запущенный эксперимент
- Щелкните по кнопке панели инструментов Запуск или нажмите F5.
Запустив эксперимент, вы увидите отдельное окно — окно модели. В нем будет отображен интерфейс, созданный вами для запущенного оптимизационного эксперимента.
Если вы оптимизируете детерминированную модель, в которой нет стохастики (то есть, случайных процессов, описанных с помощью вероятностных распределений), то любые два «прогона» с одними и теми же значениями оптимизационных параметров всегда будут иметь одно и то же значение оптимизируемой функции на выходе (в момент окончания «прогона»). В этом случае оптимизатору достаточно выполнить всего лишь один «прогон» для каждой итерации оптимизации (то есть, для каждого набора значений параметров, предлагаемого оптимизатором).
Если же в вашей модели есть стохастика, то результаты «прогонов» будут уникальными, и значения оптимизируемой функции, полученные для «прогонов», произведенных при одних и тех же значениях оптимизационных параметров, скорее всего, будут отличаться. В этом случае мы не можем производить всего лишь один «прогон», принимать его результат в качестве результата для данной итерации и продолжать оптимизацию дальше, проверяя другие значения параметров. Чтобы получить репрезентативные данные, которым можно доверять, нам нужно провести несколько «прогонов» (называемых в данном контексте репликациями) для одного набора значений параметров и принимать в качестве значения целевой функции на итерации среднее значение результатов всех репликаций.
Число репликаций, производимых в рамках одной итерации, может быть фиксированным. Оптимизатор OptQuest также позволяет задать переменное количество репликаций. В первом случае вы просто задаете то количество репликаций, при котором вы считаете, что полученному результату можно будет доверять. В этом случае оптимизатор будет всегда выполнять строго заданное количество репликаций за одну итерацию.
Для OptQuest-оптимизации с переменным количеством репликаций в одной итерации задаются минимальное и максимальное количество репликаций. За одну итерацию оптимизатор всегда выполняет заданное минимальное количество репликаций. Необходимость выполнения дополнительных репликаций определяется оптимизатором. Прекращение выполнения дополнительных репликаций произойдет в одном из следующих случаев:
- Доверительный интервал для всех репликаций в рамках текущей итерации достаточно мал, чтобы попасть в интервал, заданный степенью доверия (то есть, искомое значение целевой функции для данной итерации несущественно отличается от среднего значения всех репликаций, что свидетельствует о том, что выборка репрезентативна, и найденному к данному моменту значению можно доверять).
- Значение целевой функции в текущей репликации существенно отстоит от текущего лучшего значения и очевидно, что при выбранных в текущей итерации значения оптимизационных параметров оптимальное решение найдено быть не может.
- Было выполнено заданное максимальное количество репликаций.
Чтобы запланировать выполнение фиксированного числа репликаций за одну итерацию
- Выберите эксперимент в панели Проекты.
- Перейдите в секцию Репликации панели Свойства.
- Установите флажок Использовать репликации.
- Выберите опцию Фиксированное количество репликаций.
- Задайте количество репликаций в поле Кол-во репликаций за итерацию.
Чтобы запланировать выполнение переменного числа репликаций за одну итерацию
- Выберите эксперимент в панели Проекты.
- Перейдите в секцию Репликации панели Свойства.
- Установите флажок Использовать репликации.
- Выберите опцию Переменное кол-во репликаций (Останов после выполнения минимального кол-ва репликаций, при достижении доверительного интервала).
- Задайте минимальное количество репликаций в поле Минимальное кол-во репликаций.
- Задайте максимальное количество репликаций в поле Максимальное кол-во репликаций.
- В поле Доверительная вероятность задайте значение доверительной вероятности для получаемых значений целевой функции. Доверительная вероятность показывает, с какой вероятностью случайный ответ попадет в доверительный интервал. Для простоты можно понимать её как точность выборки. Как правило, используется 95%, но в тех случаях, когда высокая точность не нужна, вероятностью можно пожертвовать и понизить её уровень до 90% и даже до 85%. И наоборот, чем большую выборку может себе позволить исследователь, тем выше можно установить точность полученных данных. Доверительный интервал можно понимать как погрешность, задает размах части кривой распределения по обе стороны от выбранной точки, куда могут попадать ответы.
- В поле Относительный уровень ошибки задайте значение от 0 до 1, определяющее размер доверительного интервала, который нас будет устраивать в качестве условия прекращения выполнения дополнительных репликаций для текущей итерации. Интервал считается как ("текущее среднее значение" - "текущее среднее значение" * относительный уровень ошибки, "текущее среднее значение" + "текущее среднее значение" * относительный уровень ошибки).
Если вас не устраивает скорость, с которой выполняется оптимизация, то вы можете ускорить этот процесс с помощью одного из описанных ниже способов:
Чтобы быстрее найти оптимальное решение
-
Задавайте настройки, соответствующие вашей оптимизационной задаче:
- Предлагайте более близкие к оптимальным значения оптимизационных параметров.
- Сократите область поиска, задав границы интервалов допустимых значений для оптимизационных параметров.
- Исключите из процесса параметры, не влияющие на значение целевой функции.
- Старайтесь не задавать ограничения. Вначале оптимизируйте вашу модель без ограничений и проверьте, удовлетворяет ли найденное решение вашим ограничениям. Если какие-то из ограничений не будут удовлетворены, то только тогда оптимизируйте вашу модель с ограничениями.
-
Решайте оптимизационную задачу итеративно:
- Вначале ограничьтесь грубым приближением проблемы: задайте большие интервалы значений, большие шаги, небольшие точности параметров и целевого функционала.
- Запустите оптимизацию и изучайте ход процесса до тех пор, пока найденные решения не будут улучшаться медленно.
- Задайте более точные установки оптимизации. Сократите интервалы допустимых значений и шаги параметров. Начните оптимизацию со значениями, найденными при запуске оптимизации с грубой постановкой задачи.
- Запустите оптимизацию и изучайте ход процесса до тех пор, пока найденные решения не будут улучшаться медленно. Если вас устроят полученные результаты, то вы можете остановить оптимизацию. Если нет, то повторите процесс заново, начиная с шага 3.
Чем больше оптимизационных параметров вы зададите, тем медленнее будет производиться оптимизация модели.
-
Как мы можем улучшить эту статью?
-