繁体   English   中英

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

[英]how to write piecewise linear objective function in Pyomo

我想在 Pyomo 中创建一个线性 model,它在其目标 function 中具有分段线性 function。 我设法创建了以下代码:

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

有什么建议吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM