Pyomo data = None ошибка вывода

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

Вот часть моих кодов:

——— (отредактировано)

def objective_rule(model):
        ans = sum(model.DAEB[t] * model.DAEP[t] for t in model.t)
        ans -= sum(model.DARUP[t] * model.RU[t] + model.DARDP[t] * model.RD[t] for t in model.t)
        ans += sum(0.5 * (sum(model.penalty[t, w]) + sum(-model.RTEP[t] * (model.DAEB[t] - ((model.RTRD[t, w] * model.RU[t]) +
               sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w)
        ans += 0.95 * (model.epslon + 1 / (0.5) * sum(0.01 * model.miu[w] for w in model.w))
        return ans
  • t определяется как набор [0:23], час времени дня;
  • w определяется как [0,1], это разные сценарии;
  • v - [0:29], 30 различных примеров.

Перед определением целевой функции я также определил ряд ограничений, связанных с указанными выше переменными модели.

Все идет гладко, за исключением последнего шага, pyomo дает:

——— (отредактировано)

Traceback (most recent call last):
  line 61, in <module>
    myresult = result.solve(project, pricefile, reg_dispatch, SOC=0, SOC_margin=0.05)

  line 56, in solve
    opti_model, result = self.Fr_optimal_bidding_optimization(self.vehicles, pricefile, reg_dispatch, SOC)

  line 347, in Fr_optimal_bidding_optimization
    model.objective = Objective(rule=objective_rule, sense=minimize, doc='minimize the total cost')

  line 483, in __setattr__
    self.add_component(name, val)

  line 849, in add_component
    val.construct(data)

  line 307, in construct
    tmp = _init_rule(_self_parent)

  line 337, in objective_rule
    sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w)

ERROR: Rule failed when generating expression for objective objective:
  line 337, in <genexpr>
    TypeError: '_GeneralVarData' object is not iterable
    sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w)

ERROR: Constructing component 'objective' from data=None failed:
TypeError: '_GeneralVarData' object is not iterable
    TypeError: '_GeneralVarData' object is not iterable

Во-первых, я действительно запутался в объекте _GeneralVarData и не знаю, о чем он говорит, а во-вторых, я не вижу проблемы в своей целевой функции, поэтому, если кто-то может дать какой-либо совет, буду очень признателен !!

(Я также новичок в "stackoverflow", приношу свои извинения, если мой вопрос не сформулирован четко!)

Тэн


person Janton Zeng    schedule 01.12.2016    source источник
comment
Сначала я предлагаю закомментировать части выражения, пока вы не сможете выделить, какая часть выражения вызывает эту ошибку. Трудно взглянуть на такое большое выражение и выделить проблему.   -  person Gabe Hackebeil    schedule 02.12.2016
comment
Привет, Гейб! Большое спасибо за совет. Я отредактировал свой пост.   -  person Janton Zeng    schedule 02.12.2016
comment
Даже с отредактированным сообщением непонятно, почему вы видите эту ошибку. Я думаю, нам нужно увидеть определения связанных переменных.   -  person Bill Hart    schedule 02.12.2016


Ответы (1)


Исключение запускается следующим кодом в предпоследней строке:

sum(model.veh_pwer_dem[t, v, w])

Это пытается рассматривать (скаляр) model.veh_pwer_dem[t, v, w] как итерацию и суммировать по его ключам (индексам). Похоже, есть и другие проблемы с логической структурой вашего выражения. Я настоятельно рекомендую разбить выражение на более мелкие части, которые помогут вам прояснить ситуацию. Например:

def objective_rule(model):
    ans = sum(model.DAEB[t] * model.DAEP[t] for t in model.t)
    ans -= sum(model.DARUP[t] * model.RU[t] + model.DARDP[t] * model.RD[t] for t in model.t)
    ans += sum(0.5 * ( sum(model.penalty[t, w] for t in model.t for w in model.w) + # ...
    #...
    return ans

Что такое _GeneralVarData объект. Объекты _GeneralVarData - это внутренняя структура Pyomo, используемая для представления фактической переменной оптимизации, которая является частью индексированного Var компонента (иногда вы также можете видеть _SimpleVar, который является внутренней реализацией, используемой для неиндексированных Var компонентов). Как правило, в Pyomo (и в Python в целом) методы, атрибуты и классы, начинающиеся с символа подчеркивания (_), являются «частными» для реализации.

person jsiirola    schedule 02.12.2016
comment
Привет! Большое спасибо за ваши комментарии. Я отредактировал свой пост по вашей методике и считаю, что вы правы. Оказывается, это все еще проблема model.veh_pwer_dem [t, v, w]. - person Janton Zeng; 02.12.2016
comment
У вашего отредактированного целевого правила все еще есть проблемы с sum() выражениями, которые не суммируются по генераторам. Например, в вашем первом += sum(model.penalty[t, w]) недопустимо, а sum(-model.RTEP[t] * #... не имеет for ... in ... (так что это не правильный генератор / список, который python может суммировать) - person jsiirola; 04.12.2016