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

2024-10-16 22:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我尝试过的一些事情:

  1. 来自pyomo.util.infasible的log_infasible_constraints函数:仅打印到标准输出,我找不到关于该函数的任何文档(以查看是否有允许将其用于我的需要的标志)。(该函数不返回任何内容,因此我不能简单地检查返回字符串长度。)

Update:我找到了在https://github.com/Pyomo/pyomo/blob/master/pyomo/util/infeasible.py上的源代码,它可以被用来创建一个(笨拙)的解决方案。然而,我怀疑这仍然会遗漏一些可能导致IPopt考虑一个解决方案不可行的东西(例如其他的容忍标准)。

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

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


Tags: 方法函数模型内容标准解决方案建模向量