OptimizationInequality

Ограничения неравенства

Описание

Система координат OptimizationInequality объект содержит ограничение неравенства в терминах OptimizationVariable объекты или OptimizationExpression объекты. Ограничение неравенства использует оператор сравнения <= или >=.

Один оператор может представлять массив неравенств. Для примера можно выразить неравенства, которые каждая строка матрицы переменной x сумм не более одного в этом единичном операторе:

constrsum = sum(x,2) <= 1

Использование OptimizationInequality объекты как ограничения в OptimizationProblem.

Совет

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

Создание

Создайте неравенство, используя выражения оптимизации с оператором сравнения <= или >=.

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

prob = optimproblem;
x = optimvar('x',4,6);
SumLessThanOne = sum(x,2) <= 1;
prob.Constraints.SumLessThanOne = SumLessThanOne;

Можно также создать пустое неравенство оптимизации при помощи optimineq или optimconstr. Как правило, затем вы устанавливаете неравенства в цикл. Для получения примера смотрите Создать Неравенства в Цикл. Однако для наиболее эффективной формулировки задачи избегайте устанавливать неравенство в циклах. См. «Создание эффективных задач оптимизации».

Свойства

расширить все

Имена индексов, заданные как массив ячеек из строк или векторов символов. Для получения информации об использовании имен индексов смотрите Именованный индекс для переменных оптимизации.

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

Это свойство доступно только для чтения.

Переменные оптимизации в объекте, заданные как структура OptimizationVariable объекты.

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

Функции объекта

infeasibilityНарушение ограничений в точке
showОтобразите информацию об объекте оптимизации
writeСохраните описание объекта оптимизации

Примеры

свернуть все

Создайте переменную оптимизации 4 на 6 матрицы именем x.

x = optimvar('x',4,6);

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

constrsum = sum(x,2) <= 1
constrsum = 
  4x1 Linear OptimizationInequality array with properties:

    IndexNames: {{}  {}}
     Variables: [1x1 struct] containing 1 OptimizationVariable

  See inequality formulation with show.

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

show(constrsum)
(1, 1)

  x(1, 1) + x(1, 2) + x(1, 3) + x(1, 4) + x(1, 5) + x(1, 6) <= 1

(2, 1)

  x(2, 1) + x(2, 2) + x(2, 3) + x(2, 4) + x(2, 5) + x(2, 6) <= 1

(3, 1)

  x(3, 1) + x(3, 2) + x(3, 3) + x(3, 4) + x(3, 5) + x(3, 6) <= 1

(4, 1)

  x(4, 1) + x(4, 2) + x(4, 3) + x(4, 4) + x(4, 5) + x(4, 6) <= 1

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

prob = optimproblem;
prob.Constraints.constrsum = constrsum
prob = 
  OptimizationProblem with properties:

       Description: ''
    ObjectiveSense: 'minimize'
         Variables: [1x1 struct] containing 1 OptimizationVariable
         Objective: [0x0 OptimizationExpression]
       Constraints: [1x1 struct] containing 1 OptimizationConstraint

  See problem formulation with show.

Создайте ограничение, что двухэлементная переменная 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;

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

Введенный в R2019b