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