optimineq

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

Описание

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

Совет

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

пример

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

пример

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

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

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

Примеры

свернуть все

Создайте ограничение, что двухэлементная переменная x должны лежать в пересечениях множества дисков, центры и радиусы которых находятся в массивах centers и radii.

x = optimvar('x',1,2);
centers = [1 -2;3 -4;-2 3];
radii = [6 7 8];
constr = optimineq(length(radii));
for i = 1:length(constr)
    constr(i) = sum((x - centers(i,:)).^2) <= radii(i)^2;
end

Просмотрите выражения неравенства.

show(constr)
  arg_LHS <= arg_RHS

  where:

    arg1 = zeros([3, 1]);
    arg1(1) = sum((x - extraParams{1}).^2);
    arg1(2) = sum((x - extraParams{2}).^2);
    arg1(3) = sum((x - extraParams{3}).^2);
    arg_LHS = arg1(:);
    arg1 = zeros([3, 1]);
    arg1(1) = 36;
    arg1(2) = 49;
    arg1(3) = 64;
    arg_RHS = arg1(:);

    extraParams{1}:

     1    -2

  extraParams{2}:

     3    -4

  extraParams{3}:

    -2     3

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

constr2 = sum(([x;x;x] - centers).^2,2) <= radii'.^2;

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

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

meals = ["breakfast","lunch","dinner"];
foods = ["cereal","oatmeal","yogurt","peanut butter sandwich","pizza","hamburger",...
    "salad","steak","casserole","ice cream"];
calories = [200,175,150,450,350,800,150,650,350,300]';

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

diet = optimvar('diet',foods,meals,'LowerBound',0);

Установите ограничения неравенства, что каждый прием пищи имеет верхнюю границу с калориями в еде.

constr = optimineq(meals);
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

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

constr2 = diet'*calories <= 250*(1:3)';

Включите соответствующие имена индексов для неравенств путем установки IndexNames свойство.

constr2.IndexNames = {meals, {}};

Отобразите новые неравенства для dinner. Обратите внимание, что они те же, что и предыдущие неравенства.

show(constr2("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 = optimineq(N) является N-by-1.

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

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

Пример: 5

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

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

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

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

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

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

свернуть все

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

Для примера,

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

Совет

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

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

Введенный в R2019b