电力市场、调度、出清模型:线性化模型(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 总成本 = Σ(成本系数 × 发电量)
满足:
  1. 总发电 = 总负荷
  2. 每台机组出力在上下限之间
  3. 爬坡约束
  4. 线路潮流约束
变量只有:发电量 P(连续)

MILP(Mixed-Integer Linear Programming)混合整数线性规划

1. 是什么

在 LP 基础上,一部分变量强制是整数(最常见是 0 或 1)。

2. 特点

  • 一部分变量:连续(发电量)
  • 一部分变量:整数 / 0-1(开 / 关、启动、停止)
  • 约束仍然全是线性
  • 求解比 LP 慢很多,但能做离散决策

3. 电力里用在哪

  • 日前市场出清(SCUC)
  • 决定:哪些机组开、哪些关、开多久
  • 处理:最小开机时间、最小停机时间、启动成本

4. 极简模型(电力版)

Min 总成本 = Σ(发电成本 + 启动成本 + 空载成本)
满足:
  1. 功率平衡
  2. 机组出力上下限(和启停状态绑定)
  3. 最小开 / 停机时间
  4. 爬坡约束
  5. 线路安全约束
变量两种:
  • 发电量 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・y (变量相乘)
  • 1/x
  • sin(x)、log(x)
  • 成本曲线是曲线

原因 1:最优解不在 “顶点” 了

  • LP 求解器(单纯形法):
    最优解一定在几何图形的顶点
    它只需要找顶点,超快。
  • 非线性:
    最优解可能在曲线任何位置
    求解器不知道去哪找

原因 2:可能出现局部最优,不是全局最优

  • LP/MILP:只有一个全局最优
    所以电力市场能出清、能定价、能公平。
  • 非线性:可能有很多局部最优坑
    求解器掉进去就出不来
    → 算出的成本不是最小
    → 电力市场不能用

原因 3:求解速度爆炸

  • LP:百万变量 秒级
  • MILP:百万变量 分钟级
  • 非线性规划(NLP):几百个变量 小时级
电力现货必须几分钟内出清 → 非线性完全不能用
图像 = 曲线 / 曲面
posted @ 2026-03-13 14:45  wangssd  阅读(13)  评论(0)    收藏  举报