提问者:小点点

消除pyomo模型中的等式约束


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

通过替换

有没有办法在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个答案

匿名用户

您所描述的内容通常被称为“变量聚合”如您所述,有四个基本步骤:

  1. 确定要删除的线性等式

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

对于4,您将希望为剩余的Constraint"body"表达式生成新表达式(变量仅出现在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)

最后,免责声明:

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