Electricity Market Optimization 探索系列(一)
本文参考链接:Linear Programming Mini Example
先从一个线性规划的例子说起:
问题背景:
现在需要使用两台发电机满足用户的用电需求,发电机一的发电功率上限是 6MW,发电机二的发电功率上限是 4MW,发电机一的度电成本是0.015,发电机二的度电成本是0.03,用电需求是8 MW,求这两台发电机应该发多少电,满足需求的同时成本最小(我知道很简单,但是先听我说完)
min
∑
i
∈
[
G
]
c
i
p
i
s.t.
∑
i
∈
[
G
]
p
i
=
D
0
≤
p
i
≤
P
‾
i
∀
i
∈
[
G
]
\begin{align} \min \quad & \sum_{i\in[G]}c_i p_i \\ \text{s.t.} \quad & \sum_{i\in[G]}p_i = D \\ & 0 \le p_i \le \overline{P}_i && \forall i \in [G] \end{align}
mins.t.i∈[G]∑cipii∈[G]∑pi=D0≤pi≤Pi∀i∈[G]
怎么用代码实现上面的模型呢?见如下代码:
import gurobipy as gp
from gurobipy import GRB
import numpy as np
n_generators = 2 # G
p_lim = np.array([6,4]) # MW
cost = np.array([0.015,0.03]) # $/kWh
D = 8 # MW
# 创建模型并隐去模型初始信息
m = gp.Model()
m.setParam("OutputFlag", 0)
# 两个决策变量分别为发电机一和发电机二的发电功率,这两决策变量的下界都是0
p = m.addVars(n_generators, name="p")
m.update()
# 供需平衡约束
m.addConstr(gp.quicksum(p.values()) == D)
# 两台发电机的最大发电功率约束
# 写法一:
# for i in range(n_generators):
# m.addConstr(p[i] == [0, p_lim[i]])
# 写法二:
m.addConstrs(p[i] == [0, p_lim[i]] for i in range(n_generators))
# 添加目标函数
# 写法一:
# m.setObjective(sum(p[i]*cost[i]*1000 for i in range(n_generators)), GRB.MINIMIZE)
# 写法二:
m.setObjective(gp.LinExpr(cost * 1000, list(p.values())), GRB.MINIMIZE)
m.optimize()
# 打印最优解
status = m.Status
if status == GRB.OPTIMAL:
print("The model is optimal.")
elif status == GRB.INFEASIBLE:
print("The model is infeasible.")
elif status == GRB.UNBOUNDED:
print("The model is unbounded.")
else:
print(f"Optimization ended with status {status}.")
print()
# Objective value
objective = m.ObjVal
print(f"Objective value {objective:.1f}.\n")
print("Variables values:")
# Print the values of all variables
for v in m.getVars():
print(f"{v.VarName} = {v.X}")
至于 gurobi 的语法可以看看我的其他博客:
Gurobi之tupledict 和 tuplelist
Gurobi中quicksum的使用