【问题标题】:PV Overproduction within a linear cost factor optimization线性成本因素优化中的光伏产能过剩
【发布时间】:2022-01-21 18:27:52
【问题描述】:

因此,我目前正在尝试优化家庭的能源成本。优化基于我试图最小化的成本因子函数。

model = ConcreteModel()
model.t = RangeSet(0, 8759)

def costs(model, t):
    return sum(model.cost_factor[t] * model.elec_grid[t] for t in model.t)
model.costs = Objective(rule = costs, sense = minimize)

由于光伏生产过剩是我试图通过使用这些功能来否定的事情:

model.elec_consumption = Param(model.t, initialize = df['Consumption'])
model.pv = Param(model.t, initialize = df['PV'])
model.excess_pv = Var(model.t, within = NonNegativeReals, initialize = 0)
model.demand = Var(model.t, initialize = 0, within = NonNegativeReals)

def pv_overproduction(model, t):
    return model.excess_pv[t] >= model.pv[t] - model.demand[t]
model.pv_overproduction = Constraint(model.t, rule = pv_overproduction)
def lastdeckung(model, t):
    return (model.pv[t] - model.excess_pv[t]) + model.elec_grid[t] == model.demand[t]
model.lastdeckung = Constraint(model.t, rule = lastdeckung)

问题是当成本因子为负时,优化器将 model.excess_pv 设置得非常高,因此他可以提高 model.elec_grid 变量以最小化成本因子。 这显然不是本意,但到目前为止我还没有找到更好的方法来计算多余的 pv。从技术上讲,一个简单的解决方法是只拥有一个持续积极的成本因素,但遗憾的是这不是一个选择。

如果有人知道如何解决这个问题,我将不胜感激。

基础是我想最大限度地利用光伏电力以降低成本。在某些情况下,系统中会出现 mooch pv,因此为了使优化仍然有效,我需要摆脱多余的部分。

    return model.demand[t] == model.elec_consumption[t]
model.demand_rule = Constraint(model.t, rule = demand_rule)

这就是需求。从技术上讲,还有更多功能,但与解决问题无关。主要问题是由于成本因素有时为负,此功能不起作用 model.excess_pv[t] >= model.pv[t] - model.demand[t] Excess_pv 和 model.demand 是变量,而 model.pv 是参数。

因此,就我的问题搜索而言,我需要更改我的生产过剩函数,使其使用来自 pv - excess_pv 的值,如果值 > 0 并且值应该是

【问题讨论】:

  • 我不明白为什么光伏生产过剩是优化器的约束,而不仅仅是成本因素。为了清楚起见,您能写出您要解决的线性规划问题吗?
  • 那是因为我不想通过将光伏过剩生产注入电网来获得额外收入。这些函数的存在是为了防止在产生过多光伏能量时优化崩溃。
  • 您能否添加一个最小可重现的示例?我有一个想法要解决,但需要先检查一下。问题是您的生产过剩是Var 并且是上限无限的。当减法为 NonNegative 时,您需要将 Var 更改为正好是 pv[t]demand[t] 的减法。对于负值,它只是零。我认为您可以使用pyomo.Expression.Piecewise 来实现这一目标。
  • 我之前尝试过这种方法,只是说变量应该在 NonNegative 之内,但这只是让我没有最初的可行解决方案。我将阅读 pyomo 中的分段函数并尝试一下。

标签: python linear-programming pyomo


【解决方案1】:

我认为最简单的方法可能是在更大程度上惩罚过剩生产,而不是最大程度地负成本因素。

你为什么不能...

excess_pentalty = max(-min(cost) + epsilon, 0)  # use maximin to prevent odd behavior if there is no negative cost, which might lead to a negative penalty...

# make obj from components, so we can inspect true cost (w/o penalty) later...
cost = sum(model.cost_factor[t] * model.elec_grid[t] for t in model.t)
overproduction_pentaly = sum(excess_penalty * model.excess_pv[t] for t in model.t)

model.obj = Objective(expr= cost + overproduction_penalty, sense = minimize)

以后如果你想要独立的成本,你可以检查cost的值,这是一个合法的pyomo表达式。

value(cost)

我认为您也可以将表达式添加为模型组件,如果这很重要的话...

model.cost = ...
model.overproduction_penalty = ...

【讨论】:

    【解决方案2】:

    因此,对于本文中提到的问题,分段函数的想法绝对是一种选择。这是一个相当花哨和复杂的解决方案。惩罚的想法要容易得多,而且它还显示了我的代码中的更多缺陷。由于负成本因素,优化器试图最大化电网输入,这并没有错,但是当某些变量没有上限时,优化器会毫无效率地使用电力。因此,如前所述,最简单的方法是从一开始就惩罚网格导入,因此在优化过程中没有负面成本因素。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2022-12-10
      • 2019-04-06
      • 2015-09-21
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多