如何在 Pyomo 中编写分段线性目标函数

Posted

技术标签:

【中文标题】如何在 Pyomo 中编写分段线性目标函数【英文标题】:how to write piecewise linear objective function in Pyomo 【发布时间】:2020-02-06 18:16:02 【问题描述】:

我想在 Pyomo 中创建一个在其目标函数中具有分段线性函数的线性模型。 我设法创建了以下代码:

model = AbstractModel()
breakpoints = [-5,0,5]
values = [10,0, 10]
model.X = Var(bounds=(-5,5))
model.Y= Var(bounds=(0,10))

def pw(x):
    return x**2

model.Z = Piecewise(model.Y, model.X, pw_constr_type='EQ', pw_pts=[-5, 0, 5], f_rule=lambda model,x: pw(x))

model.obj = Objective(rule = lambda model: model.Y, sense=minimize)
instance = model.create_instance()
opt.solve(instance)

但它给我一个错误:Solver does not support SOS level 2 constraints(我正在使用 GLPK)。

到目前为止,我从 Pyomo 文档中了解到,分段函数是对相关变量的一种约束——而我正在寻找具有在域中明确给出断点和函数片段斜率的二次成本函数的线性逼近(类似于例如,AMPL 提供)。因此,我实际上并不需要 SOS2 约束,但除了通过二进制变量对其进行建模(我不想使用)之外,我没有找到任何其他解决方案:http://winglpk.sourceforge.net/media/glpk-sos2_02.pdf

有什么建议吗?

【问题讨论】:

【参考方案1】:

好的,我想我找到了答案!我使用一组附加变量和约束来实现分段线性函数,如下所示: http://yetanothermathprogrammingconsultant.blogspot.com/2015/10/piecewise-linear-functions-in-mip-models.html

唯一的问题是求解时间显着增加,但该解决方案可在 GLPK 上运行(我猜是任何其他求解器)。

【讨论】:

以上是关于如何在 Pyomo 中编写分段线性目标函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyomo 中声明目标函数和约束(抽象模型)

如何在pyomo的目标函数中使用最小值和最大值

如何在 pyomo 中使用/选择/安装混合整数非线性求解器

如何在 Winpython 中安装 glpk-solver 和 pyomo

多目标优化示例 Pyomo

急!!如何用matlab语言编写一个用牛顿迭代法求解经过有限差分法处理过的非线性方程组