本文参考链接: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 npn_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的使用