exponenta event banner

Выражения оптимизации

Что такое выражения оптимизации?

Выражения оптимизации являются полиномиальными или рациональными комбинациями переменных оптимизации.

x = optimvar('x',3,3); % a 3-by-3 variable named 'x'
expr1 = sum(x,1) % add the columns of x, get a row vector
expr2 = sum(x,2) % add the rows of x, get a column vector
expr3 = sum(sum(x.*randn(3))) % add the elements of x multiplied by random numbers
expr4 = randn(3)*x % multiply a random matrix times x
expr5 = sum(sum(x*diag(1:3))) % multiply the columns of x by their column number and sum the result
expr6 = sum(sum(x.*x)) % sum of the squares of all the variables

Выражения оптимизации также являются результатом многих операций MATLAB ® над переменными оптимизации, таких как транспонирование или конкатенация переменных. Список поддерживаемых операций с выражениями оптимизации см. в разделе Поддерживаемые операции с переменными и выражениями оптимизации.

Наконец, выражения оптимизации могут быть результатом применения fcn2optimexpr к функции MATLAB, действующей на переменные оптимизации. Дополнительные сведения см. в разделе Преобразование нелинейной функции в выражение оптимизации.

Функции оптимизации моделирования не позволяют задавать сложные, Inf, или NaN значения. При получении такого выражения с помощью операций это выражение не может быть отображено. См. Выражение содержит Inf или NaN.

Выражения для целевых функций

Целевая функция - это выражение размера 1 на 1.

y = optimvar('y',5,3);
expr = sum(y,2); % a 5-by-1 vector
expr2 = [1:5]*expr;

Выражение expr не подходит для целевой функции, поскольку является вектором. Выражение expr2 подходит для объективной функции.

Примечание

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

Чтобы включить выражение в задачу в качестве целевой функции, используйте точечную нотацию или включите цель при создании задачи.

prob = optimproblem;
prob.Objective = expr2;
% or equivalently
prob = optimproblem('Objective',expr2);

Чтобы создать выражение в цикле, начните с пустого выражения, возвращенного optimexpr.

x = optimvar('x',3,3,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',3,3);
expr = optimexpr;
for i = 1:3
    for j = 1:3
        expr = expr + y(j,i) - x(i,j);
    end
end
show(expr)
  y(1, 1) + y(2, 1) + y(3, 1) + y(1, 2) + y(2, 2) + y(3, 2) + y(1, 3) + y(2, 3) + y(3, 3)
- x(1, 1) - x(2, 1) - x(3, 1) - x(1, 2) - x(2, 2) - x(3, 2) - x(1, 3) - x(2, 3) - x(3, 3)

Можно создавать expr без каких-либо петель:

x = optimvar('x',3,3,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',3,3);
expr = sum(sum(y' - x));
show(expr)
  y(1, 1) + y(2, 1) + y(3, 1) + y(1, 2) + y(2, 2) + y(3, 2) + y(1, 3) + y(2, 3) + y(3, 3)
- x(1, 1) - x(2, 1) - x(3, 1) - x(1, 2) - x(2, 2) - x(3, 2) - x(1, 3) - x(2, 3) - x(3, 3)

Примечание

Если ваша целевая функция является суммой квадратов, и вы хотите solve чтобы распознать его как такового, напишите его как sum(expr.^2), а не как expr'*expr. Внутренний синтаксический анализатор распознает только явные суммы квадратов. Пример см. в разделе Неотрицательные линейные наименьшие квадраты, основанные на проблемах.

Выражения для ограничений и уравнений

Ограничения - это любые два сравнимых выражения, которые включают один из следующих операторов сравнения: ==, <=, или >=. Уравнения - это два сопоставимых выражения, использующих оператор сравнения ==. Сопоставимые выражения имеют одинаковый размер, или одно из выражений должно быть скалярным, что означает размер 1 к 1.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',2,4);
z = optimvar('z');

constr1 = sum(x,2) >= z;

x имеет размер 3-на-2, так что sum(x,2) имеет размер 3 на 1. Это выражение сравнимо с z потому что z является скалярной переменной.

constr2 = y <= z;

y имеет размер 2 на 4. Опять же, y сопоставим с z потому что z является скалярной переменной.

constr3 = (sum(x,1))' <= sum(y,2);

sum(x,1) имеет размер 1-на-2, так что (sum(x,1))' имеет размер 2 на 1. sum(y,2) имеет размер 2 на 1, поэтому два выражения сравнимы.

Примечание

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

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

prob = optimproblem;
prob.Constraints.constr1 = constr1;
prob.Constraints.constr2 = constr2;
prob.Constraints.constr3 = constr3;

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

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq12

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

x = optimvar('x',10,2,'LowerBound',0);
prob = optimproblem('Constraints',sum(x,2) <= 1);

Чтобы создать выражения ограничений или уравнений в цикле, начните с пустого выражения ограничений, возвращаемого optimconstr, optimeq, или optimineq.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',2,4);
z = optimvar('z');
const1 = optimconstr(2);
for i = 1:2
    const1(i) = x(1,i) - x(3,i) + 2*z >= 4*(y(i,2) + y(i,3) + 2*y(i,4));
end
show(const1)
(1, 1)

  x(1, 1) - x(3, 1) + 2*z - 4*y(1, 2) - 4*y(1, 3) - 8*y(1, 4) >= 0

(2, 1)

  x(1, 2) - x(3, 2) + 2*z - 4*y(2, 2) - 4*y(2, 3) - 8*y(2, 4) >= 0

Можно создавать const1 без каких-либо петель.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',2,4);
z = optimvar('z');
const1 = x(1,:) - x(3,:) + 2*z >= 4*(y(:,1) + y(:,3) + 2*y(:,4))';
show(const1)
(1, 1)

  x(1, 1) - x(3, 1) + 2*z - 4*y(1, 1) - 4*y(1, 3) - 8*y(1, 4) >= 0

(1, 2)

  x(1, 2) - x(3, 2) + 2*z - 4*y(2, 1) - 4*y(2, 3) - 8*y(2, 4) >= 0

Совет

Для лучшей производительности следует включать границы переменных в определения переменных, а не в выражения ограничений. Кроме того, производительность обычно повышается при создании ограничений без использования контуров. См. раздел Создание проблем эффективной оптимизации.

Внимание

Каждое выражение ограничения в проблеме должно использовать одно и то же сравнение. Например, следующий код приводит к ошибке, поскольку cons1 использует <= сравнение, cons2 использует >= сравнение, и cons1 и cons2 находятся в одном выражении.

prob = optimproblem;
x = optimvar('x',2,'LowerBound',0);
cons1 = x(1) + x(2) <= 10;
cons2 = 3*x(1) + 4*x(2) >= 2;
prob.Constraints = [cons1;cons2]; % This line throws an error

Избежать этой ошибки можно с помощью отдельных выражений для ограничений.

prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;

Поведение переменных оптимизации

  • OptimizationVariable объекты имеют режим копирования дескриптора. См. раздел Поведение объекта-дескриптора и сравнение классов дескрипторов и значений. Поведение обработки копирования означает, что копия OptimizationVariable указывает на оригинал и не имеет самостоятельного существования. Например, создайте переменную x, скопируйте его в y, затем задайте свойство y. Обратите внимание, что x принимает новое значение свойства.

    x = optimvar('x','LowerBound',1);
    y = x;
    y.LowerBound = 0;
    showbounds(x)
        0 <= x

См. также

| | |

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