Создание оптимизации из собственного алгоритма

Обзор процесса

Функция оптимизации CAGE позволяет вам использовать собственные алгоритмы оптимизации в качестве альтернативы стандартным программам библиотеки fmincon, NBI, ga и patternsearch.

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

Задачей, которая будет решена, является задача рабочего примера:

Максимизируйте крутящий момент (TQ) над свободными переменными (SPK, AFR) над заданным набором (N, L) точки. Эти точки определены в наборе данных New_Dataset, который можно найти в сеансе CAGE optimworkedexample.cag и может быть импортирована на фиксированную панель значений переменных в представлении Оптимизации.

Модель крутящего момента, которая будет использоваться, находится в /mbctraining/Holliday.mat.

Шаги процесса:

  1. Начните с собственного алгоритма. Будем использовать fminunc из продукта Optimization Toolbox™ в качестве примера.

  2. Создайте оптимизационную функцию CAGE.

  3. Определите атрибуты вашей оптимизации в оптимизационная функция CAGE.

  4. Добавьте свой алгоритм к оптимизационной функции CAGE.

  5. Зарегистрируйте заполненные оптимизационные функции в CAGE.

  6. Проверьте оптимизацию.

Шаги этого руководства проведут вас через ряд примеров, иллюстрирующих, как создать код, чтобы включить ваш собственный алгоритм в оптимизацию в CAGE.

Перед началом необходимо создать рабочую папку.

  1. Создайте новую папку (для примера, C:\Optimization_Work). Мы рекомендуем поместить эту папку вне MATLAB® папки, чтобы избежать помех файлам тулбокса.

  2. Скопируйте следующие шесть файлов из папки mbctraining в новую рабочую папку:

    currtutoptim.m
    mbcOStemplate.m
    mbcOStutoptimfunc_s1.m
    mbcOStutoptimfunc.m
    optimtut.mat
    optimtuteg.mat
    
  3. Убедитесь, что ваша новая рабочая папка находится в пути MATLAB; либо изменить Current Folder в MATLAB в новой рабочей папке, либо добавить папку в путь следующим образом:

    1. На вкладке Home, в разделе Environment, нажмите Set Path.

    2. Нажмите Add Folder и перейдите в рабочую папку.

    3. Нажмите OK.

    4. Нажмите Save.

    5. Нажмите Close.

Шаг 1: Проверьте алгоритм

currtutoptim.m является пример файла для проверки того, что fminunc решает рабочую задачу примера. Попробовать это можно в командной строке MATLAB.

  1. Чтобы открыть файл алгоритма в редактор, либо введите open currtutoptim.m в командной строке или если Current Folder в MATLAB является вашей новой рабочей папкой, то дважды кликните currtutoptim.m в Current Folder. Вы увидите код в редакторе MATLAB.

  2. Чтобы проверить это 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.

Шаг 2: Создайте оптимизационную функцию CAGE

Любой алгоритм оптимизации, который вы хотите использовать в CAGE, должен содержаться в оптимизационной функции. Оптимизационная функция CAGE состоит из двух секций.

Первый раздел задает следующие атрибуты оптимизации:

  • Имя для оптимизации

  • Описание оптимизации

  • Количество свободных переменных

  • Метки для свободных переменных (при необходимости), поэтому пользователь может сопоставить переменные в CAGE с необходимыми свободными переменными алгоритма.

  • Количество целей

  • Метки для целевых функций, поэтому пользователь может сопоставить модели в CAGE с необходимыми целями алгоритма (можно совпадать в CAGE, поэтому метки не должны быть точными в оптимизационная функция)

  • Количество ограничений

  • Метки для ограничений, поэтому пользователь может соответствовать моделям в CAGE требуемым моделям в ограничениях вашего алгоритма

  • Количество наборов данных

  • Метки для наборов данных, чтобы пользователь мог сопоставить наборы данных в CAGE с необходимыми переменными данными для вашего алгоритма

  • Любые другие параметры, требуемые алгоритмом оптимизации

Второй раздел содержит алгоритм оптимизации.

Откройте mbcOStemplate.m в редакторе MATLAB.

mbcOStemplate.m - пустая оптимизационная функция CAGE. Два (в настоящее время пустых) раздела функции options (для определения атрибутов оптимизации) и optimstore (для определения алгоритма оптимизации). Обратите внимание, что этот файл может использоваться в качестве шаблона для любой оптимизационной функции, которую вы записываете.

Шаг 3: Задайте опции оптимизации

Следующим шагом является определение атрибутов оптимизации (в разделе 1 шаблона).

Откройте mbcOStutoptimfunc_s1.m. В этом файле можно увидеть атрибуты оптимизации, которые были определены.

Ниже приведен фрагмент кода из этого файла:

