python-3.x - 使用 Pyomo Kernel 解决析取模型
问题描述
我正在尝试使用 pyomo 内核而不是 environ 在“Pyomo - Python 中的优化建模”一书中重新创建一个问题。该问题在第 163 页上,称为“9.4 半连续变量的混合问题”。对于那些没有这本书的人,这里是:
以下模型说明了一个简单的混合问题,其中包含三个半连续变量(x1、x2、x3),这些变量表示为满足体积约束而混合的数量。在这个简单的例子中,源的数量被最小化了:
from pyomo.environ import *
from pyomo.gdp import *
L = [1,2,3]
U = [2,4,6]
index = [0,1,2]
model = ConcreteModel()
model.x = Var(index, within=Reals, bounds=(0,20))
# Each disjunct is a semi-continuous variable
# x[k] == 0 or L[k] <= x[k] <= U[k]
def d_rule(block, k, i):
m = block.model()
if i == 0:
block.c = Constraint(expr=m.x[k] == 0)
else:
block.c = Constraint(expr=L[k] <= m.x[k] <= U[k])
model.d = Disjunct(index, [0,1], rule=d_rule)
# There are three disjunctions
def D_rule(block, k):
model = block.model()
return [model.d[k,0], model.d[k,1]]
model.D = Disjunction(index, rule=D_rule)
# Minimize the number of x variables that are nonzero
model.o = Objective(expr=sum(model.d[k,1].indicator_var for k in index))
# Satisfy a demand that is met by these variables
model.c = Constraint(expr=sum(model.x[k] for k in index) >= 7)
我需要重构这个问题以在 pyomo 内核中工作,但内核尚未与用于将析取模型转换为线性模型的 pyomo gdp 兼容。有没有人遇到过这个问题,如果是这样,您是否找到了解决 pyomo 内核中析取模型的好方法?
解决方案
我对 pyomo.gdp 进行了部分重写,可以在公共 github 分支上提供(可能有效,但缺乏测试)。但是,我厌倦了在这样的重写上投入更多时间,因为更好的方法是在内核之上重新实现标准 pyomo.environ api,这将使所有扩展兼容。
话虽如此,如果有合作者愿意分享一些开发和测试,我很乐意帮助完成我已经开始的 kernel-gdp 版本。如果你想进一步讨论这个问题,最好在 Pyomo Github 页面上打开一个问题。
推荐阅读
- javascript - jQuery.eCalendar() - 用于事件循环
- android - 使用“重建项目”与“运行”时不同的 APK 内容
- r - 如何根据关键变量合并具有部分相同列名的多个数据框?
- hyperledger-fabric - 链码实例化静默失败
- python - 'ValueError: 未设置必需参数' Django 应用程序遵循 AWS 配置和 Heroku 部署
- sttwitterapi - TweetR 包中搜索词的大小写敏感性
- codenameone - 代号一 - 设计师自动放大图像
- r - 如何从 OpenCPU R 函数内部设置自定义 HTTP 状态代码
- selenium - 构建你自己的 SeleniumHQ/docker-selenium 的 docker 镜像
- orientdb - 迁移 dockerized nexus 3.from 不同虚拟机的问题