#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 Я не уверен, как это сделать. Есть ли какой-то последующий вопрос?