我正在使用pyomo 5.3在python 3.6中编程
我希望修改非索引约束的主体(如果它不是我要求的标准格式)。问题在于,当从主体中减去时,会计算出特定点处的约束值。但是,我需要函数形式的主体,因为我必须构造一个目标,该目标是导致最小-最大问题的所有非线性约束的最大值。
我试图直接设置传递给函数的约束的主体,但得到的输出表明无法设置属性。有设置约束主体的功能吗?
这是标准化约束的功能
def constr_value_body(constr):
"""Rearranges a constraint at some point x to g_i(x) <= 0 and computes g_i(x)"""
if is_leq_constr(constr):
g_val = constr.body() - constr.upper()
else:
g_val = constr.lower() - constr.body()
constr.body = g_val
return constr.body
然后,我打算将所有正文保存到一个数组中。我会遇到与计算值而不是在此处再次创建函数相同的问题吗?
def g_max_obj(m):
"""Returns the maximum of all constraint functions of a pyomo model m as a function,
implicitly rearranging all constraints to g_i(x) <= 0"""
nonlinear_constrs = []
for constr in m.component_objects(Constraint):
if not (constr.body.polynomial_degree() in [0, 1]):
nonlinear_constrs.append(constr)
# Note that equality constraints are always fulfilled, as they are assumed
# to be linear and to only contain continuous variables and are not changed when rounding.
if len(nonlinear_constrs) >= 2:
g_body = np.zeros(len(nonlinear_constrs))
for idx, constr in enumerate(nonlinear_constrs):
g_body[idx] = constr_value_body(constr)
return g_body
else:
return g_body
此示例中使用的约束为:
m.c42 = Constraint(expr=-0.005*log(m.x40) - m.x81 <= 0)
print(NLP_model.c42.body)
- 0.005*log( x40 ) - x81
这是错误消息
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-19-d2d29443bb29> in <module>
----> 1 print(constr_value_body(NLP_model.c42))
2
3 #print(objectiveBody)
<ipython-input-18-f5a588da39ff> in constr_value_body(constr)
5 else:
6 g_val = constr.lower() - constr.body()
----> 7 constr.body = g_val
8 return constr.body
9
AttributeError: can't set attribute
答案 0 :(得分:0)
我发现了错误。
在
epi_nonlinear_constrs[k]._body = (epi_nonlinear_constrs[k].body - epi_model.alpha_epi)
我使用了另一个模型nonlinear_constrs[k].body
的约束主体,而不是同一模型的约束主体。因此,约束具有模型中未引用的变量。因此,来自求解器的错误消息。