首页 > 解决方案 > 如何检查cvxpy的solve()是否成功?

问题描述

这是我第一次尝试使用 cvxpy。我有两个非常简单的约束:

x = cp.Variable((5, 5))
constrains = [cp.sum(x) == 1.0, 0 <= x]

该解决方案大部分时间都有效,同时满足了这两个约束。但有时解决方案只满足第一个约束并吐出负值。我想知道是否有办法让求解器指示它是否成功。

标签: cvxpy

解决方案


这种信息总是由求解器填充的一些状态信息的一部分。在 cvxpy 的情况下,这里记录这一点:

所以像:

problem.solve()
if problem.status == 'optimal':
    ...
else:
    ...   

是通常的路线。

评论:

求解器决定这一点,可行性和最优性决定通常取决于公差(浮点数学!)。

此外,cvxpy 中的大多数求解器都是类似内点的求解器(有些甚至是基于一阶的求解器),它们会慢慢收敛到一些任意准确的近似解,这样:

  • 您的单纯形约束 ( sum(x) == 1) 可能会被一些小的 epsilon 关闭(与 1.0 相比)1e-12
  • 一些非负变量可能会被一些小的 epsilon 为负,例如1e-12

这是完全正常的(对于这些类型的求解器;使用类似单纯形的求解器或基于单纯形的交叉后选择时情况有所不同)。用户需要小心,他选择的方法通常取决于他的用例。例如剪裁后x = np.clip(x.value, 0.0, np.inf)、四舍五入等。


推荐阅读