使用CVXPY优化时未满足约束条件

时间:2019-12-16 11:08:10

标签: mathematical-optimization linear-programming cvxpy

使用CVXPY的cp.Maximize功能最大化重量和得分的总和。添加了约束,即w不能大于零,但失败。

import cvxpy as cp
score = [0.5322351127,0.3196822284,0.5692263923,0.02034915925,0.2286454903,0.9427046072,0.348096277,0.9307845065,0.3239363128,0.7505620803,0.0594313546,0.3672346647,0.4161681319]
w = cp.Variable(13)
ret = score*w 
prob = cp.Problem(cp.Maximize(ret), [cp.sum(w) == 1, w >= 0])
prob.solve(verbose=True)
print(w.value)
print(sum(w.value))

输出看起来像:


-----------------------------------------------------------------
           OSQP v0.6.0  -  Operator Splitting QP Solver
              (c) Bartolomeo Stellato,  Goran Banjac
        University of Oxford  -  Stanford University 2019
-----------------------------------------------------------------
problem:  variables n = 13, constraints m = 14
          nnz(P) + nnz(A) = 26
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.60, max_iter = 10000
          check_termination: on (interval 25),
          scaling: on, scaled_termination: off
          warm start: on, polish: on, time_limit: off

iter   objective    pri res    dua res    rho        time
   1  -1.7357e+01   7.24e+00   9.45e+01   1.00e-01   1.51e-04s
 200  -9.4307e-01   5.73e-05   4.29e-05   1.29e+00   6.91e-04s
 300  -9.4280e-01   1.44e-05   1.61e-05   2.31e-01   9.48e-04s
plsh  -9.4270e-01   2.78e-23   5.23e-17   --------   1.12e-03s

status:               solved
solution polish:      successful
number of iterations: 300
optimal objective:    -0.9427
run time:             1.12e-03s
optimal rho estimate: 2.12e-01

[-1.71355380e-28 -1.71128890e-28 -1.71393898e-28 -1.70811497e-28
 -1.71033364e-28  1.00000000e+00 -1.71159705e-28  1.38776160e-23
 -1.71133513e-28  2.77554040e-23 -1.70853097e-28 -1.71179735e-28
 -1.71232120e-28]
1.0

显然体重为负。

1 个答案:

答案 0 :(得分:0)

结果尽可能好。否定条目接近于零->科学计数法(具有很高的准确性)。

一些(更高级的)提示:

  • 您的问题非常琐碎,与具有更多假设的方法相比,大多数cvxpy的求解器在准确性方面将不具有竞争力!

      您的问题可以表示为LP
      • 基于单纯形的lp-solver将为您提供基本可行的解决方案,而您的接近零的值将为实零值
      • (对于疯狂的人甚至有合理的单纯形实现)
  • 尽管cvxpy可能认为此问题与lp兼容,但是它的基本安装并未带来基于单纯形的lp-solver
      在cvxpy中可以使用
    • glpk和clp / cbc(领先的开源LP / MIP求解器),但安装时需要格外小心(已记录!)
    • cvxpy中的某些求解器(例如ECOS)是内点求解器(二阶),它们:
      • 非常非常准确
      • 但是:它们近似求解(迭代),不会提供基本可行的解决方案
        • 没有额外的基于单纯形的交叉,将几乎为零
    • 在这里,cvxpy甚至选择了基于ADMM的求解器(一阶!),其精度通常比内点求解器低(且健壮性较低);通常针对效果
      • 这些也是迭代的,将逼近导致接近零的解决方案

这对您而言意味着:

  • 要么接受这种行为,然后在后处理(例如舍入)中关心它,
  • 在GLPK或CLP / CBC(或某些广告)中安装cvxpy,并确保使用其中之一
  • 不要使用cvxpy;但是隐藏的魔法少(免责声明:cvxpy很棒!但这不是灵丹妙药)
相关问题