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

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

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

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. Внутренний синтаксический анализатор распознает только явные суммы квадратов. Для примера смотрите Неотрицательную линейную задачу для метода наименьших квадратов, Основанную на проблеме.

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

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

Смотрите также

| | |

Похожие темы