电力市场、调度、出清模型:线性化模型(LP,线性规划/MILP,混合整数规划)
LP:线性规划
变量全是连续实数,解决 “发多少” 的问题。
MILP:混合整数线性规划
既有连续变量,又有整数 / 0-1 变量,能同时解决 “开不开” 和 “发多少”。
电力现货能算出来、能用上线性规划的核心原因,是把电力市场、调度、出清“强行线性化” 了,所以才能用 LP / MILP。
LP和MILP对比:
| LP 线性规划 | MILP 混合整数线性规划 | |
|---|---|---|
| 变量 | 全部连续(小数) | 连续 + 整数 / 0-1 |
| 解决问题 | 发多少 | 开不开 + 发多少 |
| 计算速度 | 极快 | 慢很多 |
| 求解难度 | 简单,全局最优 | 复杂,组合爆炸 |
| 电力场景 | 实时 / 日内调度 SCED | 日前机组组合 SCUC |
| 能不能决定启停 | ❌ 不能 | ✅ 能 |
实时市场 → 用 LP
机组都开着,只微调出力,连续优化。
机组都开着,只微调出力,连续优化。
日前市场 → 用 MILP
要决定明天哪些开、哪些关,必须用整数变量。
LP(Linear Programming)线性规划
1. 是什么
在一组线性等式 / 不等式约束下,求一个线性目标函数的最大值或最小值。
2. 特点
- 所有变量:连续实数(可以取小数、分数)
- 约束:都是一次函数,没有平方、乘积、非线性项
- 求解:快、稳定、全局最优
3. 电力里用在哪
- 日内市场、实时市场调度(SCED)
- 已知机组都开了,只求每台发多少
- 只优化出力,不优化启停
4. 极简模型(电力版)
Min 总成本 = Σ(成本系数 × 发电量)
满足:
满足:
- 总发电 = 总负荷
- 每台机组出力在上下限之间
- 爬坡约束
- 线路潮流约束
变量只有:发电量 P(连续)
MILP(Mixed-Integer Linear Programming)混合整数线性规划
1. 是什么
在 LP 基础上,一部分变量强制是整数(最常见是 0 或 1)。
2. 特点
- 一部分变量:连续(发电量)
- 一部分变量:整数 / 0-1(开 / 关、启动、停止)
- 约束仍然全是线性
- 求解比 LP 慢很多,但能做离散决策
3. 电力里用在哪
- 日前市场出清(SCUC)
- 决定:哪些机组开、哪些关、开多久
- 处理:最小开机时间、最小停机时间、启动成本
4. 极简模型(电力版)
Min 总成本 = Σ(发电成本 + 启动成本 + 空载成本)
满足:
满足:
- 功率平衡
- 机组出力上下限(和启停状态绑定)
- 最小开 / 停机时间
- 爬坡约束
- 线路安全约束
变量两种:
- 发电量 P(连续)
- 启停 u、启动 su(0 或 1,整数)
LP模型:
from pulp import LpProblem, LpVariable, LpMinimize # ====================== 1. 创建问题 ====================== # 求成本最小化 prob = LpProblem("电力调度_LP", LpMinimize) # ====================== 2. 定义变量(连续变量!) ====================== # P1, P2 是发电量,可以是小数(连续变量) P1 = LpVariable("机组1发电量", lowBound=0, upBound=100) # 最大100MW P2 = LpVariable("机组2发电量", lowBound=0, upBound=80) # 最大80MW # ====================== 3. 目标函数:总成本最小 ====================== # 机组1:200元/MWh,机组2:300元/MWh prob += 200 * P1 + 300 * P2, "总发电成本" # ====================== 4. 约束条件 ====================== # 1)负荷平衡:总发电 = 总负荷 120MW prob += P1 + P2 == 120, "功率平衡" # 2)机组上下限(已在变量里定义lowBound/upBound) # ====================== 5. 求解 ====================== prob.solve() # ====================== 输出结果 ====================== print("=== LP 模型求解结果(实时/日内市场)===") print("机组1发电量:", P1.varValue, "MW") print("机组2发电量:", P2.varValue, "MW") print("最小总成本:", prob.objective.value(), "元") #结果 机组1发电量:100.0 MW(便宜机组开满) 机组2发电量:20.0 MW(贵机组只开一点) 最小总成本:26000 元
MILP模型:
from pulp import LpProblem, LpVariable, LpMinimize, LpBinary # ====================== 1. 创建问题 ====================== prob = LpProblem("电力调度_MILP", LpMinimize) # ====================== 2. 定义变量(连续 + 0/1整数) ====================== # 【整数变量】0=关机,1=开机(MILP核心) u1 = LpVariable("机组1启停", cat=LpBinary) u2 = LpVariable("机组2启停", cat=LpBinary) # 【连续变量】发电量 P1 = LpVariable("机组1发电量", lowBound=0, upBound=100) P2 = LpVariable("机组2发电量", lowBound=0, upBound=80) # ====================== 3. 目标函数 ====================== prob += 200 * P1 + 300 * P2 + 1000 * u1 + 1500 * u2, "总成本(发电+启动)" # ====================== 4. 约束 ====================== # 1)负荷平衡 prob += P1 + P2 == 120 # 2)关键:关机就不能发电(线性约束) prob += P1 <= 100 * u1 prob += P2 <= 80 * u2 # ====================== 求解 ====================== prob.solve() # ====================== 输出 ====================== print("\n=== MILP 模型求解结果(日前市场)===") print("机组1状态(1=开,0=关):", u1.varValue) print("机组2状态(1=开,0=关):", u2.varValue) print("机组1发电量:", P1.varValue, "MW") print("机组2发电量:", P2.varValue, "MW") print("最小总成本:", prob.objective.value(), "元") #结果 机组1状态:1(开) 机组2状态:1(开) 机组1发电量:100.0 MW 机组2发电量:20.0 MW 最小总成本:28500 元
LP 有几十万个变量、约束时,人算不出来
MILP 是组合爆炸(0/1 开关),穷举要算几百年
必须靠专业求解器才能在几分钟 / 几秒内算出最优解。
PuLP 会自动调用CBC 求解器(免费、开源)
prob.solve() # 内部自动调用 CBC
# 或者指定强大求解器
prob.solve(GUROBI())
行业里真正常用的求解器
1. 免费求解器
- CBC(默认)
- GLPK
- SCIP
适合:学习、小模型、教学
2. 商业求解器(电力现货市场真实在用)
- Gurobi(世界第一快)
- CPLEX
- XPRESS
电力日前市场(MILP)99% 用 Gurobi / CPLEX
求解器到底在做什么?(极简版)
LP 求解器(实时 / 日内市场)
用 单纯形法 / 内点法
在几何空间里找顶点,一秒找到最优出力
在几何空间里找顶点,一秒找到最优出力
MILP 求解器(日前市场)
用 分支定界法(Branch and Bound)
暴力枚举 + 剪枝
找出最优启停组合
暴力枚举 + 剪枝
找出最优启停组合
LP和MILP的优化目标和约束条件中,只能加入线性因素,不能加入非线性因素
求解器只会解 “直线 / 平面” 问题,不会解 “曲线 / 曲面” 问题!
非线性 = 曲线 / 曲面 → 求解器直接算不出来、找不到最优解、甚至有无穷多解。
✅ 线性(可以进 LP/MILP)
只有 一次方、加减乘常数
- y = a + b·x
- P1 + P2 = 120
- 200·P1 + 300·P2
- 没有平方、没有根号、没有变量相乘
图像 = 直线 / 平面
❌ 非线性(绝对不能进)
- x²
- x・y (变量相乘)
- 1/x
- sin(x)、log(x)
- 成本曲线是曲线
原因 1:最优解不在 “顶点” 了
- LP 求解器(单纯形法):
最优解一定在几何图形的顶点
它只需要找顶点,超快。 -
非线性:
最优解可能在曲线任何位置
求解器不知道去哪找
原因 2:可能出现局部最优,不是全局最优
-
LP/MILP:只有一个全局最优
所以电力市场能出清、能定价、能公平。 - 非线性:可能有很多局部最优坑
求解器掉进去就出不来
→ 算出的成本不是最小
→ 电力市场不能用
原因 3:求解速度爆炸
- LP:百万变量 秒级
- MILP:百万变量 分钟级
- 非线性规划(NLP):几百个变量 小时级
电力现货必须几分钟内出清 → 非线性完全不能用
图像 = 曲线 / 曲面

浙公网安备 33010602011771号