首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyomo TypeError:不可散列的类型:'EqualityExpression‘

Pyomo TypeError:不可散列的类型:'EqualityExpression‘
EN

Stack Overflow用户
提问于 2020-06-17 23:12:07
回答 1查看 217关注 0票数 1

我正在Pyomo中构建一个能源规划模型,我在构建一些电网约束时遇到了问题。

代码语言:javascript
复制
    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)

Power的定义:

代码语言:javascript
复制
m.power = Var(elOut, elIn, ts_i, within = NonNegativeReals)

解释代码: m.power是一个有3个索引的决策变量:电源( elOut ),用电量( elIn )和当前时间步索引ts_i。elOut和elIn是带有字符串的numpy数组,ts_i是一个从0到多少个时间步的numpy数组。

第一个约束条件只是说,在任何时间步,电力都不能从电网流向电网。进口约束规定,每个时间步的电网进口是从电网到电力接受者的所有电力流量的总和。出口约束规定,每个时间步的电网出口是从电力“供给者”到电网的所有功率流的总和。

现在,我的问题是,当我注释grid2grid和导出约束时,它会正常工作,并且会按预期构建一组约束。但是,例如,当我取消注释与导入规则几乎相同的导出规则时,我得到以下错误:

代码语言:javascript
复制
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'

伴随着这个错误:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-17 23:52:51

呃..。我刚看到了。这是一个简单的问题。:)

您省略了约束结构中的"rule=“部分,因此它是作为一个集合或某种奇怪的东西传入函数的。

不管怎么说。更改:

代码语言:javascript
复制
 m.const_export = Constraint(ts_i, export_rule)

至:

代码语言:javascript
复制
 m.const_export = Constraint(ts_i, rule=export_rule)

您的grid2grid也是如此

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62432333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档