首页 > 解决方案 > 使用 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 内核中析取模型的好方法?

标签: python-3.xbinarylinear-programmingpyomo

解决方案


我对 pyomo.gdp 进行了部分重写,可以在公共 github 分支上提供(可能有效,但缺乏测试)。但是,我厌倦了在这样的重写上投入更多时间,因为更好的方法是在内核之上重新实现标准 pyomo.environ api,这将使所有扩展兼容。

话虽如此,如果有合作者愿意分享一些开发和测试,我很乐意帮助完成我已经开始的 kernel-gdp 版本。如果你想进一步讨论这个问题,最好在 Pyomo Github 页面上打开一个问题。


推荐阅读