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

4
我希望在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)

但是它给我抛出了一个错误:求解器不支持SOS级别2的约束条件(我正在使用GLPK)。
从Pyomo文档中我所理解的是,分段函数在相关变量上是一种约束条件,而我正在寻找具有明确给定断点域和功能片段斜率的二次成本函数的线性逼近(例如AMPL提供的内容)。因此,我实际上并不需要SOS2约束条件,但我没有找到其他解决方案,除了通过二进制变量进行建模(这不是我想利用的方法):http://winglpk.sourceforge.net/media/glpk-sos2_02.pdf 对此有什么建议吗?
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接