Функция оптимизации CAGE позволяет использовать собственные алгоритмы оптимизации в качестве альтернативы библиотечным подпрограммам fmincon, NBI, ga и patternsearch.
На примере этого учебного пособия показано, как использовать существующий алгоритм оптимизации в качестве функции оптимизации для оптимизации CAGE.
Проблема, которая должна быть решена, - это проблема отработанного примера:
Максимальный крутящий момент (TQ) над свободными переменными (SPK, AFR) по указанному набору (N, L) точек. Эти точки определены в наборе данных New_Dataset, который можно найти в сеансе CAGE optimworkedexample.cag и могут быть импортированы на панель фиксированных значений переменных в представлении «Оптимизация».
Модель крутящего момента, которая должна использоваться в /mbctraining/Holliday.mat.
Этапы процесса:
Начните с собственного алгоритма. Мы будем использовать fminunc из продукта Optimization Toolbox™ в качестве примера.
Создайте функцию оптимизации CAGE.
Определите атрибуты оптимизации в функции оптимизации CAGE.
Добавьте алгоритм к функции оптимизации CAGE.
Зарегистрируйте завершенную функцию оптимизации в CAGE.
Проверьте оптимизацию.
В этом учебном пособии приводится ряд примеров создания кода для включения собственного алгоритма в оптимизацию в CAGE.
Перед началом работы необходимо создать рабочую папку.
Создание новой папки (например, C:\Optimization_Work). Рекомендуется поместить эту папку за пределы папок MATLAB ®, чтобы избежать вмешательства в файлы панели инструментов.
Скопируйте следующие шесть файлов из папки mbctraining в новую рабочую папку:
currtutoptim.m mbcOStemplate.m mbcOStutoptimfunc_s1.m mbcOStutoptimfunc.m optimtut.mat optimtuteg.mat
Убедитесь, что новая рабочая папка находится в пути MATLAB; либо измените текущую папку в MATLAB на новую рабочую папку, либо добавьте папку к пути следующим образом:
На вкладке Главная (Home) в разделе Среда (Environment) щелкните Задать путь (Set Path).
Щелкните Добавить папку (Add Folder) и перейдите к рабочей папке.
Нажмите кнопку ОК.
Нажмите кнопку Сохранить.
Щелкните Закрыть (Close).
currtutoptim.m является примером файла для проверки того, что fminunc решает проблему отработанного примера. Вы можете попробовать это в командной строке MATLAB.
Чтобы открыть файл алгоритма в редакторе, введите open currtutoptim.m в командной строке или если текущая папка в MATLAB является вашей новой рабочей папкой, то дважды щелкните currtutoptim.m в текущей папке. Код должен отображаться в редакторе MATLAB.
Чтобы проверить, что fminunc решает проблему отработанного примера, введите следующую команду в подсказке MATLAB:
bestX = currtutoptim
После завершения сообщений о ходе выполнения выходные данные рабочей области должны выглядеть следующим образом:
BestX =
23.768 12.78
18.179 12.78
14.261 12.78
12.014 12.78
11.439 12.78
12.535 12.78
27.477 12.78
21.887 12.78
17.969 12.78
15.722 12.78
15.147 12.78
16.243 12.78
31.185 12.78
25.595 12.78
21.677 12.78
19.43 12.78
18.855 12.78
19.951 12.78
34.893 12.78
29.303 12.78
25.385 12.78
23.138 12.78
22.563 12.78
23.659 12.78
38.601 12.78
33.012 12.78
29.093 12.78
26.847 12.78
26.271 12.78
27.368 12.78
42.309 12.78
36.72 12.78
32.802 12.78
30.555 12.78
29.979 12.78
31.075 12.78
Матрица bestX содержит оптимальный SPK и AFR значения, которые максимизируют крутящий момент модели MBC (экспортируются из Holliday.mat) в точках скорости и нагрузки, определенных в матричных данных.
fminunc - это пример алгоритма оптимизации, который требуется передать в CAGE для использования в графическом интерфейсе пользователя оптимизации.
В этом учебном пособии показано, как создавать fminunc доступно для использования в функции оптимизации CAGE.
Любой алгоритм оптимизации, который вы хотите использовать в CAGE, должен содержаться в функции оптимизации. Функция оптимизации CAGE состоит из двух разделов.
В первом разделе определяются следующие атрибуты оптимизации:
Имя для оптимизации
Описание оптимизации
Количество свободных переменных
Метки для свободных переменных (при необходимости), чтобы пользователь мог сопоставить переменные в CAGE с требуемыми свободными переменными алгоритма.
Количество целей
Метки для целевых функций, чтобы пользователь мог сопоставить модели в CAGE с требуемыми целями алгоритма (можно сопоставить в CAGE, поэтому метки не должны быть точными в функции оптимизации)
Количество ограничений
Метки для ограничений, чтобы пользователь мог сопоставить модели в CAGE с требуемыми моделями в ограничениях алгоритма
Количество наборов данных
Метки для наборов данных, чтобы пользователь мог сопоставить наборы данных в CAGE с требуемыми переменными данными для вашего алгоритма
Любые другие параметры, требуемые алгоритмом оптимизации
Второй раздел содержит алгоритм оптимизации.
Открытый mbcOStemplate.m в редакторе MATLAB.
mbcOStemplate.m является пустой функцией оптимизации CAGE. Две (пустые) секции функции: options (для определения атрибутов оптимизации) и optimstore (для определения алгоритма оптимизации). Обратите внимание, что этот файл может использоваться в качестве шаблона для любой функции оптимизации, которую вы пишете.
Следующим шагом является определение атрибутов оптимизации (в разделе 1 шаблона).
Открытый mbcOStutoptimfunc_s1.m. В этом файле можно просмотреть определенные атрибуты оптимизации.
Ниже приведен фрагмент кода из этого файла:

