如何检查 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')
这是我第一次尝试使用 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')