如何利用惩罚法最小化约束违反的二次目标函数

时间:2017-10-31 11:30:00

标签: python mathematical-optimization nonlinear-optimization minimization quadratic-programming

我比较了许多二次规划(QP)求解器,如cvxoptqpoasesosqp,发现osqp对我的应用程序工作得更快更好。

现在,我希望最小化具有等式和不等式约束的不定二次函数,这些约束可能会因各种因素而受到违反。所以我想使用l1惩罚方法惩罚违规约束。

enter image description here 例如,

我修改了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接口可用于解决此类约束违规问题,请告诉我。

1 个答案:

答案 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)添加到目标中。

像往常一样:这只是一种方法(还有其他配方)。