Генерация кода оптимизации для приложений реального времени

Ограничения по времени на сгенерированном коде

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

Для общих рекомендаций по записи эффективного кода для генерации кода смотрите Конструктивные соображения кода MATLAB для Генерации кода (MATLAB Coder).

Совпадайте с целевым окружением

Чтобы оценить время выполнения сгенерированного кода перед генерацией кода, установите свою среду MATLAB® совпадать с целевым окружением максимально тесно.

Установите настройку кодера

Чтобы установить настройку для генерации кода, вызовите coder.config.

cfg = coder.config('mex');

Чтобы сэкономить время в сгенерированном коде, выключите проверки целостности и проверки на целочисленное насыщение. fmincon не использует эти проверки, чтобы функционировать правильно, принимая, что целевая функция и нелинейная ограничительная функция не требуют их. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления (MATLAB Coder).

cfg.IntegrityChecks = false;
cfg.SaturateOnIntegerOverflow = false;

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

cfg.DynamicMemoryAllocation = 'Off';

Можно улучшать производительность кода путем выбора различного BLAS, базовых подпрограмм линейной алгебры. Чтобы изучить, как установить BLAS для вашего сгенерированного кода, смотрите, Ускоряют Матричные операции в Сгенерированном Автономном Коде при помощи Вызовов BLAS (MATLAB Coder). Если вы хотите, чтобы встраиваемое приложение запустилось параллельно, необходимо предоставить библиотеки BLAS или LAPACK, которые поддерживают параллельный расчет в системе. Точно так же, когда у вас есть параллельное оборудование, можно улучшать производительность кода путем установки пользовательских вызовов LAPACK. Смотрите Ускоряют Линейную алгебру в Сгенерированном Автономном Коде при помощи Вызовов LAPACK (MATLAB Coder).

Протестируйте в сравнении с эталоном fmincon

Запустите свой сгенерированный код MEX в цикле тысячи оценок с помощью набора входных параметров, который типичен для приложения. Найдите и общее время и максимум времен оценки. Попробуйте параметры, что вы думаете, может вызвать fmincon занять слишком много времени, и протестировать их и другие параметры. Если приложение MEX возвратит удовлетворительные результаты в удовлетворительные времена, то можно ожидать, что развертываемое приложение будет, также.

Установите начальную точку для fmincon

Одним из наиболее важных факторов, влияющих и на время выполнения и на качество решения, является начальная точка для оптимизации x0. Когда параметры медленно изменяются между fmincon вызовы, решение от предыдущего вызова обычно является точкой хорошего начала для следующего cal. Смотрите Следуют за Решением для уравнения как за параметром Изменения, который также показывает, как скачок во время решения может произойти, потому что решение переключает Области притяжения.

Если ваша задача оптимизации не имеет параметров, изменяющихся медленно, и включает только несколько контрольных переменных, то попытка оценить ответ из предыдущих решений может стоить. Создайте модель решения как функция параметров, или как квадратичное в параметрах или как низко-размерная интерполяция, и используйте предсказанную точку решения в качестве стартовой точки для fmincon.

Установите опции соответственно

Можно иногда ускорять решение путем тонкой настройки параметров. Если вы устанавливаете MaxIterations опция, чтобы позволить всего несколько итераций, затем fmincon остановки быстро.

opts = optimoptions('fmincon','Algorithm','sqp','MaxIterations',50);
[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

Однако результат может быть далек от оптимума. Убедитесь, что неточный результат не чрезмерно воздействует на вашу систему. Установите MaxIterations как можно больше, все еще соответствуя вашему ограничению времени. Можно оценить это значение путем измерения, сколько времени итерация берет, или путем измерения, сколько времени функциональная оценка берет, и затем любая установка MaxFunctionEvaluations опция или MaxIterations опция. Для примера смотрите Генерацию кода для Основ Оптимизации.

Для дальнейших предложений на настройках, которые могут ускорить fmincon, смотрите, что Решатель Занимает слишком много времени. Обратите внимание на то, что некоторые предложения в той теме не применяются из-за ограничений в fmincon генерация кода. Смотрите Генерацию кода в fmincon.

Глобальный минимум

Вы можете хотеть глобальный минимум, не только локальный минимум, как решение. Для предложений смотрите Поиск Меньшего Минимума. Поиск глобального минимума может занять много времени и, как гарантируют, не будет работать.

Смотрите также

| |

Похожие темы