exponenta event banner

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