【发布时间】: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