Python 在Pyomo中使用ipopt,如何查询当前解决方案是否可行?

Python 在Pyomo中使用ipopt,如何查询当前解决方案是否可行?,python,pyomo,nonlinear-optimization,ipopt,Python,Pyomo,Nonlinear Optimization,Ipopt,我有一个ipopt模型,有时会遇到一些小的数值问题。我有一个修正算法,可以修正它们,但可能会导致其他不等式的小违规。我需要一种方法来确定当前解决方案是否可行,而无需手动查询每个变量的边界和约束。我怎样才能在pyomo内做到这一点 我知道有一种方法可以将不可行的约束记录到标准输出中,但这对我没有帮助。我需要我的代码对这些不可行性做出动态反应,比如在纠正后再运行几次迭代 更多信息: 我有一个(相对)小但高度非线性的问题,用Pyomo建模。当某些变量接近零时,该模型有时会遇到ipopt的数值问题。(我

我有一个ipopt模型,有时会遇到一些小的数值问题。我有一个修正算法,可以修正它们,但可能会导致其他不等式的小违规。我需要一种方法来确定当前解决方案是否可行,而无需手动查询每个变量的边界和约束。我怎样才能在pyomo内做到这一点

我知道有一种方法可以将不可行的约束记录到标准输出中,但这对我没有帮助。我需要我的代码对这些不可行性做出动态反应,比如在纠正后再运行几次迭代

更多信息: 我有一个(相对)小但高度非线性的问题,用Pyomo建模。当某些变量接近零时,该模型有时会遇到ipopt的数值问题。(我通过max*uvec=vec对全向量中的单位向量进行建模,并带有一些幅值约束,当向量的幅值接近零时,这会变得非常混乱。)幸运的是,可以从几个关键驱动变量计算模型中的所有内容,因此定义类型约束中的数值不可行性很小(例如,定义单位向量)很容易解决,但这种解决可能会导致对主要问题约束的轻微违反

我尝试过的一些事情:

  • 来自pyomo.util.infasible的log_infasible_constraints函数:仅打印到标准输出,我找不到关于该函数的任何文档(以查看是否有允许将其用于我的需要的标志)。(该函数不返回任何内容,因此我不能简单地检查返回字符串长度。)
  • Update:我找到了源代码,它可以被用来创建一个(笨拙)的解决方案。然而,我怀疑这仍然会错过一些可能导致IPopt考虑一个解决方案不可行的东西(例如其他的容忍标准)。

  • _是否可行=(results.solver.status==SolverStatus.ok)#(其中opt=SolverFactory('ipopt'),results=opt.solve(model)) 这仅在解算后立即起作用。如果解算器的迭代次数不足或解算后变量发生变化,则不会显示当前模型的可行性

  • (目前,由于无法查询模型的可行性,我在每次解决后都会盲目地运行校正步骤。)

    我经常使用不同的NLP解算器来解决单个问题。IPOPT擅长接近解决方案,但活动集解算器可能会产生更精细的解决方案。在这种情况下,首先使用IPOPT解算,然后使用活动集算法(如CONOPT或SNOPT)重新启动可能是有意义的。我经常使用不同的NLP解算器来解决问题单个问题。IPOPT擅长接近解决方案,但活动集解算器可能会产生更精细的解决方案。在这种情况下,首先使用IPOPT解决问题,然后使用活动集算法(如CONOPT或SNOPT)重新启动可能是有意义的。