Запишите ограничения для основанного на проблеме конусного программирования

Чтобы гарантировать, что solve или prob2struct вызовы coneprog для задачи конуса второго порядка задайте ограничения конуса второго порядка как один из двух типов:

  • norm(linear expression) + constant <= linear expression

  • sqrt(sum of squares) + constant <= linear expression

Здесь, linear expression означает линейное выражение в переменных оптимизации. sum of squares означает сумму явных квадратов переменных оптимизации, таких как sum(x.^2). Целевая функция для coneprog должна быть линейной в переменных оптимизации. Для получения дополнительной информации о сумме формы квадратов смотрите Запись Целевой Функции для Основанных на Проблеме Наименьших Квадратов.

solve и prob2struct также вызов coneprog если тип ограничения эквивалентен двум перечисленным:

  • linear expression >= sqrt(sum of squares) + constant

  • linear expression >= norm(linear expression) + constant

  • const*norm(linear expression) + constant <= linear expression обеспечивается const > 0

  • (sum of squares)^0.5 вместо sqrt(sum of squares)

Для примера, coneprog является решателем по умолчанию для каждой из следующих двух эквивалентных формулировок задачи при вызове solve.

x = optimvar('x',3,...
    'LowerBound',[-Inf,-Inf,0],...
    'UpperBound',[Inf,Inf,2]);
A = diag([1,1/2,0]);
d = [0;0;1];
f = [-1,-2,0];
probnorm = optimproblem('Objective',f*x);
probsumsq = optimproblem('Objective',f*x);

consnorm = norm(A*x) <= d'*x;
probnorm.Constraints.consnorm = consnorm;
conssumsq = sqrt(sum((A*x).^2)) <= dot(d,x);
probsumsq.Constraints.conssumsq = conssumsq;

optnorm = optimoptions(probnorm);
class(optnorm)
ans =

    'optim.options.ConeprogOptions
optsumsq = optimoptions(probsumsq);
class(optsumsq)
ans =

    'optim.options.ConeprogOptions

Если вы записываете ограничения второго порядка по-разному, например математически эквивалентные sqrt(x'*x), solve вызывает другой решатель, такой как fmincon. В этом случае необходимо поставить solve с начальной точкой, и процесс решения может быть различным (и часто менее эффективным), как в следующем примере.

x = optimvar('x',3,...
    'LowerBound',[-Inf,-Inf,0],...
    'UpperBound',[Inf,Inf,2]);
A = diag([1,1/2,0]);
d = [0;0;1];
f = [-1,-2,0];
prob = optimproblem('Objective',f*x);
cons = sqrt(x'*A'*A*x) <= d'*x;
prob.Constraints.cons = cons;
opt = optimoptions(prob);
class(opt)
ans =

    'optim.options.Fmincon'

См. также

| |

Похожие темы