python - 从抽象 pyomo 模型实例化具体模型

标签 python mathematical-optimization glpk pyomo

我正在尝试在 Pyomo 5.1.1 中创建一个抽象模型,然后用 python 中的值填充它(即不使用 AMPL 文件)。我基本上遵循 Pyomo documentation example ,但收到“检测到恒定目标”。

import pyomo.environ as oe
model = oe.AbstractModel()
model.I = oe.Set()
model.J = oe.Set()
model.a = oe.Param(model.I,model.J)
model.b = oe.Param(model.I)
model.c = oe.Param(model.J)
model.x = oe.Var(model.J,domain=oe.NonNegativeReals)
def obj_expression(model):
    return oe.summation(model.c,model.x)

model.OBJ = oe.Objective(rule=obj_expression)
def ax_constraint_rule(model,i):
    return sum(model.a[i,j]*model.x[j] for j in model.J) >= model.b[i]

model.AxbConstraint = oe.Constraint(model.I,rule=ax_constraint_rule)

然后,我尝试用实际值初始化该模型

aa = np.array([[1,2,1,4],[5,2,2,4]])
bb = np.array([2,4])
cc = np.array([1,2,4,2])

cmodel = model.create_instance()
cmodel.a.values = aa
cmodel.b.values = bb
cmodel.c.values = cc

opt = oe.SolverFactory("glpk")
results = opt.solve(cmodel)

我收到以下错误:

警告:pyomo.core:检测到恒定目标,用占位符替换以防止求解器失败。 警告:pyomo.core:以 LP 格式编写的空约束 block - 求解器可能会出错 警告:检测到恒定目标,用占位符替换以防止解算器失败。 警告:以 LP 格式编写的空约束 block - 求解器可能会出错

显然我初始化cmodel的方式有问题,但我找不到任何描述Python中初始化的文档。

最佳答案

如果您不需要从 AMPL .dat 文件加载数据,我建议从 ConcreteModel 开始。在这种情况下,不需要将数据存储到 Param 对象中,除非您需要它们是可变的。仍然建议为索引组件创建 Set 对象;否则,将隐式创建 Set 对象,其名称可能与您添加到模型中的组件发生冲突。

通过放置您的ConcreteModel如果您在接受数据作为输入的函数内部进行定义,那么您实际上是在复制 AbstractModel 提供的功能。及其 create_instance方法。例如,

import pyomo.environ as oe

def build_model(a, b, c):
    m = len(b)
    n = len(c)
    model = oe.ConcreteModel()
    model.I = oe.Set(initialize=range(m))
    model.J = oe.Set(initialize=range(n))
    model.x = oe.Var(model.J,domain=oe.NonNegativeReals)

    model.OBJ = oe.Objective(expr= oe.summation(c,model.x))
    def ax_constraint_rule(model,i):
        arow = a[i]
        return sum(arow[j]*model.x[j] for j in model.J) >= b[i]
    model.AxbConstraint = oe.Constraint(model.I,rule=ax_constraint_rule)
    return model

# Note that there is no need to call create_instance on a ConcreteModel
m = build_model(...)
opt = oe.SolverFactory("glpk")
results = opt.solve(m)

此外,建议首先使用 array.tolist() 将所有 Numpy 数组转换为 Python 列表。方法,然后使用它们构建 Pyomo 表达式。 Pyomo 尚未将数组操作的概念内置到其表达式系统中,并且使用 Numpy 数组的方式可能比仅使用 Python 列表慢得多

关于python - 从抽象 pyomo 模型实例化具体模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43803364/

相关文章:

Python 字符串参数解析

python - 预测时如何处理测试数据onehoten编码后的类别不匹配?

algorithm - 类背包优化问题的遗传算法

csv - 将 CSV 数据读入下标集合

python - 你如何在 Winpython 中安装 glpk-solver 和 pyomo

python - 早期需要学习的 Python 的重要语言特性(习语)有哪些

Python运行时错误: maximum recursion depth exceeded in cmp

parallel-processing - SCIP中线程的使用

python - 从 scipy.optimize.curve_fit 获取与参数估计相关的标准误差

linear-programming - 多重约束的组合优化