Атрибуты оптимизации передаются в CAGE через cgoptimoptions объект, на который ссылаются опции в коде в mbcOStutoptimfunc_s1.m. Для получения дополнительной информации о cgoptimoptions см. таблицу объект. The cgoptimoptions объект имеет набор функций, которые устанавливают атрибуты оптимизации в CAGE. Здесь вы задаете имя, описание, свободные переменные, целевые функции, ограничения, наборы вспомогательных данных и параметры оптимизации для оптимизации.

Подробную информацию обо всех доступных функциях см. в Ссылке по оптимизационным функциям в документации CAGE. Вышеуказанный код использовал cgoptimoptions объект (options), чтобы задать атрибуты оптимизации, как описано в следующей таблице.

Просмотрите код, чтобы найти перечисленную секцию кода Where Set для каждого атрибута, чтобы увидеть, как настроена каждая из опций оптимизации.

ПризнакЗначениеСекция кода, Где Set

Имя оптимизации

Tutorial_Optimization

Add a name - setName

Описание

Простой отработанный пример для максимизации крутящего момента

Add a description - setDescription

Количество свободных переменных

Не может быть изменен пользователем в графическом интерфейсе пользователя (режим был установлен на 'fixed')

Set up the free variables - setFreeVariablesMode

Требуемые свободные переменные

Эта функция требует двух свободных переменных, маркированных 'afr' и 'spk'. Пользователь сопоставляет эти метки свободных переменных с переменными CAGE в мастере оптимизации.

Set up the free variables - addFreeVariables

Количество целей

Не может быть изменен пользователем в графическом интерфейсе пользователя (режим был установлен на 'fixed')

Set up the objective functions - setObjectivesMode

Необходимые целевые функции

Эта функция требует одной целевой функции, которая будет помечена 'Torque' в функции оптимизации. Пользователь соответствует этому 'Torque' пометить в модель CAGE.

Set up the objective functions - addObjective

Количество ограничений

Не может быть изменен пользователем в графическом интерфейсе пользователя (режим был установлен на 'fixed')

Set up the constraints - SetConstraintsMode

Необходимые ограничения

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

Set up the constraints - %There are no constraints

Количество наборов вспомогательных данных

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

Set up the operating point sets - setOperatingPointsMode

Параметры оптимизации

Эта функция позволит пользователю изменить пять параметров. Они будут отображены в диалоговом окне «Параметры оптимизации» и помечены Display, Maximum iterations, Maximum function evaluations, Variable tolerance и Function tolerance.

Set up the optimization parameters - addParameter

Когда одна из ваших оптимизаций создается в графическом интерфейсе пользователя CAGE, CAGE сначала вызывает вашу оптимизационную функцию, чтобы задать атрибуты оптимизации. Вызов функции из CAGE имеет форму

optionsobj = <your_optimization_function>('options', optionsobj)

Вот как ваша оптимизационная функция получает cgoptimoptions объект. Обратите внимание, что ваша оптимизационная функция должна поддерживать этот интерфейс.

Шаг 4: Добавьте алгоритм к оптимизационной функции

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

  1. Откройте mbcOStutoptimfunc.m.

    Этот файл содержит завершенный алгоритм оптимизации. Ниже приведен фрагмент кода из этого файла.

    Добавлена одна линия, а именно

    optimstore = tutoptimizer(optimstore)
    

    Эта линия вызывает измененный алгоритм оптимизации. Обратите внимание на синтаксис алгоритма: он должен принимать форму

    optimstore = <your_optimization_algorithm>(optimstore)
    
  2. Локальная функция tutoptimizer можно найти в нижней части файла mbcOStutoptimfunc.m. Прокрутите вниз, чтобы просмотреть алгоритм, измененный для использования в CAGE.

    optimstore является cgoptimstore объект. Это объект интерфейса, который позволяет вам получать данные и устанавливать данные в функции оптимизации CAGE. Теперь можно увидеть, как optimstore объект используется путем сравнения измененного алгоритма оптимизации, tutoptimizer, с исходным алгоритмом, currtutoptim, для каждого из основных разделов алгоритма.

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

Раздел 1 алгоритма

Получите начальные условия (x0) для свободных переменных.

Оригинальный код:

x0 передан из рабочего пространства MATLAB.

Модифицированный код:

x0 = getInitFreeVal(optimstore);

В исходном алгоритме x0 передается в алгоритм из рабочего пространства MATLAB. В CAGE мы вызываем getInitFreeVal функция на optimstore объект для извлечения x0.

Раздел 2 алгоритма

