Примечание
Optimization Toolbox™ предоставляет два подхода к решению задач оптимизации одной цели. В этом разделе описывается основанный на подходе , основанном на проблеме. Настройка задачи оптимизации на основе решателя описывает подход, основанный на решателе.
Чтобы решить задачу оптимизации, выполните следующие шаги.
Создайте объект задачи оптимизации при помощи optimproblem
. Объект задачи является контейнером, в котором вы задаете выражение цели и ограничения. Объект задачи оптимизации определяет задачу и любые границы, которые существуют в переменных задачи.
Для примера создайте задачу максимизации.
prob = optimproblem('ObjectiveSense','maximize');
Создайте именованные переменные при помощи optimvar
. Переменная оптимизации является символьной переменной, которую вы используете, чтобы описать цель задачи и ограничения. Включите все границы в определения переменных.
Например, создайте массив 15 на 3 двоичных переменных с именем 'x'
.
x = optimvar('x',15,3,'Type','integer','LowerBound',0,'UpperBound',1);
Определите целевую функцию в объекте задачи как выражение в именованных переменных.
Примечание
Если у вас есть нелинейная функция, которая не состоит из полиномов, рациональных выражений и элементарных функций, таких как exp
, затем преобразуйте функцию в выражение оптимизации при помощи fcn2optimexpr
. Смотрите Преобразование нелинейной функции в выражение оптимизации и Поддерживаемые Операции над Переменными Оптимизации и Выражениями.
При необходимости включите в выражение дополнительные параметры как переменные рабочей области; см. «Передайте дополнительные параметры в основанном на проблеме подходе».
Например, предположим, что у вас есть действительная матрица f
того же размера, что и матрица переменных x
, и целью является сумма записей в f
умножает соответствующие переменные x
.
prob.Objective = sum(sum(f.*x));
Задайте ограничения для задач оптимизации как сравнения в именованных переменных, так и как сравнения выражений.
Примечание
Если у вас есть нелинейная функция, которая не состоит из полиномов, рациональных выражений и элементарных функций, таких как exp
, затем преобразуйте функцию в выражение оптимизации при помощи 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
, как объяснено в разделе «Изменение решателя по умолчанию» или «Опции».
Предупреждение
Основанный на проблеме подход не поддерживает комплексные числа в целевой функции, нелинейных равенствах и нелинейных неравенствах. Если при вычислении функции встретится комплексное число, даже как промежуточное значение, конечный результат может оказаться неправильным.
Для базового примера смешано-целочисленного линейного программирования см. Mixed-Integer Linear Programming Basics: Problem-Based или видео-версию Решить смешано-целочисленную задачу линейного программирования Используя оптимизационное моделирование. Для нелинейного примера см. «Решение ограниченной нелинейной задачи, основанной на проблеме». Для получения более обширных примеров смотрите Основанная на проблеме нелинейная оптимизация, Линейное программирование и Смешано-Целочисленное Линейное Программирование, или Квадратичное Программирование и Конусное Программирование.
fcn2optimexpr
| optimoptions
| optimproblem
| optimvar
| show
| solve
| write