回答:
少し調整して、処方をそのまま使用します。
この問題は二次制約のあるプログラムであり、CPLEXやGurobiなどの高速ソルバーが多数あります。この特定のプログラムは、2次コーンプログラム、半確定プログラム、および凸非線形プログラムでもあるため、これらのソルバーのいずれかを使用することもできます。ユークリッドノルム制約を内積で置き換えた理由は、2つの制約は同等ですが、後者は微分可能ですが、前者は微分可能ではありません。微分できない関数はより高価なアルゴリズムを必要とし、この問題はそのタイプの機械を必要としないので、それを避けるのが最善です。
線形計画法ソルバーは非常に効率的ですが、オプション1を選択します。これは、2次制約付きプログラミングソルバーも非常に効率的で(凸型計画法ソルバーや他のタイプの非線形計画法ソルバーと比較して)、大規模な定式化(少なくとも数十万の決定変数、前回私が文献を見たとき)。公式が驚くほど大きい場合を除き、二次制約付きプログラミングソルバーをシリアルで使用して問題なく、絶対に変更する必要がない限り、公式の標準を変更する必要はありません。
パフォーマンスを向上させる必要がある場合は、シングルコーン機能を利用する方法があります。ここに一例があります
SIAM J. Optim。、17(2)、459–484。(26ページ)シングルコーン2次コーンプログラムのアクティブセット法E. ErdouganおよびG. Iyengar
ノルムを1ノルムに置き換えると、おそらくうまく機能しないことを指摘しておきます。二次ノルムは、この問題の幾何学的背景に起源があります(これは、特定のベクトルのセットに対して最小の角度を持つベクトルを見つけると解釈します)。
z = sdpvar(5,1);
r = sdpvar(1);
err1 = [];
err2 = [];
for i = 1:1000
X = randn(5,10);
Con = [r*sqrt(sum(X.^2,1)) <= z'*X,norm(z,2) <= 1]
sol = solvesdp(Con,-r)
if sol.problem == 0 & double(r)>1e-3
zSOCP = double(z);
Con = [r*sqrt(sum(X.^2,1)) <= z'*X];
sol = solvesdp(Con,-r+0.001*z'*z);
zQP = double(z/norm(double(z)));
err1 = [err1 norm(zQP-zSOCP)];
Con = [r*sqrt(sum(X.^2,1)) <= z'*X, norm(z,1)<=1];
sol = solvesdp(Con,-r);
zLP = double(z/norm(double(z)));
err2 = [err2 norm(zLP-zSOCP)];
end
end
最後に、幾何学的な洞察を使用すると、この問題を解決するためのより優れたアプローチにつながる可能性があります。基本的に、単位球上の一連の点の特に定義された中心を探しています。