Wie wir in Geoffs Antwort sehen, ist dies ein sehr einfaches quadratisch beschränktes Problem oder allgemeiner ein Kegelprogramm zweiter Ordnung. Wenn Sie keine extremen Leistungsanforderungen oder enormen Abmessungen haben, funktioniert die Lösung mit einem nichtlinearen Standardlöser in der quadratischen Form oder mit einem SOCP-Löser in der Normformulierung einwandfrei fein.‖ z ‖ ≤ 1zTz≤1∥z∥≤1
Wenn Sie die Leistung verbessern müssen, gibt es Methoden, um die Einzelkegelfunktion auszunutzen. Hier ist ein Beispiel
SIAM J. Optim., 17 (2), 459–484. (26 Seiten) Eine aktive Setzmethode für Einzelkegelprogramme zweiter Ordnung E. Erdougan und G. Iyengar
Ich möchte darauf hinweisen, dass das Ersetzen der Norm durch eine 1-Norm wahrscheinlich nicht gut funktioniert. Die quadratische Norm hat ihren Ursprung im geometrischen Hintergrund dieses Problems (was ich als Finden eines Vektors interpretiere, der den kleinsten Winkel zu einem gegebenen Satz von Vektoren hat).
Interessanterweise scheint eine QP-Annäherung des Problems sehr gut zu funktionieren. Entfernen Sie die quadratische Einschränkung und fügen Sie dem Ziel stattdessen eine Strafe . Es würde mich nicht wundern, wenn es möglich ist, etwas darüber zu beweisen.αzTz
Im folgenden Code, der mit YALMIP (Disclaimer, von mir entwickelt) in MATLAB implementiert wurde und CPLEX als Löser verwendet, liegt der durchschnittliche Abstand zwischen dem wahren und dem der mit den QP-Heuristiken berechnet wurde, in der Größenordnung von , während der Abstand zur Lösung von der LP-Formulierung (1-Norm) in der Größenordnung von .z 10 - 6 10 - 1zz10−610−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
Schließlich könnte die Verwendung geometrischer Erkenntnisse zu einem viel besseren Ansatz zur Lösung dieses Problems führen. Sie suchen im Wesentlichen nach einem besonders definierten Zentrum einer Reihe von Punkten auf der Einheitskugel.