线性成本因素优化中的 PV 生产过剩

PV Overproduction within a linear cost factor optimization

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

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)

由于 pv 生产过剩是我试图通过使用这些函数来否定的事情:

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 是参数。

因此,就我的问题搜索而言,我需要以一种方式更改我的生产过剩函数,如果该值 > 0 并且该值应该 < = 0,它会使用来自 pv - excess_pv 的值应该是零。

我认为最简单的方法可能只是惩罚超额生产,而不是最大的负成本因素。

你为什么不能...

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 = ...

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