我有一个简单的模型:
import pyomo.environ as pyo
import numpy as np
import csv
Nmax = 10
def up_constraint(model,n,t):
s = model.a[t] + model.b
return sum(model.imp[n,t]-model.exp[n,t] for n in model.N) <= s
def build_model(N,T,Tup):
model = pyo.ConcreteModel()
# Define the parameters
model.N = pyo.Set(initialize=N)
model.T = pyo.Set(initialize=T)
model.Tup = pyo.Set(initialize=Tup)
# Parameters
model.a = np.ones(Nmax) * 1.5
model.b = 10
# Decision variables
model.imp = pyo.Var(model.N,model.T)
model.up = pyo.Constraint(model.N,model.Tup,rule= up_constraint)
return model
但是当我调用 build_model 时:
N = np.array([n for n in range(0,10)])
T = np.array([t for t in range(0,96)])
Tup = np.array([t for t in range(56,80)])
build_model(N,T,Tup)
ERROR: Rule failed when generating expression for constraint up with
index (0, 56): AttributeError: 'numpy.ndarray' object has no attribute
'is_expression_type'
答案 0 :(得分:0)
这里有几件事情困扰着你......
您提到的错误根源在于您的 numpy.ones
数组有问题。您正在传递它 N
,这是一个数字列表(更多信息见下文)。列表中的第一个数字是 0,因此您正在创建一个第一个索引大小为零的多维数组。示例:
In [30]: import numpy as np
In [31]: N = np.array([t for t in range(3)])
In [32]: X = np.ones(N)
In [33]: X.shape
Out[33]: (0, 1, 2)
In [34]: len(X)
Out[34]: 0
建议:在开始使用这些模型时忘记 numpy
。它没有用。只需使用 python 列表、集合、字典。
当你戴上头罩时,其他几件事“需要一些爱”。
您似乎同时将 N
视为固定值和数组,这导致了上述问题。
您正在将 model.a
创建为具有相同值的数组。为什么不让它非索引?您在约束中使用 t
对其进行索引,我认为您的意思是 n
。只是让它成为一个单身人士。
建议:使用 pyo.Param
构建这些东西,如果您需要打印模型,则更容易进行故障排除。
您将 n
传递给约束构造,但未在函数中提供 n in model.N
时使用它
如果你仍然被卡住,请回复我!祝你好运!