Pyomo AttributeError 约束

时间:2021-04-17 14:50:22

标签: pyomo

我有一个简单的模型:

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'

1 个答案:

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

如果你仍然被卡住,请回复我!祝你好运!