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 时使用它

如果您仍然卡住,请给我回评论!祝你好运!