[英]Wrong solution of quadratic programming in R
我正在尝试使用 package osqp 解决 R 中的二次规划。 然而,结果看起来非常错误。
复制这里附上的例子的代码:(目标function是最小化
library(osqp)
library(Matrix)
P <- Matrix(c(1., 0.,0,
0., 1.,0, 0,0,1), 3, 3, sparse = TRUE)
q <- c(0, 1,1)
A <- Matrix(c(1., 1., 0.,
1., 0., 1.,1,0,1), 3, 3, sparse = TRUE)
l <- c(1.2, 0., 0.7)
u <- c(2., 0.8, 0.7)
settings <- osqpSettings(alpha = 1.0,eps_abs = 1.0e-05, eps_rel = 1.0e-05,)
model <- osqp(P, q, A, l, u, settings)
res <- model$Solve()
这是 model 的 output,显示最佳值为 0.7
但是,如果使用最佳解决方案插入目标 function 它给我 1.018556
#this should be the final objective value after solving
0.5*t(res$x)%*%P%*%res$x+t(c(0,1,1))%*%res$x
#the solution
res$x
#0.6261887 0.3500000 0.3500000
更重要的是,这不是最佳解决方案。 如果我观察解决方案,我可以找到另一个答案,目标更小 function 值为 0.5,0.1,0.6 我不确定我做错了什么。
感谢您提前提供任何建议!
我试图欺骗 OQSP(在 python 中)给出你的结果。
我首先怀疑是alpha
,但它似乎没有任何区别。 另一件事是迭代次数,它可能在 25 次迭代后仍未收敛,但在这种情况下,我不希望目标为 0.70000。
import osqp
from scipy.sparse import csr_matrix
P = np.array([[1., 0.,0],
[0., 1.,0],
[0,0,1]]).T
q = np.array([0, 1,1])[None, :];
A = np.array([[1., 1., 0.],
[1., 0., 1.],
[1,0,1]]).T
l = np.array([1.2, 0., 0.7])[:, None]
u = np.array([2., 0.8, 0.7])[:, None]
m = osqp.OSQP()
m.setup(P=csr_matrix(P), A=csr_matrix(A), l=l, u=u, q=q.T,
alpha=1.0, eps_abs = 1.0e-05, eps_rel = 1.0e-05, max_iter=25)
results = m.solve()
这给
x = [0.45492868, 0.35002252, 0.35002252]
已经接近[0.5, 0.35, 0.35]
的最优解。 我注意到的一件事是q%*%x=0.7
。
仔细观察,我发现A
的最后一行是q
,并且相应的约束指定0.7 <= x(1) + x(2) <= 0.7
。 即您的问题的任何有效解决方案都有q'x = 0.7
因此我们得出结论x' P x = 0
内部。
如果我将P
矩阵设置为零,您显示的解决方案非常接近我获得的解决方案
m.setup(P=csr_matrix(P)*0, A=csr_matrix(A), l=l, u=u, q=q.T,
alpha=1.0, eps_abs = 1.0e-05, eps_rel = 1.0e-05, max_iter=100)
results = m.solve()
results.x
-----------------------------------------------------------------
OSQP v0.6.2 - Operator Splitting QP Solver
(c) Bartolomeo Stellato, Goran Banjac
University of Oxford - Stanford University 2021
-----------------------------------------------------------------
problem: variables n = 3, constraints m = 3
nnz(P) + nnz(A) = 9
settings: linear system solver = qdldl,
eps_abs = 1.0e-05, eps_rel = 1.0e-05,
eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04,
rho = 1.00e-01 (adaptive),
sigma = 1.00e-06, alpha = 1.00, max_iter = 25
check_termination: on (interval 25),
scaling: on, scaled_termination: off
warm start: on, polish: off, time_limit: off
iter objective pri res dua res rho time
1 -9.9950e-03 1.20e+00 7.01e+01 1.00e-01 5.74e-05s
25 7.0000e-01 2.66e-15 6.94e-18 1.00e-01 1.07e-03s
status: solved
number of iterations: 25
optimal objective: 0.7000
run time: 1.79e-03s
optimal rho estimate: 1.70e+00
array([0.62618873, 0.35 , 0.35 ])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.