Pyomo设置多级索引

时间:2018-01-10 14:57:25

标签: python pyomo

在生产和运输问题中,我正在尝试使用Pyomo进行建模,我想1)为每个产品分配一个具有特定起点的单独持续时间,以及2)在其自己的持续时间内激活每个产品的操作规则。

我在AbstractModel中定义了类型为model.Tpp的2-dim数组Set

def tpp_rule(model,p):
    return range(value(model.G[p]),value(model.T))
model.Tpp = Set(model.Prod, initialize=tpp_rule, ordered=True)

此处,model.G[p]指定由model.Prod编制索引的p中每个产品的起点。

定义很好,但是当我调用这两个2-dim数组时会返回错误

def operation_rule(model, t, p):
    return (1)  ## rule is simplified here
model.Operation3 = Constraint((model.Tpp[p] for p in model.Prod), model.Prod, rule=operation_rule)

错误显示,

RuntimeError: Cannot iterate over abstract RangeSet 'Prod' before it has been constructed (initialized).

有人请建议我如何调用2-dim数组,甚至是什么方法来定义它?

1 个答案:

答案 0 :(得分:0)

让我举个例子:

  

请注意我的模型是具体的模型。对于抽象的,我想你应该   将元素或值提供给.dat文件?

假设我有一个显示所有网站的网站集和一个专业版,它显示了所有流程 - 可用 - 。 OFC您需要更改initialize部分,因为您没有我的任何数据框(数据)。

m.sit = pyomo.Set(
    initialize=data['site'].index.get_level_values(0).unique())

m.pro = pyomo.Set(
    initialize=m.process.index.get_level_values('Process').unique())

看起来像这样:(红色是集合坐姿和亲的元素)

(Pdb) master.sit.pprint()
sit : Set of sites
    Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=None
    ['Mid', 'North', 'South']
(Pdb) master.pro.pprint()
pro : Set of conversion processes
    Dim=0, Dimen=1, Size=8, Domain=None, Ordered=False, Bounds=None
    ['Biomass plant', 'Coal plant', 'Gas plant', 'Hydro plant', 'Lignite plant', 'Photovoltaics', 'Slack powerplant', 'Wind park']

现在我想将它们合并为一个元组,它将把sit和pro的所有元素组合在一起。

m.pro_tuples = pyomo.Set(
    within=m.sit*m.pro,
    initialize=m.process.index.remove_unused_levels())

OFC你需要改变init。部分。但是休息是你如何声明一个元组(m.sit * m.pro),然后你可以给出一个约束pro_tuples作为索引,然后你就可以得到你的多级索引。

(Pdb) master.pro_tuples.pprint()
pro_tuples : Combinations of possible processes, e.g. (North,Coal plant)
    Dim=0, Dimen=2, Size=21, Domain=pro_tuples_domain, Ordered=False, Bounds=None
    [('Mid', 'Biomass plant'), ('Mid', 'Gas plant'), ('Mid', 'Hydro plant'), ('Mid', 'Lignite plant'), ('Mid', 'Photovoltaics'), ('Mid', 'Slack powerplant'), ('Mid', 'Wind park'), ('North', 'Biomass plant'), ('North', 'Coal plant'), ('North', 'Gas plant'), ('North', 'Hydro plant'), ('North', 'Photovoltaics'), ('North', 'Slack powerplant'), ('North', 'Wind park'), ('South', 'Biomass plant'), ('South', 'Coal plant'), ('South', 'Gas plant'), ('South', 'Hydro plant'), ('South', 'Photovoltaics'), ('South', 'Slack powerplant'), ('South', 'Wind park')]

e.g:

m.def_process_capacity = pyomo.Constraint(
            m.pro_tuples,
            rule=def_process_capacity_rule,
            doc='total process capacity = inst-cap + new capacity')