首页 > 解决方案 > 抽象pyomo模型中的Parameters和Sets如何操作?

问题描述

我想从抽象 Pyomo 模型中的另一个参数创建一个参数。让我们假设以下示例:

from pyomo.environ import AbstractModel, Param, minimize, Var, NonNegativeIntegers, \
    NonNegativeReals, RangeSet, Objective, Constraint, SolverFactory, Set, summation

model = AbstractModel ()

model.S = Set()

model.F = Set()

model.a = Param(model.S)

model.b = Param(model.a * 3)

我希望索引参数 a 的每个值都乘以 3,以便它成为参数 b。另一个问题是:如何将集合 S 和 F 组合成集合 SF?

model.SF = Set(within= model.S + model.F)

因此,如果集合 S 由 1,2 组成,集合 F 由 3,4 组成,那么集合 SF 将由 1,2,3,4 组成。

谢谢你的支持!

标签: pythonmathematical-optimizationpyomo

解决方案


所以,事实证明你可以。

如果您已经尝试过,您会注意到pyomo如果您在构建之前尝试对集合进行任何操作,则会出现抱怨。因此,加载数据(通过您愿意使用的任何方式),然后制作一个模型instance。请注意,如果您检查此模型的类型,instance您将看到它是一个ConcreteModel. 因此,您现在可以根据需要添加/操作其中的一部分,ConcreteModel只要您将其称为已构建的“实例”。这是一个例子......(数据文件没有显示,但很容易从打印输出中推断出来)

from pyomo.environ import *

model = AbstractModel()

### SETS
model.I  = Set()
model.J  = Set() 

### PARAMS
model.P = Param(model.I)

data = DataPortal()
data.load(filename='data1.yaml')
instance = model.create_instance(data)

instance.IJ = Set(initialize=instance.I)
instance.IJ.update(instance.J)   # make IJ the union of I, J

instance.P_times_3 = Param(instance.I, initialize={k:3*v for k,v in instance.P.items()})

instance.pprint()

产量

3 Set Declarations
    I : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    4 : {1, 2, 3, 4}
    IJ : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    6 : {1, 2, 3, 4, 5, 6}
    J : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    2 : {5, 6}

2 Param Declarations
    P : Size=4, Index=I, Domain=Any, Default=None, Mutable=False
        Key : Value
          1 :   100
          2 :   200
          3 :   250
          4 :   300
    P_times_3 : Size=4, Index=I, Domain=Any, Default=None, Mutable=False
        Key : Value
          1 :   300
          2 :   600
          3 :   750
          4 :   900

推荐阅读