R中二次规划的错误解决方案
Wrong solution of quadratic programming in R
我正在尝试使用包 osqp 解决 R 中的二次规划。然而,结果看起来错得离谱。
重现此处所附示例的代码:(objective函数是最小化
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()
这是模型的输出,显示最优值为0.7
但是,如果使用最优解插入 objective 函数,它会给出 1.018556
#this should be the final objective value after solving
0.5*t(res<span class="math-container">$x)%*%P%*%res$</span>x+t(c(0,1,1))%*%res$x
#the solution
res$x
#0.6261887 0.3500000 0.3500000
更重要的是,这不是最优解。如果我仔细观察这个解决方案,我可以找到另一个答案,它的 objective 函数更小,值为 0.5,0.1,0.6
我不确定我做错了什么。
感谢您提前提出任何建议!
我试图欺骗 OQSP(在 python)给出你的结果。
我一开始怀疑是alpha
不过好像没什么区别。
另一件事是迭代次数,它可能在 25 次迭代后没有收敛,但在那种情况下我不希望 objective 为 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 ])
我正在尝试使用包 osqp 解决 R 中的二次规划。然而,结果看起来错得离谱。
重现此处所附示例的代码:(objective函数是最小化
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()
这是模型的输出,显示最优值为0.7
但是,如果使用最优解插入 objective 函数,它会给出 1.018556
#this should be the final objective value after solving
0.5*t(res<span class="math-container">$x)%*%P%*%res$</span>x+t(c(0,1,1))%*%res$x
#the solution
res$x
#0.6261887 0.3500000 0.3500000
更重要的是,这不是最优解。如果我仔细观察这个解决方案,我可以找到另一个答案,它的 objective 函数更小,值为 0.5,0.1,0.6 我不确定我做错了什么。
感谢您提前提出任何建议!
我试图欺骗 OQSP(在 python)给出你的结果。
我一开始怀疑是alpha
不过好像没什么区别。
另一件事是迭代次数,它可能在 25 次迭代后没有收敛,但在那种情况下我不希望 objective 为 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 ])