如何检查 cvxpy 的 solve() 是否成功?

How to check if cvxpy's solve() is successful?

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

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

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

这种信息总是一些 status-information 由求解器填充的部分。在 cvxpy 的情况下,这被记录在案 here:

所以像这样:

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

是通常的路线。

备注:

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

此外,cvxpy 中的大多数求解器都是 interior-point 类似的求解器(有些甚至是基于 first-order 的求解器),它们会慢慢收敛到一些任意精确的近似解,例如:

  • 您的 simplex-constraint (sum(x) == 1) 可能会因 1e-12
  • 等小 epsilon 而关闭(与 1.0 相比)
  • 某些 non-negative 变量可能会因一些小的 epsilon 为负,例如 1e-12

这是完全正常的(对于这些类型的求解器;使用 simplex-like 求解器或 simplex-based 交叉 post-opt 时情况有所不同)。用户需要注意,他选择的方法通常取决于他的use-case。例如。 post-clipping x = np.clip(x.value, 0.0, np.inf),四舍五入等。

对我来说 problem.status == 'optimal' 没有用,它说当不满足约束条件时它是最优的。这样效果更好。

    result = prob.solve()
    if np.isnan(result):
        print('no solution found')