找出Pyomo模型不可行的原因

oak*_*kca 8 variables constraints feasibility pyomo

我得到了一个包含很多变量和约束的 pyomo 具体模型。

不知何故,我的模型中的变量之一违反了一个约束,这使得我的模型不可行:

WARNING: Loading a SolverResults object with a warning status into model=xxxx;
    message from solver=Model was proven to be infeasible.
Run Code Online (Sandbox Code Playgroud)

有没有办法询问求解器不可行的原因?

例如,假设我有一个名为 的变量x,如果我定义以下 2 个约束,则模型将为 ofc。不可行的。

const1:
    x >= 10

const2:
    x <= 5
Run Code Online (Sandbox Code Playgroud)

我想要实现的目标是指出导致这种不可行性的约束和变量,以便我可以修复它。否则,对于我的大模型来说,很难找出导致这种不可行性的原因。

IN: write_some_comment
OUT: variable "x" cannot fulfill "const1" and "const2" at the same time.
Run Code Online (Sandbox Code Playgroud)

Qi *_*hen 9

许多求解器(包括 IPOPT)会在求解器终止时将变量的值返还给您,即使问题被发现不可行。到那时,你确实有一些选择。

里面有贡献的代码pyomo.util.infeasible可能会帮助你。https://github.com/Pyomo/pyomo/blob/master/pyomo/util/infeasible.py

用法:

from pyomo.util.infeasible import log_infeasible_constraints
...
SolverFactory('your_solver').solve(model)
...
log_infeasible_constraints(model)
Run Code Online (Sandbox Code Playgroud)

  • @JohnCurry 对我来说也有同样的事情。事实证明,如果一个约束不可行,则使用该约束时,具有与该不可行约束相关联的变量的所有其他约束也将变得不可行,因此很难只打印一个特定约束。当使用集合/索引时,情况会更糟,因为约束是在块中处理的。我通常会根据具体情况处理每个约束,依次停用它们(constraint.deactivate()),同时确保模型仍然有意义,直到缩小错误约束的范围。希望这可以帮助。 (3认同)