我想通过替换消除对pyomo模型中积分变量的线性相等约束。例如,我希望改变模型

python - 消除pyomo模型中的相等约束-LMLPHP

通过代替

python - 消除pyomo模型中的相等约束-LMLPHP(*)



python - 消除pyomo模型中的相等约束-LMLPHP

有没有办法在pyomo模型中执行这种替换?我将能够通过计算形式为y = const_vec + susbtitution_matrix * eta的线性双色子方程组的相应系统的解空间来获得(*),其中在我们的示例中,

const_vec = np.array([1,0,0])
substitution_matrix = np.array([[-1,0],
                                [1,0],
                                [0,1]])

最佳答案

您所描述的内容通常称为“变量汇总”。如您所指出的,有四个基本步骤:


确定要删除的线性等式方程
计算替代图
停用要删除的相等约束
在所有剩余约束条件上替换变量


听起来好像您控制了1和2。对于3,假设您已确定要禁用的约束m.c,则只需调用m.c.deactivate()

对于4,您将需要为其余的约束“ body”表达式生成新的表达式(变量仅出现在主体中,而没有出现在上下限中)。对于当前的Pyomo版本(通过5.4.x),您可以利用clone_expression()进行变量替换。您需要生成一个“替换映射”:一个将所需变量的id()映射到要使用的新表达式的字典。例如:

from pyomo.core.base.expr import clone_expression

m = ConcreteModel()
m.y = Var([1,2,3])
m.eta = Var([1,2])
# ...
m.c = Constraint(expr=m.y[1]**2 + m.y[3]**2 <= 4)
# ...

substitution_map = {
    id(m.y[1]): 1 - m.eta[1],
    id(m.y[2]): m.eta[1],
    id(m.y[3]): m.eta[2],
}
m.c = (m.c.lower, clone_expression(m.c.body, substitute=substitution_map), m.c.upper)


最后,免责声明:


使用这种语法设置约束应该可以在最新的Pyomo版本中使用(我通过5.1进行了测试)
这种方法从技术上违反了当前Pyomo表达式系统中的一种假设(它会生成潜在的“纠缠”表达式:共享公共子树的表达式)。虽然不是“好”,但它不会引起麻烦,除非您执行其他转换/表达式操作。
Pyomo 5.5将具有一个新的表达系统,该系统可能具有操纵/替换变量的不同机制。

10-06 01:43