4. 需求响应基础算法:线性规划、整数规划与动态规划

各位同学,今天咱们来聊聊需求响应里的三个基础算法。说实话,这三个算法就像工具箱里的三把扳手——各有各的用处,用对了地方事半功倍。我在电力系统干了十几年,跟这些算法打交道的时间比跟家人还多。嗯,咱们一个一个来看。

4.1 线性规划在DR中的应用

线性规划,说白了就是在约束条件下找最优解。你想想看,需求响应里最常见的问题是什么?——在满足用户用电需求的前提下,怎么调整负荷最省钱?这就是典型的线性规划问题。

我举个例子。假设一个工业园区有3条生产线,每条线都能降负荷。但降多少、什么时候降,都有讲究。咱们用线性规划来建模:

# 目标函数:最小化补偿成本
# 变量:x1, x2, x3 分别代表三条线的降负荷量(MW)
# 约束:总降负荷 ≥ 10MW,每条线降负荷范围 0-5MW

min z = 200*x1 + 150*x2 + 180*x3

s.t.
x1 + x2 + x3 ≥ 10
0 ≤ x1 ≤ 5
0 ≤ x2 ≤ 5
0 ≤ x3 ≤ 5

你看,这个模型很简单。但实际项目中,约束条件会多得多。我记得有一次做某省的需求响应试点,光约束条件就列了30多条——什么设备响应速度限制、用户舒适度要求、电网安全约束……写代码写了整整两天。

核心要点:线性规划适用于连续变量、线性约束的问题。在DR中,常用于日前调度、负荷聚合商优化等场景。

我的小技巧:用Python的PuLP库或者SciPy的linprog函数,上手很快。但要注意——实际数据往往有噪声,别太迷信最优解,留点裕量。

4.2 整数规划在DR中的应用

线性规划有个局限——变量必须是连续的。但现实中,很多设备只能开或关,不能半开半关。这时候就需要整数规划了。

为什么会这样?你想想看,空调要么开着要么关着,储能要么充电要么放电,这些状态都是离散的。用0-1变量来表示,就是整数规划。

我给大家看一个实际案例。某商业楼宇参与需求响应,有10台空调机组。每台机组可以关停,但关停后会影响部分区域的温度。怎么选?

# 目标:在满足降负荷要求的前提下,最小化舒适度影响
# 变量:y_i = 1 表示关停第i台机组,0表示保持运行

min z = Σ (舒适度影响系数_i * y_i)

s.t.
Σ (额定功率_i * y_i) ≥ 目标降负荷量
y_i ∈ {0, 1}

这个模型看着简单,但求解起来比线性规划难多了。我曾经踩过一个坑——用穷举法去解10台机组的问题,2^10=1024种组合,还行。但如果是100台机组呢?2^100,算到天荒地老。

避坑指南:我曾经在项目里直接用整数规划求解器处理大规模问题,结果跑了3小时没出结果。后来改用启发式算法+整数规划混合求解,10分钟搞定。记住——实际工程中,求解效率往往比精度更重要。

4.3 动态规划在DR中的应用

动态规划,我个人觉得是这三个算法里最巧妙的。它解决的是多阶段决策问题——比如储能系统怎么充放电最划算?

咱们用一张图来理解动态规划的核心逻辑:

动态规划在储能调度中的应用 t=1 t=2 t=3 t=4 t=5 S1 S2 S2' S3 S3' S4 S4' S5 状态:储能荷电状态(SOC) 箭头:充放电决策 目标:在电价低谷充电,高峰放电

这张图展示的是储能系统5个时段的调度过程。每个圆圈代表一个状态(比如剩余电量),箭头代表充放电决策。动态规划的核心思想就是——从最后一个时段往前推,每个时段只保留最优路径。

我给大家写个简单的动态规划代码框架:

# 储能调度动态规划
# dp[t][s] = 第t时段,电量为s时的最大收益

def dp_schedule(prices, capacity, max_charge, max_discharge):
    T = len(prices)  # 时段数
    dp = [[-float('inf')] * (capacity+1) for _ in range(T+1)]
    dp[0][0] = 0  # 初始电量为0
    
    for t in range(1, T+1):
        for s in range(capacity+1):
            # 尝试所有可能的充放电决策
            for action in range(-max_discharge, max_charge+1):
                prev_s = s - action
                if 0 <= prev_s <= capacity:
                    # 收益 = 放电收入 - 充电成本
                    profit = -action * prices[t-1] if action < 0 else 0
                    dp[t][s] = max(dp[t][s], dp[t-1][prev_s] + profit)
    
    return max(dp[T])

三种算法的对比:

算法 变量类型 典型应用 求解难度
线性规划 连续变量 负荷分配、日前调度 容易
整数规划 0-1变量 设备启停、机组组合 中等
动态规划 状态变量 储能调度、多时段决策 较难(状态空间爆炸)

我的建议:初学者先掌握线性规划,这是基础。整数规划要理解分支定界法的思想。动态规划嘛……嗯,多练几道题就熟了。我当年学动态规划时,把背包问题、最短路径问题各写了10遍,才真正理解它的精髓。

最后说一句——这三种算法不是孤立的。实际项目中,经常是混合使用。比如用线性规划做粗调度,再用整数规划做设备分配,最后用动态规划做时序优化。你想想看,是不是这个理?


公众号:蓝海资料掘金营,微信deep3321