CVXPY抛出“SolverError”异常的具体原因是什么?

7
我正在使用CVXPY(版本1.0)解决一个二次规划(QP),但通常会出现以下异常:

SolverError: 求解器“xxx”失败。请尝试另一个求解器。

这使得我的程序非常脆弱。我已经尝试了不同的求解器,包括CVXOPT、OSQP、ECOS、ECOS_BB、SCS等。它们都或多或少存在相同的问题。我发现,当我使求解器的停止标准更严格(例如,降低绝对误差容限)时,我更频繁地遇到SolverError,而当我使其更宽松时,SolverError问题就会减弱甚至消失。我还发现,CVXPY抛出SolverError的方式是随机的:如果我多次运行相同的程序,有些运行会出现SolverError,而其他则得到最优结果。
虽然我可以通过尝试更多次并降低停止标准来避免SolverError,但我真的想了解异常背后的具体原因。这个错误并不是很信息化,我不知道该如何提高问题解决的稳健性。它的原因是否特定于求解器?是否为一组明确定义的情况抛出此异常?或者这只是一种说“由于未知原因出现问题”的方式?那些原因可能是什么?

(1) 虽然核心原因相同,但这是特定于求解器的 (2) 这归结为有限内存浮点计算 (3) 内点求解器的理论和实践之间存在很大差异 (4) 这不应该是不确定的(随机是错误的词),但我已经在你的其他问题中指出了原因。 (5) 当需要高精度时,情况变得更加困难:理论意味着在这些系统中对某些值进行发散以解决问题;这将导致某个时间出现错误 (6) 如果可能,请使用商业求解器(您的求解器中没有/微不足道的预处理)。 - sascha
请明确一点:我特别提到了类似于cvxopt、ecos、ecos_bb中使用的IPM方法;但是osqp和scs基于不同的理论。 - sascha
你可能也想在 https://scicomp.stackexchange.com 上提问。 - Rodrigo de Azevedo
据我所知,你是正确的,SolverError非常通用且不太有用。你是否尝试为solve方法设置verbose=True(文档在此)?也许查看求解器输出会给你一些更好的提示。 - rkersh
1个回答

4
如果您遇到了求解器错误,需要调用verbose=True的solve方法以查看详细的错误信息来进行调试,或者使用更加健壮的商业求解器,如MOSEK。求解器错误的具体原因取决于所使用的求解器。常见原因是数值容差过紧或数据缩放不当(即程序中的浮点数动态范围过大)。我将修改SolverError消息以提醒使用verbose=True。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接