Main Content

問題ベースの錐計画法の制約の記述

solve または prob2struct で 2 次錐問題のために coneprog を呼び出すようにするには、2 次錐制約を次のいずれかのタイプとして指定します。

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

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

ここで、linear expression は最適化変数の線形式を意味し、sum of squares は最適化変数の明示的な二乗和 (sum(x.^2) など) を意味します。coneprog の目的関数は最適化変数において線形でなければなりません。二乗和形式の詳細については、問題ベースの最小二乗法の目的関数の記述を参照してください。

solveprob2struct は、制約のタイプが次の 2 つと等しい形式だった場合は coneprog も呼び出します。

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

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

  • const*norm(linear expression) + constant <= linear expression ただし const > 0

  • sqrt(sum of squares) ではなく (sum of squares)^0.5

たとえば、solve を呼び出したときに次の 2 つの等価な問題の定式化において coneprog が既定のソルバーとなります。

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

2 次制約を異なる記述にした場合 (数学的に等価な 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'

参考

| |

関連するトピック