exponenta event banner

Ограничения записи для программирования конусов на основе проблем

Обеспечить, чтобы 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'

См. также

| |

Связанные темы