optimconstr

Создайте пустой массив ограничений оптимизации

Описание

Использовать optimconstr для инициализации набора выражений ограничений.

Совет

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

пример

constr = optimconstr(N) создает N-by-1 массив пустых ограничений оптимизации. Использование constr чтобы инициализировать цикл, который создает выражения ограничений.

пример

constr = optimconstr(cstr) создает массив пустых ограничений оптимизации, индексируемых cstr, массив ячеек из векторов символов или строковых векторов.

Если cstr 1-байт- n cstr, где n cstr количество элементов cstr, затем constr также 1-байт- n cstr. В противном случае constr является n cstr-by-1.

constr = optimconstr(cstr1,N2,...,cstrk) или constr = optimconstr({cstr1,cstr2,...,cstrk}) или constr = optimconstr([N1,N2,...,Nk]), для любой комбинации cstr и N аргументы, создает n cstr1-by- N2-by-... -by- n cstrk массив пустых ограничений оптимизации, где n cstr количество элементов в cstr.

Примеры

свернуть все

Создайте ограничения для модели инвентаризации. Запас товаров в начале каждого периода равен запасу в конце предыдущего периода. В течение каждого периода запас увеличивается на buy и уменьшается на sell. Переменная stock - запас в конце периода.

N = 12;
stock = optimvar('stock',N,1,'Type','integer','LowerBound',0);
buy = optimvar('buy',N,1,'Type','integer','LowerBound',0);
sell = optimvar('sell',N,1,'Type','integer','LowerBound',0);
initialstock = 100;

stockbalance = optimconstr(N,1);

for t = 1:N
    if t == 1
        enterstock = initialstock;
    else
        enterstock = stock(t-1);
    end
    stockbalance(t) = stock(t) == enterstock + buy(t) - sell(t);
end

show(stockbalance)
(1, 1)

  -buy(1) + sell(1) + stock(1) == 100

(2, 1)

  -buy(2) + sell(2) - stock(1) + stock(2) == 0

(3, 1)

  -buy(3) + sell(3) - stock(2) + stock(3) == 0

(4, 1)

  -buy(4) + sell(4) - stock(3) + stock(4) == 0

(5, 1)

  -buy(5) + sell(5) - stock(4) + stock(5) == 0

(6, 1)

  -buy(6) + sell(6) - stock(5) + stock(6) == 0

(7, 1)

  -buy(7) + sell(7) - stock(6) + stock(7) == 0

(8, 1)

  -buy(8) + sell(8) - stock(7) + stock(8) == 0

(9, 1)

  -buy(9) + sell(9) - stock(8) + stock(9) == 0

(10, 1)

  -buy(10) + sell(10) - stock(9) + stock(10) == 0

(11, 1)

  -buy(11) + sell(11) - stock(10) + stock(11) == 0

(12, 1)

  -buy(12) + sell(12) - stock(11) + stock(12) == 0

Включите ограничения в задачу.

prob = optimproblem;
prob.Constraints.stockbalance = stockbalance;

Вместо использования цикла можно создать те же ограничения при помощи матричных операций над переменных.

tt = ones(N-1,1);
d = diag(tt,-1); % shift index by -1
stockbalance2 = stock == d*stock + buy - sell;
stockbalance2(1) = stock(1) == initialstock + buy(1) - sell(1);

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

show(stockbalance2)
(1, 1)

  -buy(1) + sell(1) + stock(1) == 100

(2, 1)

  -buy(2) + sell(2) - stock(1) + stock(2) == 0

(3, 1)

  -buy(3) + sell(3) - stock(2) + stock(3) == 0

(4, 1)

  -buy(4) + sell(4) - stock(3) + stock(4) == 0

(5, 1)

  -buy(5) + sell(5) - stock(4) + stock(5) == 0

(6, 1)

  -buy(6) + sell(6) - stock(5) + stock(6) == 0

(7, 1)

  -buy(7) + sell(7) - stock(6) + stock(7) == 0

(8, 1)

  -buy(8) + sell(8) - stock(7) + stock(8) == 0

(9, 1)

  -buy(9) + sell(9) - stock(8) + stock(9) == 0

(10, 1)

  -buy(10) + sell(10) - stock(9) + stock(10) == 0

(11, 1)

  -buy(11) + sell(11) - stock(10) + stock(11) == 0

(12, 1)

  -buy(12) + sell(12) - stock(11) + stock(12) == 0

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

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

meals = ["breakfast","lunch","dinner"];
constr = optimconstr(meals);
foods = ["cereal","oatmeal","yogurt","peanut butter sandwich","pizza","hamburger",...
    "salad","steak","casserole","ice cream"];
diet = optimvar('diet',foods,meals,'LowerBound',0);
calories = [200,175,150,450,350,800,150,650,350,300]';
for i = 1:3
    constr(i) = diet(:,i)'*calories <= 250*i;
end

Проверьте ограничение на dinner.

show(constr("dinner"))
  200*diet('cereal', 'dinner') + 175*diet('oatmeal', 'dinner')
+ 150*diet('yogurt', 'dinner')
+ 450*diet('peanut butter sandwich', 'dinner') + 350*diet('pizza', 'dinner')
+ 800*diet('hamburger', 'dinner') + 150*diet('salad', 'dinner')
+ 650*diet('steak', 'dinner') + 350*diet('casserole', 'dinner')
+ 300*diet('ice cream', 'dinner') <= 750

Входные параметры

свернуть все

Размер ограничительной размерности, заданный как положительное целое число.

  • Размер constr = optimconstr(N) является N-by-1.

  • Размер constr = optimconstr(N1,N2) является N1-by- N2.

  • Размер constr = optimconstr(N1,N2,...,Nk) является N1-by- N2-by-... -by- Nk.

Пример: 5

Типы данных: double

Имена для индексации, заданные как массив ячеек из векторов символов или строковый вектор.

Пример: {'red','orange','green','blue'}

Пример: ["red";"orange";"green";"blue"]

Типы данных: string | cell

Выходные аргументы

свернуть все

Ограничения, возвращенные как пустые OptimizationConstraint массив. Использование constr чтобы инициализировать цикл, который создает выражения ограничений.

Для примера:

x = optimvar('x',8);
constr = optimconstr(4);
for k = 1:4
    constr(k) = 5*k*(x(2*k) - x(2*k-1)) <= 10 - 2*k;
end

Ограничения

  • Каждое выражение ограничения в задаче должно использовать одно и то же сравнение. Например, следующий код приводит к ошибке, потому что 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;

Совет

  • Обычно более эффективно создавать ограничения векторизованными выражениями, а не циклами. См. «Создание эффективных задач оптимизации».

  • Вы можете использовать optimineq вместо optimconstr для создания выражений неравенства. Точно так же можно использовать optimeq вместо optimconstr для создания выражений равенства.

Введенный в R2017b
Для просмотра документации необходимо авторизоваться на сайте