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

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

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

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 подходит для целевой функции.

Примечание

Если у вас есть нелинейная функция, которая не является многочленным или рациональным выражением, преобразуйте его в выражение оптимизации при помощи 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
showexpr(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));
showexpr(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, таким образом, эти два выражения сопоставимы.

Примечание

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

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

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

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

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

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

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
showconstr(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))';
showconstr(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 имеют поведение копии указателя. Смотрите Поведение объекта Указателя (MATLAB) и Сравнение Классов Указателя и Значения (MATLAB). Обработайте средние значения поведения копии, что копия OptimizationVariable указывает на оригинал и не имеет независимого существования. Например, создайте переменную x, скопируйте ее в y, затем установите свойство y. Обратите внимание на то, что x берет новое значение свойства.

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

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

| | | | | | |

Похожие темы