1

Ich habe viele Quadratic Programming (QP) Solver wie cvxopt, qpoases und osqp verglichen und festgestellt, dass osqp schneller und besser für meine Anwendung funktioniert.Minimieren einer quadratischen Zielfunktion mit Constraint-Verletzung mit Penalty-Methode

Nun möchte ich eine unbestimmte quadratische Funktion mit Gleichheits- und Ungleichheitsbedingungen minimieren, die abhängig von verschiedenen Faktoren verletzt werden können. Ich möchte also die Strafmethode l1 verwenden, die die verletzenden Beschränkungen bestraft.

enter image description here zum Beispiel

ich ein example geändert haben, um die Einschränkungen zu verletzen.

import osqp 
import scipy.sparse as sparse 
import numpy as np 

# Define problem data 
P = sparse.csc_matrix([[4., 1.], [1., 2.]]) 
q = np.array([1., 1.]) 
A = sparse.csc_matrix([[1., 0.], [0., 1.], [1., 0.], [0., 1.]]) 
l = np.array([0., 0., 0.2, 1.1]) 
u = np.array([1., 1., 0.2, 1.1]) 

# Create an OSQP object 
prob = osqp.OSQP() 

# Setup workspace and change alpha parameter 
prob.setup(P, q, A, l, u, alpha=1.0) 

# Solve problem 
res = prob.solve() 
print res.x 

Offensichtlich ist dies ein unausführbares Problem, also müssen wir die Zielfunktion ändern, um den Fehler zu bestrafen. Also, ich brauche Hilfe, um dieses Problem zu formulieren, das mit Osqp Python-Schnittstelle gelöst werden kann.

Oder lassen Sie mich bitte wissen, wenn es andere Python-Schnittstelle zur Verfügung steht, um diese Art von Constraint-Verletzung Probleme zu lösen.

Antwort

1

Im Allgemeinen abs Funktionen können gefährlich sein (sie sind nicht differenzierbar). Ein normaler Weg, um damit umzugehen, ist das Hinzufügen von Durchhängen. Z.B.

g(x) <= 0 

wird

g(x) <= s 
s >= 0 

nun einen Begriff mu*s zu dem Ziel hinzuzufügen.

Für

h(x) = 0 

konnte man tun

h(x) = s1 - s2 
s1, s2 >= 0 

und fügen mu*(s1+s2) zum Ziel.

Wie üblich: Dies ist nur ein Ansatz (es gibt andere Formulierungen).

Verwandte Themen