【问题标题】:Constraints not met while optimising using CVXPY使用 CVXPY 进行优化时未满足的约束
【发布时间】:2019-12-17 06:27:55
【问题描述】:

使用 CVXPY 的 cp.Maximize 功能来最大化权重和分数的 sumproduct。添加了 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】:

    结果是最好的。负数接近于零 -> 科学记数法(高精度)。

    一些(更高级的)提示:

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

      • 您的问题可以表示为 LP
        • 基于单纯形的 lp 求解器将为您提供基本可行的解决方案,并且您的接近零点将是实零点
        • (疯狂的甚至还有合理的单纯形实现)
    • 虽然 cvxpy 可能将此问题识别为与 lp 兼容,但它的基本安装并没有带来基于单工的 lp 求解器
      • glpk 和 clp/cbc(领先的开源 LP/MIP 求解器)可在 cvxpy 中使用,但安装时需要小心(已记录!)
      • cvxpy 中的一些求解器(例如 ECOS)是内点求解器(二阶),其中:
        • 非常非常准确
        • 但是:它们近似于解决方案(迭代)并且不会提供基本可行的解决方案
          • 如果没有额外的基于单纯形的交叉,就会出现接近零的情况
      • 这里 cvxpy 甚至选择了一个基于 ADMM 的求解器(一阶!),它通常比内点求解器更不准确(而且鲁棒性更差);通常以性能为目标
        • 这些也是迭代的,并且会逼近导致接近零的解决方案

    这对你来说意味着:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2015-08-24
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多