代码之家  ›  专栏  ›  技术社区  ›  Christoph Neumann

消除pyomo模型中的等式约束

  •  1
  • Christoph Neumann  · 技术社区  · 7 年前

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

    enter image description here

    通过替换

    enter image description here ( * )

    enter image description here

    有没有办法在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 回复  |  直到 7 年前
        1
  •  1
  •   jsiirola    7 年前

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

    1. 确定要删除的线性等式
    2. 计算替换贴图
    3. 停用要删除的相等约束
    4. 替换所有剩余约束上的变量

    听起来好像你控制了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)
    

    最后,免责声明:

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