Pyomo TypeError: unhashable type: 'EqualityExpression'

Pyomo TypeError: unhashable type: 'EqualityExpression'

我正在 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)、电量 'usage' (elIn) 和当前时间步长指标 ts_i。 elOut 和 elIn 是带有字符串的 numpy 数组,ts_i 是带有从 0 到有多少个时间步的整数的 numpy 数组。

第一个约束只是说在任何时间步,电力都不能从电网流向电网。输入约束表示每个时间步长的电网输入是从电网到电力接受者的所有功率流的总和。输出约束表示每个时间步长的电网输出是从电力 'givers' 到电网的所有功率流的总和。

现在,我的问题是,当我评论 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

我不知道如何解决它,特别是因为这两个约束基本上没有区别...... 非常感谢您的帮助!

阿克塞尔

呃……刚看到。这是一个简单的。 :)

您省略了约束构造的 "rule=" 部分,因此它以集合或奇怪的形式传入函数...

总之。变化:

 m.const_export = Constraint(ts_i, export_rule)

至:

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

你的grid2grid

也一样