Почему у целевого объекта в моем коде pyomo есть «генератор» неизвестного типа?

Я создаю задачу оптимизации с множеством ограничений, используя библиотеку pyomo в Python, но я продолжаю получать ошибку в моем, казалось бы, простом определении цели, и не понимаю, почему.

Я создаю абстрактную модель, целью которой является минимизация затрат в (ab_mdl.c) раза по сравнению с мощностью (ab_mdl.x) за каждый час (i) и каждый ресурс (j). Вот целевая функция, написанная ниже:

def TOU_rule(ab_mdl):
    return(summation(ab_mdl.c[i]*ab_mdl.x[j,i]) for i in ab_mdl.hours for j in ab_mdl.num_of_cars)

ab_mdl.cost_obj=Objective(rule=TOU_rule)

Но когда я запускаю полный код, я получаю эту ошибку:

Невозможно обработать значение '. at 0x21427670>» в качестве константы, потому что он имеет неизвестный тип «генератор».

Я не понимаю, что именно не так с кодом, тем более что это относительно простая задача, и я следовал синтаксису подобных примеров, которые я видел, используя Pyomo. У кого-нибудь есть идеи, что мне делать дальше?


person L.N.    schedule 31.01.2019    source источник
comment
Улучшенное форматирование   -  person Mohammad Usman    schedule 31.01.2019


Ответы (1)


Возможно, это опечатка в вашем вопросе, но если это не так, я вижу 3 улучшения, которые вы должны сделать, чтобы ваш код работал.

  1. Оператор return(thing) должен быть написан return thing. Это потому, что return — это отдельное слово, и круглые скобки не нужны.

  2. В той же строке summation не то слово, вы должны использовать sum.

  3. Не забудьте указать смысл оптимизации (maximize или minimize) при звонке для построения цели.

Тогда ваш код будет:

def TOU_rule(ab_mdl): 
    return sum(ab_mdl.c[i]*ab_mdl.x[j,i]) for i in ab_mdl.hours for j in ab_mdl.num_of_cars
ab_mdl.cost_obj=Objective(rule=TOU_rule, sense=minimize)
person V. Brunelle    schedule 31.01.2019
comment
извините, я использовал сумму, а не суммирование (это был старый код, который я не удалял, извините). Я изменил его на пробелы, но теперь получаю отдельную ошибку: значение моего параметра c[1] не определено. посмотрю на словарь, который я использовал для create_instance. В очередной раз благодарим за помощь! - person L.N.; 31.01.2019
comment
Я отредактировал свой ответ, просматривая свой собственный код. Есть новый момент. Извините за неопределенное значение параметра. Могу с уверенностью сказать, что это не имеет никакого отношения к упомянутой вами проблеме. Это одна из самых распространенных ошибок, и она говорит вам, что ваших данных недостаточно или область параметров (наборов) слишком широка. Только ты можешь это узнать. Удачи. - person V. Brunelle; 31.01.2019
comment
Я также решил другую проблему. При настройке ab_mdl.c в качестве параметра я устанавливаю внутри=PostiveReals, но затем устанавливаю c[1] =0. Поэтому вместо этого необходимо изменить ab_mdl.c=Param(ab.Index,within=NonNegativeReals) - person L.N.; 31.01.2019