2024-09-28 13:20:12 发布
网友
我想通过替换消除pyomo模型中积分变量的线性等式约束。例如,我希望转换模型
通过替换
(*)
到
有没有办法在pyomo模型中执行这样的替换?我将能够通过计算相应的线性丢番图方程组的解空间以y = const_vec + susbtitution_matrix * eta的形式得到(*),在我们的例子中
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()。在
m.c
m.c.deactivate()
对于4,您将希望为剩余的约束“body”表达式生成新的表达式(变量只出现在正文中,而不出现在下界/上界)。对于当前的Pyomo版本(到5.4.x),您可以通过利用clone_expression()来执行变量替换。您需要生成一个“替换映射”:一个dict,它将要使用的变量的id()映射到要使用的新表达式。例如:
body
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和2。对于3,假设您标识了一个要停用的约束
m.c
,只需调用m.c.deactivate()
。在对于4,您将希望为剩余的约束“
body
”表达式生成新的表达式(变量只出现在正文中,而不出现在下界/上界)。对于当前的Pyomo版本(到5.4.x),您可以通过利用clone_expression()
来执行变量替换。您需要生成一个“替换映射”:一个dict,它将要使用的变量的id()
映射到要使用的新表达式。例如:最后,免责声明:
相关问题 更多 >
编程相关推荐