Выполните оптимизацию (в Разделе 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

При выполнении алгоритма единственное различие между исходным и модифицированным кодом заключается в том, как оценивается целевая функция. Исходный алгоритм требует, чтобы целевая функция (модель Model-Based Calibration Toolbox™ для крутящего момента) была загружена и оценена по мере необходимости. В модифицированном алгоритме целевая функция (крутящий момент) оценивается путем вызова evaluate функция на optimstore объект. Обратите внимание, что входы в модель крутящего момента передаются в evaluate функцию, как показано в следующей таблице.

Исходный входВход для вычисления функции
SX(1)
AX(2)

Раздел 3 алгоритма

Извлечение выходных данных.

Оригинальный код:

Оптимальные настройки свободной переменной возвращаются через переменную 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

Шаг 5: Зарегистрируйте свою оптимизационную функцию с CAGE

Предоставленный рабочий пример предварительно регистрируется, поэтому его можно увидеть как опцию в мастере оптимизации при настройке новой оптимизации. Перед использованием новых функций необходимо зарегистрировать их. Когда вы изменили шаблон, чтобы создать свои собственные оптимизационные функции, как в этом примере, вы должны зарегистрировать его с помощью продукта Model-Based Calibration Toolbox в порядок, чтобы использовать функцию в CAGE. После сдачи оптимизационной функции на хранение она появляется в мастере оптимизации.

  1. В CAGE выберите File > Preferences.

    Откроется диалоговое окно Настройки CAGE (CAGE Preferences).

  2. Щелкните вкладку Optimization и нажатие кнопки Add, чтобы перейти к вашему файлу.

  3. Найдите файл mbcOStutoptimfunc.m (в созданной вами рабочей папке) и нажмите Open.

    Это регистрирует оптимизационную функцию с CAGE.

  4. Теперь можно протестировать функцию, нажав Test. Это хорошая проверка на любые синтаксические ошибки в вашей оптимизационной функции. Это очень полезная функция, когда вы используете свои собственные функции; если что-то неправильно настроено, результаты теста подскажут, где начать корректировать свою функцию.

    Пример этого можно было увидеть, сохранив копию рабочего файла примера и изменив одно из имен переменных (например afr) на число. Попытайтесь проверить эту измененную функцию в CAGE, и кнопка Test вернет информативную ошибку с указанием линии, которую вы изменили.

  5. Нажмите кнопку OK, чтобы покинуть диалоговое окно Настройки. Если оптимизационная функция проверена успешно, она регистрируется как оптимизационная функция, которая может использоваться в CAGE и появляется в мастере оптимизации.

Шаг 6: Проверьте свою новую оптимизацию

Чтобы проверить алгоритм, мы настроили сеанс CAGE, чтобы запустить оптимизацию, которая была выполнена на шаге 1. В данном примере сеанс CAGE уже настроен. Выполните следующие шаги, чтобы запустить оптимизацию руководства в CAGE.

  1. В CAGE выберите File > Open Project и загрузите файл optimworkedexample.cag (если у вас уже нет открытого проекта). Этот проект находится в mbctraining папка.

  2. Выберите File > New > Optimization.

  3. Вновь зарегистрированная оптимизация появится в списке имен алгоритмов. Выберите Tutorial_Optimization из списка. Нажмите Next.

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

    Нажмите Next.

  5. Соответствовать Torque модель в tuttq Модель CAGE, как показано.

    Нажмите Finish.

  6. Если вы запустили оптимизацию сейчас, она будет запускаться в одной точке, заданной точкой всех переменных. Вы используете свободные и фиксированные Variable Values панели, чтобы выбрать рабочие точки. Можно редактировать точки вручную или импортировать их. Выполните одно из следующих действий:

    • Если у вас есть предыдущая оптимизация отработанного примера в текущем сеансе, в представлении оптимизации увеличьте Number of runs до 36, а затем скопируйте и вставьте фиксированные значения переменных из предыдущей оптимизации.

    • Если у вас нет предыдущей оптимизации в сеанс, выберите Optimization > Import From Data Set. Файл проекта содержит набор данных со значениями N и L, и они выбираются автоматически. Нажмите OK для импорта.

    Теперь вы должны иметь 36 строк как в фиксированных, так и в свободных панелях переменных, и значения рабочих точек в столбцах N и L на панели Fixed Variables. Начальные значения для A и искра для каждой точки являются заданными точками в словаре переменных.

  7. Выберите Optimization > Set Up. Откроется диалоговое окно Параметры Оптимизации (Optimization Parameters). Наблюдайте пять параметров, определенных в учебном скрипте оптимизации.

    Измените переменную и допуски функции на 1e-4, и нажмите OK, чтобы закрыть диалоговое окно.

  8. Запустите оптимизацию и просмотрите результаты. Матрица выходных данных должна напоминать следующую. Обратите внимание, что оптимальные значения для A и SPK очень похожи на значения из исходного алгоритма.