Optimization Toolbox™ обеспечивает два подхода для решения задач оптимизации одной цели. Эта тема описывает подход, основанный на проблеме. Настройка Задачи Оптимизации на Основе Решателя описывает основанный на решателе подход.
Чтобы решить задачу оптимизации, выполните следующие шаги.
Создайте объект задачи оптимизации при помощи optimproblem
. Объект задачи является контейнером, в котором вы задаете выражение цели и ограничения. Объект задачи оптимизации описывает задачу и любые границы, которые существуют в переменных задачи.
Например, создайте проблему максимизации.
prob = optimproblem('ObjectiveSense','maximize');
Создайте именованные переменные при помощи optimvar
. Переменная оптимизации является символьной переменной, которую вы используете, чтобы описать проблемную цель и ограничения. Включайте любые границы в определения переменной.
Например, создайте 15 3 массив бинарных переменных под названием 'x'
.
x = optimvar('x',15,3,'Type','integer','LowerBound',0,'UpperBound',1);
Задайте целевую функцию в объекте задачи как выражение в именованных переменных.
Если у вас есть нелинейная функция, которая не является многочленным или рациональным выражением, преобразуйте его в выражение оптимизации при помощи fcn2optimexpr
. Смотрите преобразуют нелинейную функцию в выражение оптимизации.
Например, примите, что у вас есть действительный матричный f
одного размера с матрицей переменных x
, и цель является суммой записей в f
времена соответствующие переменные x
.
prob.Objective = sum(sum(f.*x));
Задайте ограничения для задач оптимизации или как сравнения в именованных переменных или как сравнения выражений.
Если у вас есть нелинейная функция, которая не является многочленным или рациональным выражением, преобразуйте его в выражение оптимизации при помощи fcn2optimexpr
. Смотрите преобразуют нелинейную функцию в выражение оптимизации.
Например, примите что сумма переменных в каждой строке x
должен быть один, и сумма переменных в каждом столбце должна быть не больше, чем один.
onesum = sum(x,2) == 1; vertsum = sum(x,1) <= 1; prob.Constraints.onesum = onesum; prob.Constraints.vertsum = vertsum;
Для нелинейных проблем, устанавливает начальная точка как структура, поля которой являются именами переменных оптимизации. Например:
x0.x = randn(size(x));
x0.y = eye(4); % Assumes y is a 4-by-4 variable
Решите задачу при помощи solve
.
sol = solve(prob);
% Or, for nonlinear problems,
sol = solve(prob,x0)
В дополнение к этим основным шагам можно рассмотреть описание задачи прежде, чем решить задачу при помощи show
или write
. Установите опции для solve
при помощи optimoptions
, как объяснено в Решателе Значения по умолчанию Изменения или Опциях.
Подход, основанный на проблеме не поддерживает комплексные числа в целевой функции, нелинейных равенствах или нелинейных неравенствах. Если функциональное вычисление имеет комплексное число, как раз когда промежуточное значение, конечный результат может быть неправильным.
Для основного смешано-целочисленного линейного примера программирования смотрите Смешано-целочисленные Линейные Основы Программирования: основанный на проблеме или видео версия Решают Смешано-целочисленную Задачу линейного программирования Используя Моделирование Оптимизации. Для нелинейного примера смотрите, Решают Ограниченную Нелинейную задачу, Основанную на проблеме. Для более обширных примеров смотрите Основанную на проблеме Нелинейную Оптимизацию, Линейное Программирование и Смешано-целочисленное Линейное Программирование или Квадратичное программирование.
fcn2optimexpr
| optimoptions
| optimproblem
| optimvar
| show
| solve
| write