使用CVXPY进行优化时未满足约束

问题描述 投票:0回答:1

使用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

显然重量为负。

mathematical-optimization linear-programming cvxpy
1个回答
0
投票

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

一些(更高级的)提示:

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

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

      要么接受此行为,然后在后处理中对此进行处理(例如舍入)
  • 安装带有GLPK或CLP / CBC(或某些商业广告)的cvxpy,并确保使用其中之一
  • 不要使用cvxpy;但是隐藏的魔法较少(免责声明:cvxpy很棒!但这不是灵丹妙药)
  • © www.soinside.com 2019 - 2024. All rights reserved.