Pyomo TypeError: нехешируемый тип: 'EqualityExpression' - PullRequest
0 голосов
/ 17 июня 2020

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

    def grid2grid_rule(m, ts):
        return m.power['grid','grid', ts] == 0
    m.const_grid2grid = Constraint(ts_i, grid2grid_rule)

    def import_rule(m, ts):
        return m.gridImport[ts] == sum(m.power['grid',derIn,ts] for derIn in elIn)

    m.const_import = Constraint(ts_i, rule = import_rule)

    def export_rule(m, ts):
        return m.gridExport[ts] == sum(m.power[derOut,'grid',ts] for derOut in elOut)

    m.const_export = Constraint(ts_i, export_rule)

Определение мощности:

m.power = Var(elOut, elIn, ts_i, within = NonNegativeReals)

Объяснение кода: m.power - это переменная решения с 3-мя индексами: источник электроэнергии (elOut), «использование» электроэнергии ( elIn) и индекс текущего временного шага ts_i. elOut и elIn - это массивы numpy со строками, а ts_i - массив numpy с целыми числами от 0 до количества временных шагов.

Первое ограничение просто говорит, что на любом временном шаге электричество не может течь из сетка к сетке. Ограничение импорта говорит о том, что импорт в сеть на каждом временном шаге представляет собой сумму по всем потокам электроэнергии от сети к потребителям электроэнергии. Ограничение экспорта гласит, что экспорт сети на каждом временном шаге представляет собой сумму всех потоков мощности от «дающих» электроэнергии в сеть.

Теперь моя проблема в том, что когда я комментирую grid2grid и ограничение экспорта, он работает и набор ограничений построен, как ожидалось. Однако, например, когда я раскомментирую правило экспорта, которое почти идентично правилу импорта, я получаю эту ошибку:

m = build_model('Input_Questionaire.xlsx', 'DER_excel', yeardivision = "repr_day")
ERROR: Constructing component 'const_export_index_1' from data=None failed:
    TypeError: Problem inserting gridExport[1]  ==  power[pv_ground,grid,1] +
    power[wind_s,grid,1] + power[battery,grid,1] + power[grid,grid,1] into set
    const_export_index_1
Traceback (most recent call last):

  File "C:\Users\Axel\Anaconda3\lib\site-packages\pyomo\core\base\sets.py", line 824, in add
    if tmp in self:

  File "C:\Users\Axel\Anaconda3\lib\site-packages\pyomo\core\base\sets.py", line 998, in __contains__
    return self._set_contains(element)

  File "C:\Users\Axel\Anaconda3\lib\site-packages\pyomo\core\base\sets.py", line 1302, in _set_contains
    return element in self.value

TypeError: unhashable type: 'EqualityExpression'

Сопровождается этой ошибкой:

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  ...
  ...
  ...

  File "C:\Users\Axel\Anaconda3\lib\site-packages\pyomo\core\base\sets.py", line 833, in add
    raise TypeError("Problem inserting "+str(tmp)+" into set "+self.name)

TypeError: Problem inserting gridExport[1]  ==  power[pv_ground,grid,1] + power[wind_s,grid,1] + power[battery,grid,1] + power[grid,grid,1] into set const_export_index_1

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

Axel

1 Ответ

0 голосов
/ 17 июня 2020

Ух ... только что видел. Это просто. :)

вы пропустили часть "rule =" конструкции ограничения, поэтому она передается в функцию как набор или что-то странное ...

Так или иначе. Изменить:

 m.const_export = Constraint(ts_i, export_rule)

на:

 m.const_export = Constraint(ts_i, rule=export_rule)

то же для вашего grid2grid

...