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

问题描述

我有一个ipopt模型,有时会遇到小的数字问题。我有一个可以修正它们的校正算法,但可能会导致其他不平等的轻微违反。我需要一种无需手动查询每个变量界限和约束即可确定当前解决方案是否可行的方法。我如何在pyomo中做到这一点?

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

更多信息: 我有一个(相对)小但高度非线性的问题,以Pyomo建模。当某些变量接近零时,该模型有时会遭受ipopt的数值问题。 (我正在通过具有一定幅度限制的max * uvec = vec从完整向量建模单位向量,当向量的大小接近零时,这会变得很混乱。)幸运的是,可以从关键驱动变量很少,因此可以轻松解决定义类型约束(例如定义单位矢量)中较小的数值不可行问题,但这种解决方案可能会导致对主要问题约束的轻微违反。

我尝试过的一些事情:

  1. 来自pyomo.util.infeasible的log_infeasible_constraints函数:仅打印到标准输出,并且我找不到该函数的任何文档(查看是否有允许它用于我的需要的标志)。 (该函数返回None,所以我不能例如简单地检查返回字符串的长度。)

更新:我在https://github.com/Pyomo/pyomo/blob/master/pyomo/util/infeasible.py找到了源代码,可以对其进行补救以创建(笨重的)解决方案。但是,我怀疑这可能仍然会遗漏一些可能导致ipopt认为不可行的解决方案(例如其他容忍度标准)。

  1. is_feasible =(results.solver.status == SolverStatus.ok)#(其中opt = SolverFactory('ipopt'),而结果= opt.solve(model)) 这仅在解决后立即起作用。如果求解器用尽了迭代次数或在求解后更改了变量,则不能表示当前模型的可行性。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)