如何从 Pyomo 中具有多个索引的集合中提取单个列?

How to extract a single column from a set with multiple indices in Pyomo?

我正在使用稀疏索引(在 Pyomo 中称为 Set)model.x_index 在创建 Pyomo 变量 model.x 之前对其索引进行子集化。这是为了避免创建我的 model.x 变量的 10+ 百万个实例(即原始索引的总数)。

model.x_index = Set(initialize=[(a, i, j, y) for a in model.Biomass for i in model.SourceCounty for j in model.ProdCounty
                                for y in model.Year if model.TD[i, j] < 1000 if model.BP[a, i, y] > 0 if model.FP[a, i, y] < 1000])
model.x = Var(model.x_index, domain=PositiveReals)

我现在想从我的 model.x_index Pyomo 集中提取第四列 y 并将其存储为单独的 Pyomo 集 model.y_index 以索引我正在创建的另一个变量。我该怎么做?

我非常确定会有更有效的方法来执行此操作,但是当您得到答案时,这可能会起作用:只需从 model.x 中提取创建的 index_set 并提取只是把它们变成一个实际的 python set

y_index = []
for (a,i,j,y) in model.x.index_set():
    y_index.append(y)
model.y_index = pyo.Set(initialize=list(set(y_index)))
model.y = pyo.Var(model.y_index, domain=pyo.NonNegativeReals)

因为你得到了 model-x_index 你可以使用 for (a,i,j,y) in model.x_index:

遍历它来获得相同的结果

这会给你基本的想法,但你可以从那里构建。 此外,您不需要将 y_index 突变为 set 然后 re-mutate 再次变为 list。我这样做是因为 set(.) 消除了任何重复的值,但是如果您只是将原始列表作为参数传递给 pyo.Set(initialize=y_index) 这将引发 WARNING 但无论如何都会起作用