【问题标题】:Pyomo Set multi-level indexingPyomo 设置多级索引
【发布时间】:2018-01-10 14:57:24
【问题描述】:

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

我在 AbstractModel 中定义了一个 Set 类型的二维数组 model.Tpp

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 索引。

定义很好,但是调用这两个二维数组时返回错误,

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 数组,或者定义它的正确方法是什么?

【问题讨论】:

  • 首先,我认为你不能用model.Tpp[p] for p in model.Prod 索引一个约束,而只能用model.Tpp 索引它。如果您声明正确,则 const 将遍历 model.Tpp 的所有索引。我很快就会给你一个例子......

标签: python pyomo


【解决方案1】:

让我举个例子:

请注意,我的模型是具体模型。对于抽象的我想你应该 将元素或值添加到您的 .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']

现在我想将它们合并成一个元组,它将所有的元素和坐在一起。

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')]

例如:

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

【讨论】:

  • 谢谢你,@Icedkk。事实上,我了解如何将两个数组相乘以形成一个元组。但也许元组不是我需要的,或者我不太确定如何将元组应用于我的问题。让我举个例子。假设我有两种产品,苹果和梨,苹果将在第 1 周~N 周销售,而梨在第 2 周~N 周销售。然后我想为产品苹果分配一个周期T_ap = {1, 2, ..., N},产品梨T_pe = {2, 3, ..., N}。然后对于每个产品,在各自的周期内定义操作规则。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多