修改约束的主体而不计算其值

时间:2019-06-01 13:12:53

标签: python pyomo

我正在使用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

1 个答案:

答案 0 :(得分:0)

我发现了错误。

epi_nonlinear_constrs[k]._body = (epi_nonlinear_constrs[k].body - epi_model.alpha_epi)   

我使用了另一个模型nonlinear_constrs[k].body的约束主体,而不是同一模型的约束主体。因此,约束具有模型中未引用的变量。因此,来自求解器的错误消息。