exponenta event banner

Рабочий процесс оптимизации на основе проблем

Примечание

Оптимизация 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).

Предупреждение

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

Базовый пример линейного программирования с использованием смешанного целого см. в разделе Основы линейного программирования с использованием смешанного целого: на основе проблем или видеоверсия Решение проблемы линейного программирования с использованием оптимизации. Нелинейный пример см. в разделе Решение ограниченной нелинейной проблемы на основе проблем. Дополнительные примеры см. в разделах Нелинейная оптимизация на основе проблем, Линейное программирование и Смешанно-целочисленное линейное программирование или Квадратичное программирование и конусное программирование.

См. также

| | | | | |

Связанные темы