是否可以在要由pyomo求解器求解的目标函数中包含abs()?

时间:2019-06-11 00:58:18

标签: python pyomo

我收到此错误:

ValueError: Cannot load a SolverResults object with bad status: error " 

在目标函数中使用abs()函数时。

1 个答案:

答案 0 :(得分:0)

在开始之前,我将使用“非负”和“非正”来代替“正”和“负”。这是因为在Pyomo中,两者之间是有区别的,因为“正”和“负”域排除 0,而“非正”和“非负”域包括了)。

假设您具有以下目标函数:

def obj_f(model):
    return abs(model.x)

其中model.x是模型中的变量,可以采用正值和负值。

为了使模型正常工作,可以将model.x分成两个变量,例如model.x_posmodel.x_neg。这意味着您将为model.xmodel.x_pos)的正数拥有一个变量,为model.xmodel.x_neg)的负数拥有另一个变量。

model.x_pos仅可采用非负值,而model.x_neg仅可采用非正值。因此,model.x可以转换为model.x_pos + model.x_neg。您将必须添加约束以确保model.x_pos始终为非负数,并确保model.x_neg始终为非正数。这可以通过在创建变量时设置域或向模型添加更多约束来完成。

这样,您可以通过以下方式制定目标函数:

def obj_f(model):
    return model.x_pos - model.x_neg

(注意:由于model.x_neg变量已经为负或0,因此我们必须在其前面使用-标记使其为正)

这应该等效于在目标函数中使用abs()函数。