Примечание
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
, как объяснено в Решателе Значения по умолчанию Изменения или Опциях.
Предупреждение
Основанный на проблеме подход не поддерживает комплексные числа в целевой функции, нелинейных равенствах и нелинейных неравенствах. Если при вычислении функции встретится комплексное число, даже как промежуточное значение, конечный результат может оказаться неправильным.
Для основного смешано-целочисленного линейного примера программирования смотрите Смешано-целочисленные Линейные Основы Программирования: основанный на проблеме или видео версия Решают Смешано-целочисленную Задачу линейного программирования Используя Моделирование Оптимизации. Для нелинейного примера смотрите, Решают Ограниченную Нелинейную задачу, Основанную на проблеме. Для более обширных примеров смотрите Основанную на проблеме Нелинейную Оптимизацию, Линейное Программирование и Смешано-целочисленное Линейное Программирование, или Квадратичное программирование и Коническое Программирование.
fcn2optimexpr
| optimoptions
| optimproblem
| optimvar
| show
| solve
| write