python - 如何在 Pyomo 中编写分段线性目标函数
问题描述
我想在 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
有什么建议吗?
解决方案
好的,我想我找到了答案!我使用一组附加变量和约束来实现分段线性函数,如下所示:http: //yetanothermathprogrammingconsultant.blogspot.com/2015/10/piecewise-linear-functions-in-mip-models.html
唯一的问题是求解时间显着增加,但该解决方案可在 GLPK 上运行(我猜,任何其他求解器)。
推荐阅读
- javascript - querySelectorAll 和具有相同类的多个元素
- c# - 如何从 TabControl 获取所选 TabItem 的文本块名称
- python - 即使没有断点,Spyder 调试器也会停止
- java - Java 内置 JSON 解析器
- javascript - 未捕获的类型错误:无法读取 null XMLHttpRequest JAVASCRIPT 的属性“项目”
- r - 我对 glm 的 anova 测试的软件 R 有问题
- python - def() Python 中超过 2 条返回规则
- javascript - Angular js代码在使用错误后终止
- rxjs - ngx-select-dropdown 如何包含 debounceTime?
- spring-boot - 当spring boot应用程序在linux中部署为服务时,如何动态传递或指定application.yml?