消除pyomo模型中的等式约束

时间:2018-02-28 11:09:40

标签: python mathematical-optimization pyomo

我想通过替换来消除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 个答案:

答案 0 :(得分:1)

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

  1. 确定要删除的线性等式方程
  2. 计算替换地图
  3. 停用要删除的等式约束
  4. 替换所有剩余约束的变量
  5. 听起来你控制了1和2。对于3,假设您确定了要停用的约束m.c,则只需拨打m.c.deactivate()

    对于4,您需要为剩余的约束生成新的表达式" body"表达式(变量仅出现在正文中,而不是出现在下限/上限中)。对于当前的Pyomo版本(通过5.4.x),您可以通过利用clone_expression()执行变量替换。您需要生成一个"替换映射":一个dict,它将您想要的变量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表达系统中的一个假设(它可能会生成潜在的&#34;纠缠的&#34;表达式:共享公共子树的表达式)。虽然不是好的&#34;但它不应该引起麻烦,除非你做其他的转换/表达操作。
    3. Pyomo 5.5将有一个新的表达系统,可能有不同的机制来操纵/替换变量。