Pyomo 属性错误约束
Pyomo AttributeError Constraint
我有一个简单的模型:
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'
这里有一些问题...
您提到的错误的根源是您的 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
时使用它
如果您仍然卡住,请给我回评论!祝你好运!
我有一个简单的模型:
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'
这里有一些问题...
您提到的错误的根源是您的 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
时使用它
如果您仍然卡住,请给我回评论!祝你好运!