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

问题描述 投票:2回答:1

我想在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

关于此的任何提示吗?

python pyomo glpk piecewise
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.