Ограничение ошибки атрибута Pyomo

#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. У вас есть несколько проблем с кодом, но не совсем понятно, как вы попали в эту ошибку с предоставленным кодом. Можете ли вы отредактировать свой пост, чтобы включить в него достаточно информации для запуска кода и создания ошибки? В частности, добавьте импорт и репрезентативные примеры N, T, Tup, Tdown , чтобы вызвать ошибку?

Ответ №1:

Здесь тебя грызет пара вещей…

В основе ошибки, о которой вы упомянули, лежит проблема с вашим 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 в функции

Прокомментируйте мне, если вы все еще застряли! Удачи!

Комментарии:

1. @gdm Я не уверен, как это сделать. Есть ли какой-то последующий вопрос?