Атрибуты оптимизации передаются в CAGE через cgoptimoptions , на который ссылаются параметры в коде в mbcOStutoptimfunc_s1.m. Для получения подробной информации о cgoptimoptions объект. cgoptimoptions объект имеет набор функций, задающих атрибуты оптимизации в CAGE. Здесь указываются имя, описание, свободные переменные, целевые функции, ограничения, наборы вспомогательных данных и параметры оптимизации для оптимизации.
Для получения подробной информации обо всех доступных функциях см. ссылку на функцию оптимизации в документации CAGE. Вышеупомянутый код использовал cgoptimoptions объект (options) для установки атрибутов оптимизации, как описано в следующей таблице.
Просмотрите код, чтобы найти в списке Раздел кода (Code Section Where Set) для каждого атрибута, чтобы увидеть, как настроена каждая из опций оптимизации.
| Признак | Стоимость | Раздел кода, где установлен |
|---|---|---|
Имя оптимизации |
| Add a name - setName |
Описание | Простой отработанный пример максимизации крутящего момента | Add a description - setDescription |
Количество свободных переменных | Не может быть изменен пользователем в GUI (режим установлен на | Set up the free variables - setFreeVariablesMode |
Требуемые свободные переменные | Эта функция требует двух свободных переменных, помеченных | Set up the free variables - addFreeVariables |
Количество целей | Не может быть изменен пользователем в GUI (режим установлен на | Set up the objective functions - setObjectivesMode |
Требуемые целевые функции | Для этой функции требуется одна целевая функция, которая будет помечена | Set up the objective functions - addObjective |
Количество ограничений | Не может быть изменен пользователем в GUI (режим установлен на | Set up the constraints - SetConstraintsMode |
Обязательные ограничения | Поскольку режим является фиксированным и метки ограничений не определены, эта оптимизация не имеет линейных или нелинейных ограничений. | Set up the constraints - %There are no constraints |
Количество наборов вспомогательных данных | Не может быть изменен пользователем в GUI (режим установлен на | Set up the operating point sets - setOperatingPointsMode |
Параметры оптимизации | Эта функция позволяет пользователю изменять пять параметров. Они будут отображаться в диалоговом окне Параметры оптимизации (Optimization Parameters) и помечены как Отображение (Display), Максимум итераций (Maximum iterations), Максимум оценок функций (Maximum function evaluations), Допуск переменных (Variable tolerance | Set up the optimization parameters - addParameter |
При создании одной из оптимизаций в графическом интерфейсе CAGE CAGE сначала вызывает функцию оптимизации для определения атрибутов оптимизации. Вызов функции из CAGE имеет вид
optionsobj = <your_optimization_function>('options', optionsobj)
Таким образом функция оптимизации получает cgoptimoptions объект. Обратите внимание, что функция оптимизации должна поддерживать этот интерфейс.
На этом шаге вы завершите функцию оптимизации, добавив свой алгоритм. Для этого необходимо внести несколько изменений в код, вызывающий алгоритм, поскольку данные (например, значения свободных переменных, константы и т. д.) теперь будут передаваться в CAGE и из него, а не из рабочей области MATLAB.
Открытый mbcOStutoptimfunc.m.
Этот файл содержит завершенный алгоритм оптимизации. Ниже приведен фрагмент кода из этого файла.

Добавлена одна строка, а именно:
optimstore = tutoptimizer(optimstore)
Эта строка вызывает модифицированный алгоритм оптимизации. Обратите внимание на синтаксис алгоритма: он должен принимать вид
optimstore = <your_optimization_algorithm>(optimstore)
Локальная функция tutoptimizer можно найти в нижней части файла mbcOStutoptimfunc.m. Прокрутите вниз, чтобы просмотреть алгоритм, измененный для использования в CAGE.
optimstore является cgoptimstore объект. Это объект интерфейса, который позволяет получать данные из и устанавливать данные в функции оптимизации CAGE. Теперь вы можете увидеть, как optimstore используется путем сравнения измененного алгоритма оптимизации, tutoptimizer, с исходным алгоритмом, currtutoptim, для каждого из основных разделов алгоритма.
В следующих разделах показано, как преобразовать существующий алгоритм для использования в CAGE. Обратите внимание, что в этом учебном примере код уже изменен для проверки.
Получение условий запуска (x0) для свободных переменных.
Исходный код:
x0 из рабочей области MATLAB.
Измененный код:
x0 = getInitFreeVal(optimstore);
В исходном алгоритме x0 передается в алгоритм из рабочей области MATLAB. В CAGE мы вызываем getInitFreeVal функции на optimstore объект для извлечения x0.
Выполните оптимизацию (в разделе 2 шаблона).
Исходный код (от currtutoptim):
[bestx(i, :), notused1, notused2, OUTPUT(i)] = fminunc(trqfunc, x0, algoptions);
который вызывает следующий код для оценки функции затрат:
function tq = trqfunc(x)
% Evaluate torque. Note x = [SPK, AFR]
tq = EvalModel(TQMOD, [x(1), N(i), L(i), x(2)]);
% Maximising torque, so need to return -tq
tq = -tq;
end
Измененный код:
[bestx, unused, exitFlag, OUTPUT] = fminunc(@trqfunc_new, x0, algoptions);
который вызывает следующий код для оценки функции затрат:
function y = trqfunc_new(x)
% Evaluate the torque objective function
y = -evaluate(optimstore, x);
end
При выполнении алгоритма единственное различие между исходным и измененным кодом заключается в том, как оценивается целевая функция. Исходный алгоритм требует, чтобы целевая функция (модель калибровочного Toolbox™ на основе модели для крутящего момента) загружалась и оценивалась в соответствии с требованиями. В модифицированном алгоритме целевая функция (крутящий момент) оценивается путем вызова evaluate функции на optimstore объект. Обратите внимание, что входные данные модели крутящего момента передаются в evaluate как показано в следующей таблице.
| Исходный ввод | Ввод для вычисления функции |
|---|---|
S | X(1) |
A | X(2) |
Получение выходных данных.
Исходный код:
Оптимальные настройки свободных переменных возвращаются через переменную bestX в currtutoptim.
Измененный код:
% Write results to the optimstore optimstore = setFreeVariables(optimstore, bestx); % Set termination message termMsg = OUTPUT.message; OUTPUT = rmfield(OUTPUT, 'message'); % Set all information in the optimstore and leave optimstore = setExitStatus(optimstore, exitFlag, termMsg); optimstore = setOutput(optimstore, OUTPUT);
В измененном алгоритме результаты необходимо отправить обратно в функцию оптимизации CAGE, а не в рабочую область MATLAB. Для этого результаты оптимизации задаются в optimstore , который затем возвращается в CAGE. Существует три функции, которые необходимо вызвать в optimstore объект для возврата результатов оптимизации в CAGE:
setFreeVariables - Возвращает оптимальные значения свободных переменных в CAGE
setExitStatus - возвращает целое число, указывающее на успешное завершение работы алгоритма (положительное значение). При этом устанавливается сообщение о завершении.
setOutput - Возвращает любую диагностическую информацию по алгоритму в CAGE
Приведенный рабочий пример предварительно зарегистрирован, поэтому его можно просмотреть в мастере оптимизации при настройке новой оптимизации. Перед использованием новых функций необходимо зарегистрировать их. После изменения шаблона для создания собственной функции оптимизации, как в этом примере, необходимо зарегистрировать его с помощью продукта Model-Based Calibration Toolbox, чтобы использовать эту функцию в CAGE. После проверки функции оптимизации она появится в мастере оптимизации.
В CAGE выберите «Файл» > «Установки».
Откроется диалоговое окно Настройки CAGE (CAGE Preferences).
Перейдите на вкладку Оптимизация (Optimization) и нажмите кнопку Добавить (Add), чтобы перейти к файлу.
Найдите файл mbcOStutoptimfunc.m (в созданной рабочей папке) и нажмите «Открыть».
Функция оптимизации регистрируется в CAGE.

Теперь вы можете проверить функцию, нажав Test. Это хорошая проверка на любые синтаксические ошибки в вашей функции оптимизации. Это очень полезная функция при использовании собственных функций; если что-то неправильно настроено, результаты теста сообщат, с чего начать коррекцию функции.
Пример этого можно увидеть, сохранив копию файла отработанного примера и изменив одно из имен переменных (например, afr) к номеру. Попробуйте проверить эту измененную функцию в CAGE, и кнопка Test вернет информативную ошибку, указывающую на измененную строку.
Нажмите кнопку «ОК», чтобы выйти из диалогового окна «Настройки CAGE». Если функция оптимизации успешно протестирована, она регистрируется как функция оптимизации, которую можно использовать в CAGE, и появляется в мастере оптимизации.
Чтобы проверить алгоритм, мы настроим сеанс CAGE для выполнения оптимизации, которая была выполнена на шаге 1. Для этого примера сеанс CAGE уже настроен. Выполните следующие действия для запуска оптимизации учебного пособия в CAGE.
В CAGE выберите «Файл» > «Открыть проект» и загрузите файл. optimworkedexample.cag (если этот проект уже открыт). Этот проект находится в mbctraining папка.
Выберите меню «Файл» > «Создать» > «Оптимизация».
Вновь зарегистрированная оптимизация появится в списке имен алгоритмов. Выбрать Tutorial_Optimization из списка. Нажмите кнопку Далее.

Сопоставьте переменные, как показано на рисунке.

Нажмите кнопку Далее.
Сопоставить Torque модель в tuttq CAGE-модель, как показано на рисунке.

Нажмите кнопку Готово (Finish).
Если выполнить оптимизацию сейчас, она будет выполняться в одной точке - уставке всех переменных. Для выбора рабочих точек используются свободные и фиксированные панели переменных значений. Точки можно редактировать вручную или импортировать. Выполните одно из следующих действий:
Если в текущей сессии была выполнена предыдущая оптимизация отработанного примера, в представлении оптимизации увеличьте число запусков до 36, а затем скопируйте и вставьте фиксированные значения переменных из предыдущей оптимизации.
Если предыдущая оптимизация в сессии отсутствует, выберите «Оптимизация» > «Импорт из набора данных». Файл проекта содержит набор данных со значениями N и L, которые выбираются автоматически. Нажмите кнопку ОК для импорта.
Теперь необходимо иметь 36 строк как в фиксированных, так и в свободных областях переменных, а также значения рабочих точек в столбцах N и L на панели Фиксированные переменные (Fixed Variables). Начальные значения для A и искры для каждой точки являются уставками в словаре переменных.
Выберите «Оптимизация» > «Настроить». Откроется диалоговое окно Параметры оптимизации (Optimization Parameters). Обратите внимание на пять параметров, определенных в сценарии оптимизации учебного пособия.
Измените допуски переменной и функции на 1e-4и нажмите кнопку «ОК», чтобы закрыть диалоговое окно.
Выполните оптимизацию и просмотрите результаты. Матрица выходных данных должна напоминать следующую. Следует отметить, что оптимальные значения для A и SPK очень похожи на значения исходного алгоритма.
