为什么我的电池存储优化模型给出了一个奇怪的解决方案?

问题描述 投票:0回答:1

我正在使用 Gurobi 用 python 编写一个优化模型,目标是通过使用电池存储来最大化太阳能发电厂的收入。我的目标是优化何时将产生的能源立即出售给电力市场或将其存储在电池存储器中并在稍后市场价格较高时出售。然而,在运行我的模型并分析结果后,我注意到该模型的解决方案是非常规的。

例如,在第 7 小时,我的价格很高,为 104.54 欧元,我的电池充满了 1 MWh。该模型决定以该价格仅出售 0.5 MWh,而不是在那一小时内出售全部 1 MWh。然后在下一小时价格较低(103.39 欧元)时额外出售 0.25。然后在下一小时以 95 欧元的价格出售 0.125 MWh,下一小时以 80.15 欧元的价格出售 0.0625 MWh。不幸的是,我无法弄清楚是什么约束导致了这样的结果。所以我想知道是否有人可以查明问题出在哪里?

这是我的模型的一部分:

num_hours = len(solar_production)

# Create a new Gurobi model
model = gp.Model("SolarPowerPlantWithBattery")

# Decision variables
energy_sold = model.addVars(num_hours, lb=0, ub=5, vtype=GRB.CONTINUOUS, name="EnergySold")
battery_status = model.addVars(num_hours, lb=0, ub=battery_capacity, vtype=GRB.CONTINUOUS, name="BatteryStatus")
battery_discharge = model.addVars(num_hours, lb=0, ub=battery_power, vtype=GRB.CONTINUOUS, name="BatteryDischarge")
battery_charge = model.addVars(num_hours, lb=0, ub=battery_power, vtype=GRB.CONTINUOUS, name="BatteryCharge")
binary_variable = model.addVars(num_hours, vtype=GRB.BINARY, name="BinaryVariable")

# Objective function: Maximize total revenue
model.setObjective(gp.quicksum(energy_sold[i] * market_price[i] for i in range(num_hours)), sense=GRB.MAXIMIZE)

# Battery charge and discharge constraints
model.addConstr(battery_charge[0] == 0)
model.addConstr(battery_discharge[0] == 0)
model.addConstr(battery_status[0] == battery_capacity/2) # Initial condition for the battery charge
model.addConstrs(battery_status[i] == battery_status[i - 1] - battery_discharge[i] + battery_charge[i] for i in range(1, num_hours))
model.addConstrs(battery_discharge[i] <= battery_status[i] for i in range(0,num_hours))

# Battery discharge constraint
model.addConstr(gp.quicksum(battery_discharge[i] for i in range(0, num_hours)) <= discharge_limit*num_hours/24)

# Mutual exclusion constraint
model.addConstrs(battery_charge[i] <= battery_power * (1 - binary_variable[i]) for i in range(num_hours))
model.addConstrs(battery_discharge[i] <= battery_power * binary_variable[i] for i in range(num_hours))

# Connection between solar production, energy sold, and battery charge
model.addConstrs(solar_production[i] - energy_sold[i] - battery_charge[i] + battery_discharge[i] == 0 for i in range(num_hours))

# Optimize the model
model.optimize()

我有每小时频率的

solar_production
market_price
的时间序列。
battery_capacity
设置为 2,
battery_power
设置为 1,
discharge_limit
设置为 2。

我多次经历了所有的限制,但我不明白为什么会发生这种情况。还尝试通过从优化标准中减去二进制值(电池放电时为 1)来强制我的模型减少电池放电次数,这只会导致永久计算,我不得不中断。

optimization linear-programming gurobi
1个回答
0
投票

我明白了问题所在。就是这一行:

model.addConstrs(battery_discharge[i] <= battery_status[i] for i in range(0,num_hours))

我总是查看一小时结束时的值,所以自然地在第 7 小时结束时,如果电池放电 1MWh,我的 Battery_status 将是 0MWh,这显然打破了上面的约束。

© www.soinside.com 2019 - 2024. All rights reserved.