在Pyomo(Python)

时间:2018-04-29 10:04:12

标签: python list matrix indexing pyomo

早上好,

我一直在互联网上搜索一个包含2个索引的列表或表格。目前我已为{1}}的1个索引构建代码,并使用此表达式mass = list(range(0,value(m.n)+1))填充此列表。

但是现在我必须引入另一个具有两个索引的变量,如下面的mass[i] = value(m.mass[i])。我试过x[i,j] = value(m.x[i,j])。但我想要的是得到像x = []*value(m.ph)这样的东西来说明我有一张像这样的表。值(m.n)为行和相位(m.ph)为列。

这样做的目的是使用此函数x = [value(m.n)]*value(m.ph)绘制这些变量。 Idk如果可以像你想要的那样做这种列表,表格或矩阵,但知道它会非常有用,因为我因此而陷入困境。

我的代码如下:

plt.plot(time,x)

错误如下:

n = Param(initialize = 10, within = Integers)

N = Set(initialize = range(0,value(m.n)+1))


#What I got

x1 = [0,1,2,3,4,5,6,7,8,9,10]

x = list(range(0,value(m.n)+1))


for i in m.N:
    x[i] = x1[i]


#What I try to do

ph = Param(initialize = 2, within = Integers)
Ph = Set(initialize = range(0,value(m.n)+1))

x2 = [[0,0],[1,1],[2,2],[3,3],[4,4]]

x = []*value(m.ph) 

for i in m.N:
    for j in m.Ph:
        x[i,j] = x2[i,j]

非常感谢你。

编辑:我想要的是在Python中创建一个包含两个索引的列表,使得这些索引具有我需要的长度 File "C:/Users/Manuel/Desktop/StackExample.py", line 38, in <module> x[i,j] = x2[i,j] TypeError: list indices must be integers or slices, not tuple m.n = Param(initialize = 32, within = Integers)定义的长度。

2 个答案:

答案 0 :(得分:0)

使用词典而不是列表。字典可以被双重索引,这将使它们被元组索引。

编写参数应为:

paramName = Param(setOfIndiceA, setOfIndiceB, initialize=aDictionary)

其中setOfIndiceAsetOfIndiceB是包含字典的第一(A)和第二(B)索引的集合。

如果索引中的(a,b)元组是稀疏的(并非集合A的所有值都对应于集合B的值,反之亦然),请使用一组元组,例如

listOfIndicesAB = [(1,1),(1,3),(2,1),(2,4)]
setOfIndicesAB = Set(initialize=listOfIndicesAB)

答案 1 :(得分:0)

我找到了两种将值从二维pyomo变量转换为二维列表的方法。我不确定这是否是您要找的内容,但我从标题中了解。我假设您用数字索引了变量

from pyomo.environ import *

model = ConcreteModel()

# Setup a two dimensional pyomo variable
model.set1 = RangeSet(0, 10)
model.set2 = RangeSet(0, 5)
# initialize with any number as example
model.variable = Var(model.set1, model.set2, initialize=3)
# do your optimization...

# Create an empty list with the same dimensions as the indexed variable
converted_list = [[None for j in range(len(model.set2))]
                  for i in range(len(model.set1))]

#call all touples and values from the variable class
#call the touple values from the dictionary and use them two index the list
for index in model.variable:
    converted_list[index.__getitem__(0)][index.__getitem__(
        1)] = model.variable[index].value

print(converted_list)

如果使用变量进行优化,这将为您提供初始化的数据或解决方案。

[[3,3,3,3,3,3],[3,3,3,3,3,3],[3,3,3,3,3,3],[3,3 ,3、3、3、3],[3、3、3、3、3、3],[3、3、3、3、3、3],[3、3、3、3、3、3 ],[3、3、3、3、3、3],[3、3、3、3、3、3],[3、3、3、3、3、3、3],[3、3、3 ,3、3、3]]

您可以从中调用这样的值:

print(converted_list[1][3])