我比较了许多二次规划(QP)求解器,如cvxopt,qpoases和osqp,发现osqp对我的应用程序工作得更快更好。
现在,我希望最小化具有等式和不等式约束的不定二次函数,这些约束可能会因各种因素而受到违反。所以我想使用l1惩罚方法惩罚违规约束。
我修改了example,违反了约束条件。
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
显然,这是一个不可行的问题,所以我们需要改变目标函数来惩罚错误。 因此,我需要帮助来制定可以使用osqp的python接口解决的问题。
或者,如果有任何其他python接口可用于解决此类约束违规问题,请告诉我。
答案 0 :(得分:2)
一般来说,abs
函数可能很危险(它们是不可微分的)。解决这个问题的一个标准方法是增加松弛。 E.g。
g(x) <= 0
成为
g(x) <= s
s >= 0
现在为目标添加一个术语mu*s
。
对于
h(x) = 0
一个人可以做到
h(x) = s1 - s2
s1, s2 >= 0
并将mu*(s1+s2)
添加到目标中。
像往常一样:这只是一种方法(还有其他配方)。