【问题标题】:Pyomo TypeError: unhashable type: 'EqualityExpression'Pyomo TypeError:不可散列的类型:'EqualityExpression'
【发布时间】:2020-10-07 11:15:06
【问题描述】:

我正在 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 是带有从 0 到有多少个时间步长的整数的 numpy 数组。

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

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

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

阿克塞尔

【问题讨论】:

  • 您很可能向power[i,j,k] 提供了错误的索引。您可以编辑您的代码并显示power 的定义位置吗?我猜 `power[grid, grid, i] 是个问题,但不确定。此外,如果您要使用 numpy 数组索引 Pyomo 变量,我会从它们中创建 pyomo 集。它确实有助于排除故障以防止出现此类问题。
  • 谢谢@JeffH!我添加了权力的定义。在实际代码中,它当然是在约束之前定义的。索引都是 numpy 数组。 elOut 可以例如。包含“pv”、“battery”、“grid”或其他电力来源,elIn 可以包含“load”、“battery”或“grid”。 ts_i 只是一个从 0 开始的整数。我考虑过使用 Pyomo 集和参数。我会尝试改变这一点。我很确定这不是 power[grid,grid,i] 问题,因为它也存在于导入约束中。

标签: python optimization pyomo mixed-integer-programming


【解决方案1】:

呃……刚看到。这是一件容易的事。 :)

你省略了约束构造的“rule=”部分,所以它作为一个集合或一些奇怪的东西传入函数......

无论如何。变化:

 m.const_export = Constraint(ts_i, export_rule)

到:

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

grid2grid 也一样

【讨论】:

  • 谢谢!我不知道我怎么能监督这个 xD。抱歉,由于我的声誉太低,我无法投票赞成您的回答,但现在可以使用:)
  • 酷。即使你不能投票,你仍然可以“接受”它。尽管这只是一个错字修复。 :)
  • 啊完美我没有看到小勾=)接受!而且您认为我应该将所有参数和 numpy 数组都设为 Pyomo 参数和集合?
  • 不疼。它只是一个 1 班轮。当您使用 m.pprint() 打印模型以查看所有集合和值时,它使 T/S 模型变得更加容易。您需要做的就是:`m.el_out = Set(initialize=elOut)。 (不过,我并不总是遵循自己的建议!)
  • 有道理!谢谢!
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2012-10-27
  • 2019-01-29
  • 2012-02-19
  • 1970-01-01
  • 2018-12-26
  • 2017-08-01
相关资源
最近更新 更多