调度圈、优化圈的朋友们,今天聊一个我最近一直在啃的课题:多源动态最优潮流的分布式鲁棒优化,专门用来对付风光出力不确定性。项目编号排到第48个,我习惯把它记成“DRO-DOPF”工程。这套东西说白了就是回答一个问题:当风电光伏预测误差没法用一个确定分布描述时,电网调度怎么在保证经济性和安全性的前提下,把常规机组、储能、联络线、可调负荷这些资源统一协调起来,而且还要能拆到各区域分开算,保护各区域内部数据不共享。
先给还没接触过这类问题的朋友画个像:传统最优潮流(OPF)是给定负荷和机组参数,求出各机组最优出力,让全系统发电成本最小,满足潮流和运行约束。到了动态最优潮流(DOPF),把时间轴拉长,加入机组爬坡、储能SOC演化、多条联络线功率时序协调等约束。而“分布式鲁棒优化”则是给风光预测误差的不确定性建立一个更贴近实际情况的模型——不是假装我们知道真实概率分布,而是假设真实分布落在一个“以历史样本为中心、以Wasserstein距离为半径”的模糊集里,然后在最坏情况下做决策。
这篇内容适合谁看?正在做新能源消纳、区域电网调度、多主体协同优化的研究者或工程师,对DRO方法有基本概念但没真正落地过的人,尤其是卡在“公式能看懂、代码不会写”阶段的同学。
下面我把从模型建模、模糊集设计、分布式ADMM求解到参数调优的完整过程拆开讲,包括我实际踩过的坑和测试算例里的真实数据。
1. 问题拆解:风光不确定下的多源协同调度凭什么难
1.1 动态最优潮流比静态最优潮流多算了什么
静态最优潮流只解决“当前时刻”这个断面。它假设这一刻所有负荷、光伏、风电都是确定数值,然后对这台机组出多少、那条线路流多少做优化。但电网调度是个连续过程,下午两点决定火电出力时,必须考虑这台机组能不能在一小时后爬上去顶晚高峰。一个断面算得再漂亮,跨时段约束不满足,这个解就是废纸。
动态最优潮流把整个调度周期(比如24小时、96个时段)整体建模,引入三类新约束:
- 机组爬坡约束:上一时段出力到下一时段出力,变化速率有上限,单位通常写成MW/h。
- 储能系统动态约束:荷电状态(SOC)跨时段演化,充电、放电互相耦合,SOC上下限和功率上下限同时约束。
- 联络线功率计划约束:多区域互联电网中,联络线功率不仅受线路容量限制,还受跨区交易计划和断面稳定性约束约束,时序上还要平滑。
举个例子,一个常规直流潮流OPF每时段求解只需规模相当于一个线性规划,而96时段DOPF的决策变量是96倍,同时因为储能和爬坡带来的时序耦合,问题从可分结构变成了链式结构。这也是为什么不能简单“把96个OPF分别算一遍”来应付——你需要在每个时段之间做全局协调。
1.2 “多源”协同到底复杂在哪里
这里说的多源,不只是风电加光伏。真正构成调度难点的资源至少包括:常规火电(煤电、气电)、风电、光伏、电化学储能、可中断负荷、联络线功率。不同源的特性差异非常大:
- 火电:可调但爬坡慢,启动成本高,经济上是“基荷担当”,但灵活性有限。
- 风电/光伏:边际成本几乎为零,有出力上限但完全不确定,预测误差随提前时间变大。
- 储能:响应速度极快,双向可调,但容量有限,充放电循环存在效率损耗,SOC状态需要跨时段管理。
- 联络线:相当于共享其他区域的调节能力,但必须考虑区域间交换功率计划的提前申报和断面约束。
当风光占比高时,传统“负荷预测-安排机组”的单向调度逻辑失灵。系统的净负荷变成“负荷减去风光出力”,这个净负荷曲线波动剧烈,峰谷差可能非常大。多源协调的实质是,让火电、储能、联络线共同去追踪这个高波动的净负荷曲线,每一类资源承担不同时间尺度上的调节任务,同时把整体运行成本压到最低。
1.3 分布式鲁棒优化到底解决的是哪一层问题
很多人在这一步会困惑:我们已经有了随机规划(Stochastic Programming)和鲁棒优化(Robust Optimization),为什么还要引入分布式鲁棒优化(Distributionally Robust Optimization, DRO)?
我的理解是,它们回答的是不同层次的不确定性问题:
- 随机规划:假设风光预测误差服从某个精确已知的分布(比如正态分布)。利用场景法或机会约束求解,结果依赖分布假设。问题是,实际预测误差有重尾、偏态、极端天气下有异常值,正态假设经常崩。
- 鲁棒优化:不对分布做任何假设,只定义不确定集合(比如区间盒式、椭球式),在最坏取值下求最优。好处是安全,坏处是过度保守,典型情况下会为了极小概率的极端场景付出巨大经济代价。
- 分布式鲁棒优化:落在两者之间。假设真实分布“在以历史样本经验分布为中心的球内”,在球内所有分布中找最坏情况的期望成本。既利用历史数据,又对分布估计误差稳健。
放到项目里,我们的问题不是“某个时段风光出力最坏是多少”,而是“预测误差可能服从的分布有哪些,在所有这些可能下,调度方案的平均表现如何”。这种表述更符合调度员的真实心态——他不会假设预测误差严格正态,但也知道完全按最坏场景安排太浪费。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型设计:从确定性DOPF到DRO-DOPF完整建模
2.1 基础DOPF模型的变量与约束结构
先给一个基础DOPF的标准形式。假设系统有G台常规机组、S个储能、W个风电场、V个光伏电站,调度周期T个时段,直流潮流框架下节点数为N,支路数为L。
目标函数,通常写成:
text复制min Σ_t [ Σ_g C_g(P_g,t) + Σ_s C_sto(P_sto,t) + λ_curtail(Σ_w P_w_curtail,t + Σ_v P_v_curtail,t) ]
其中C_g(P_g,t)是发电成本二次函数,可以分段线性化;C_sto是储能充放电损耗成本;λ_curtail是弃风弃光惩罚价格,一般设得比火电边际成本高,否则模型会“主动弃风”减成本。
等式约束主要是节点功率平衡:
text复制B·θ_t + P_gen,t - P_load,t - P_wind,t - P_pv,t + P_sto,t = 0
这里B是节点导纳矩阵虚部,θ_t是节点相角,P_gen是常规机组注入,P_load是负荷,P_wind/P_pv是风光实发功率,P_sto是储能净充电功率(放电为负)。
不等式约束包括:
- 线路功率上限:|P_line,t| ≤ P_line_max
- 机组出力上下限:P_g_min ≤ P_g,t ≤ P_g_max
- 机组爬坡约束:-RD_g ≤ P_g,t - P_g,t-1 ≤ RU_g
- 储能约束:SOC_g,t+1 = SOC_g,t + η_ch·P_ch,t - (1/η_dis)·P_dis,t,同时SOC和充放电功率有上下限
- 弃风弃光约束:0 ≤ P_w_curtail,t ≤ P_w_forecast,t,实发功率等于预测值减去弃用部分
一个关键点:在多时段问题里,储能SOC是连接相邻时段的纽带,爬坡约束连接相邻时段的机组出力,所以整个问题的约束矩阵是块三对角的。这个结构对后面的分布式算法非常友好,后面会细说。
2.2 风光不确定性与模糊集的选择逻辑
如果只是把风光预测值直接塞进上述确定性DOPF,解出来看起来很完美,但实际执行时预测误差会让节点功率失衡,甚至触发线路越限。所以必须显式处理不确定性。
我们的做法是用预测误差向量描述不确定性。假设在时段t,风电预测误差为ξ_w,t,光伏预测误差为ξ_pv,t,把所有时段所有风光的预测误差堆成一个大向量ξ,维度是T×(W+V)。
这个ξ到底服从什么分布?我们不知道。但我们有历史预测和实测数据,能从历史数据中生成N个历史误差样本。基于这个样本集,可以构造经验分布:
text复制P_hat_N = (1/N) * Σ_{k=1}^{N} δ(ξ^k)
其中δ是Dirac delta函数,ξ^k是第k个历史误差样本向量。
DRO的核心就是围绕这个经验分布构造模糊集。目前主流选择有两类:
第一类是基于矩信息的模糊集,限制分布的一阶矩和二阶矩范围。优点是求解相对简单,但建模比较粗糙,无法捕获分布的形状信息。
第二类是基于Wasserstein距离的模糊集。Wasserstein距离可以理解为“把概率质量从一个分布搬运到另一个分布的最小代价”。模糊集定义为:
text复制B_ε(P_hat_N) = { P : W(P, P_hat_N) ≤ ε }
这个模糊集包含所有“离经验分布不超过ε”的分布。为什么选Wasserstein而不是KL散度?主要三点:
- Wasserstein距离对支撑集的几何结构敏感,即使两个分布没有共同支撑(比如一个包含极端场景,另一个不包含),距离仍然能给出合理度量;KL散度遇到支撑不重叠直接变成无穷大。
- Wasserstein模糊集下,分布鲁棒约束可以通过对偶理论转化为有限约束,配合线性决策规则可以保持凸性,数值上稳定。
- 半径ε可以从样本量N和置信度β理论推导,也可以直接用交叉验证标定,工程上非常灵活。
2.3 目标函数的风险处理与对策
有了模糊集,目标函数从“期望成本”升级为“最坏情形下的期望成本”,也叫分布鲁棒目标:
text复制min_x sup_{P∈B_ε} E_P[ C(x, ξ) ]
这里的C(x, ξ)是调度决策x在误差ξ实现下的总成本。x包括机组出力、储能充电功率、联络线功率等一阶段决策,ξ是风光预测误差。需要说明的是,实际运行中还有二阶段调整决策,比如自动发电控制(AGC)会根据不平衡实时调节,所以完整模型往往是两阶段的:
text复制min_x sup_P E_P[ C1(x) + min_y C2(x, ξ, y) ]
其中y是第二阶段调整量,比如实时平衡出力、弃风弃光量、切负荷量。一般会用线性决策规则(LDR)把y近似为ξ的仿射函数y = a + B·ξ,把无穷维的两阶段问题转化为有限维凸优化问题。工程上这个近似策略性能很好,而且保持整个问题线性规划或者二阶锥规划的结构,解算速度快。
这里我特别想强调一点:处理风光不确定性,不要只把注意力放在目标函数期望上。方案解出来之后,一定要做“样本外模拟”——用没参与训练的真实预测误差数据,回放调度方案,统计弃风率、切负荷率、线路越限次数。这个步骤能暴露模型过度乐观或过度保守的问题,是取舍经济性和鲁棒性的关键依据。
3. 分布式求解架构:区域解耦与边界协同
3.1 为什么坚持要分布式而不是集中式求解
建模做完了,直接扔给求解器做集中式求解不就行了?如果系统规模不大,确实可以。但当系统是多区域互联电网时,集中式会遇到三个硬性障碍:
- 数据隐私和调度主体分离:不同区域电网隶属不同公司或调度中心,负荷曲线、网络拓扑、机组报价都是内部经营数据,不可能全部汇总给一个中心节点。
- 计算规模爆炸:全系统含上万个节点、上千台机组、多时段耦合,集中式DOPF的Hessian矩阵规模在内存和时间上都难以接受。
- 故障隔离和扩展性:集中式一旦中心节点故障,整套调度失效;分布式架构中单个区域故障只会影响局部。
所以实际工程更倾向于“区域自治、边界协同”的架构:每个区域求解自己的DOPF子问题,通过边界变量(联络线功率)与相邻区域交换信息,通过迭代逼近全局最优。
3.2 基于ADMM的分布式求解流程
我们用的是交替方向乘子法(ADMM)来做区域解耦。核心思路是把联络线功率作为耦合变量,把全局一致性问题转化为增广拉格朗日函数的最优化问题。
可以这样理解:假设整个系统分成K个区域,每个区域有自己的优化变量x_k,同时每个区域跟相邻区域之间的联络线功率为z_k。全局一致性约束要求:
text复制A_k · x_k = z_k, k = 1,2,...,K
也就是“区域内部算出的边界功率”必须等于“联络线协商出的共同功率”。构造增广拉格朗日函数:
text复制L_ρ(x, z, λ) = Σ_k [ f_k(x_k) + λ_k^T(A_k x_k - z_k) + (ρ/2) ||A_k x_k - z_k||^2 ]
ADMM的迭代步骤是:
text复制1. x_k^{i+1} = argmin_{x_k} L_ρ(x_k, z^i, λ^i) # 各区域并行求解子问题
2. z^{i+1} = argmin_z L_ρ(x^{i+1}, z, λ^i) # 联络线功率更新,通常有解析解
3. λ_k^{i+1} = λ_k^i + ρ(A_k x_k^{i+1} - z_k^{i+1}) # 对偶变量更新(乘子更新)
第1步各区域完全并行,各自解一个带“边界功率目标”的局部DOPF子问题。第2步是联络线协调,相当于把各区域算出的边界功率做个平均,加入与对偶变量相关的修正项。第3步是标准的对偶上升更新。
实际工程中,一个区域可能同时与多个邻居有联络线,每个联络线对应一个z变量。如果联络线数量多,第2步的计算量也不能忽略。一个常用技巧是给z变量加上“交易电量上限”约束,让联络线功率不会因为迭代中间过程出现过大的毛刺。
3.3 收敛性判断与参数调节
ADMM的迭代过程不是无脑跑到收敛,需要实时监控残差。我们看两个指标:
- 原始残差:r^(i) = A·x^(i+1) - z^(i+1),反映“区域算出的边界功率”和“协调后的边界功率”之间还有多大差距。
- 对偶残差:s^(i) = ρ·A^T·(z^(i+1) - z^(i)),反映对偶变量迭代是否稳定。
收敛判据一般是同时满足两条:
text复制||r^(i)||_2 ≤ tol_pri
||s^(i)||_2 ≤ tol_dual
tol_pri和tol_dual通常取1e-4到1e-3,也可以归一化到边界功率规模的比例,比如百万分之一。
参数ρ是ADMM里最影响收敛速度的旋钮。ρ太小,对偶变量更新太慢,需要迭代上千轮;ρ太大,x_k子问题会过于激进地满足一致性约束而牺牲局部成本,导致解振荡。我的经验是,先取ρ=0.1试跑50轮,观察原始残差的衰减速度,如果衰减太慢就翻倍,如果振荡就折半。更高阶的做法是随着迭代动态调ρ,早期取大值追求收敛,后期取小值追求精解。
我们实际算例中,ρ从0.1调到0.5时,收敛轮数从800轮降到200轮左右,效果非常明显。但再往上到1.0时,末端振荡加剧,最终结果和最优解的差距反而变大。
补一个重要提醒:ADMM的收敛性在目标函数强凸时理论上有保证。DOPF问题中,发电机成本至少是凸二次函数,储能损耗项也保证凸性,因此问题强凸条件往往满足。如果因为某些建模疏忽让目标函数变得非凸(比如加入0-1整数变量),ADMM收敛性质就会恶化,甚至根本不收敛,这种情况需要引入松弛技术或采用混合整数分布式求解方案。
4. 算法实现与关键参数调优
4.1 数据准备与场景处理
整套流程的第一步不是写模型,而是准备数据。在我的测试算例中,用的是IEEE 30节点系统改造版,分三个区域,节点1到10为区域A,含两台火电;节点11到20为区域B,含一个风电场;节点21到30为区域C,含一个光伏电站和储能。三区域之间用4条联络线相连。
风光预测误差的历史数据,我做了这样一个处理:
- 用两年的历史预测和实测数据,按“预测提前4小时”的场景,算出每个时段的风电和光伏预测误差。
- 对每天24小时,从历史数据中采样得到N=1000条误差样本,每条样本是24×2的向量(风电+光伏)。
- 用K-means聚类削减法,把样本削减到N_reduced=200条,保证计算效率,同时保留极值场景。
这里有个技巧值得说:场景削减这个步骤容易被忽略,但它直接影响Wasserstein模糊集的覆盖范围。如果削减后把尾部的极端场景都过滤掉了,模糊集半径就算按理论计算,实际覆盖能力也会不足。所以削减时我会刻意保留每个月份的最大正误差和最大负误差样本,人为保住尾部。
数据准备好后,可以把经验分布P_hat_N直接构造出来。注意这里N用的是削减后的样本数,理论上的Wasserstein半径公式要对应同一个N。
4.2 核心实现环节:CVXPY建模和ADMM外壳
整体代码我建议用Python实现,建模层用CVXPY,后端求解器用Gurobi或Mosek,ADMM外壳自己写。CVXPY的好处是可以用接近数学公式的代码描述目标函数和约束,减少建模转译错误。
伪代码如下,只展示架子:
python复制import cvxpy as cp
import numpy as np
# 区域k的DRO-DOPF子问题
def solve_subproblem_k(region_k, z_hat, lambda_k, rho):
# region_k: 区域k的数据(机组、线路、负荷、风光预测)
# z_hat: 当前迭代中联络线功率的协调值(外部传入)
# lambda_k: 区域k的对偶变量
# rho: ADMM惩罚参数
P_g = cp.Variable((n_gen_k, T)) # 常规机组出力
P_sto_ch = cp.Variable((n_sto_k, T)) # 储能充电
P_sto_dis = cp.Variable((n_sto_k, T)) # 储能放电
SOC = cp.Variable((n_sto_k, T+1)) # 荷电状态
P_w_curt = cp.Variable((n_wind_k, T)) # 弃风电
P_line = cp.Variable((n_line_k, T)) # 区域内部线路潮流
P_tie = cp.Variable((n_tie_k, T)) # 区域联络线功率
# 目标函数 = 本地发电成本 + 弃风惩罚 + ADMM边界一致性项
objective = sum(gen_cost(P_g[:, t]) for t in range(T))
objective += lam_curtail * cp.sum(P_w_curt)
objective += cp.sum(cp.multiply(lambda_k, P_tie - z_hat))
objective += (rho/2) * cp.sum_squares(P_tie - z_hat)
# 约束:直流潮流平衡、机组上下限、爬坡、储能SOC、联络线容量等
constraints = [...]
problem = cp.Problem(cp.Minimize(objective), constraints)
problem.solve(solver=cp.GUROBI, mip_gap=1e-4, verbose=False)
return P_g.value, P_tie.value, SOC.value, ...
ADMM主循环:
python复制# 初始化
z = initial_guess # 联络线功率初值,不要给全零,最好给上一调度周期的值
lambda_k = np.zeros((n_tie_k, T)) # 各区域对偶变量初始为零
rho = 0.5
for i in range(max_iter):
# 并行求解各区域子问题
for k in range(K):
x_k = solve_subproblem_k(regions[k], z, lambda_k_k, rho)
# 更新联络线功率 z(解析解:取各区域边界功率与对偶变量修正的平均)
z_new = compute_z(x_k_list, lambda_k, rho)
# 更新对偶变量
for k in range(K):
lambda_k_k += rho * (x_k_tie - z_new)
# 计算原始残差和对偶残差并判断收敛
r = 计算原始残差(x_k_list, z_new)
s = 计算对偶残差(z_new, z)
if norm(r) < tol_pri and norm(s) < tol_dual:
break
z = z_new
细节上,compute_z这一步不是简单平均,需要处理“区域k的联络线端口”和“区域j的联络线端口”成对映射。每一条联络线在两端区域看来功率符号相反,所以协调值取两端区域计算结果的平均,符号体系要统一。这个映射关系是分布式求解里最容易出错的地方,我前几次调试时,因为把端口正方向搞反,导致一直不收敛。
4.3 Wasserstein半径与样本量怎么定
Wasserstein半径ε是分布鲁棒模型里最核心的超参数。工程上取ε有两种路线:
路线一:理论公式。如果支撑集直径已知,给定置信度β,Wasserstein半径可以按以下形式估计:
text复制ε_N(β) ≈ D · sqrt( (2/N) · log(1 / (1 - β)) )
其中D是误差向量支撑集的直径估计,N是样本量,β是置信度(通常取0.9或0.95)。这个公式来自经验测度到真实分布Wasserstein距离的浓度不等式,实际使用时是下界,保守度略高于理论值,但可以接受。
路线二:样本外交叉验证标定。我认为这才是实操中更可靠的方法。做法是:
- 把历史误差样本按7:3分成训练集和验证集。
- 在训练集上构造经验分布,取一组候选ε值,分别求解DRO-DOPF,得到调度方案。
- 用验证集中每个样本分别回放调度方案,计算实际运行成本,包括因为不平衡导致的惩罚成本。
- 画出ε-平均样本外成本曲线,选曲线的“膝盖点”作为最终ε。
膝盖点通常出现在样本外成本下降趋于平缓的位置。ε太小,样本外成本高,说明方案太乐观;ε太大,训练时的目标函数成本升高,样本外成本也不降,说明过度保守。
我们实测下来,N=200的场景下,理论公式给出ε=0.15左右,交叉验证的结果是0.12到0.2范围都在可接受区间。最终取0.15,方案在严重爬坡事件下的弃风率比确定性方案降低8个百分点,而正常场景的运行成本只增加了约1.2%。这个性价比是值得的。
5. 实测算例与故障排查
5.1 测试系统设计与结果观察
我在IEEE 30节点改造系统上的算例,24小时调度周期,96个时段,每时段15分钟。系统参数如下:
| 参数 | 数值 |
|---|---|
| 区域数量 | 3 |
| 常规机组数 | 6台(2台煤电、4台气电) |
| 储能装机 | 40MW/80MWh |
| 风电装机 | 120MW |
| 光伏装机 | 80MW |
| 联络线总数 | 4条 |
| 负荷峰值 | 约260MW |
测试中,风电预测误差的标准差大约是装机容量的12%,光伏误差受云层影响更大,午后时段达到18%。我按以下方案做了对比:
- 确定性DOPF:直接把预测值当实测值,不处理不确定性。
- 鲁棒优化DOPF:用盒式不确定集合,保证最坏情况下不越限。
- DRO-DOPF:Wasserstein模糊集,ε=0.15。
- DRO-DOPF-ADMM:把方案3用ADMM分布式求解。
结果很有意思:
| 方案 | 期望运行成本(万元) | 最坏情形成本(万元) | 样本外弃风率 | 线路越限次数/100次模拟 |
|---|---|---|---|---|
| 确定性 | 58.3 | 78.5 | 6.4% | 4 |
| 鲁棒优化 | 64.9 | 68.2 | 2.1% | 0 |
| DRO集中式 | 60.5 | 69.8 | 2.6% | 0 |
| DRO分布式 | 60.8 | 70.1 | 2.7% | 0 |
分布式ADMM解与集中式解的偏差约0.5%,完全在工程可接受范围。鲁棒优化最坏情形成本最低,但期望成本高了7%以上,这正是我们不想选择的保守方案。
5.2 常见病根与排查记录
第一次跑通ADMM后,我遇到三个典型问题,写出来给大家排雷。
问题1:联络线功率迭代振荡,收敛很慢。原因是我把z初始值设成零向量,而两个区域在联络线功率上的可行解其实在满功率附近。前50轮迭代,z一直在零和满功率之间大幅摆动。解决办法是拿上一调度周期的联络线计划值做初值,甚至可以直接用确定性DOPF的联络线解做热启动,迭代轮数能降一半以上。
问题2:分布式解和集中式解偏差超过3%,怎么调都降不下去。排查发现,原因是区域A的储能在子问题中总想把SOC放到边界,但联络线协调值更新之后,相邻区域并不知道这个SOC边界状态,等效于储能调节能力被分布式结构吃掉了一部分。解决办法是在子问题中给储能SOC加一个弱二次项的“防呆”目标,同时把终态SOC约束放宽,而不是硬性固定SOC_T=SOC_0。这样既保证储能跨时段调节能力,又减少分布式不一致。
问题3:样本外模拟时,线路越限出现在联络线两侧的变压器支路。这是因为我建模时只限制了线路有功潮流上限,没有考虑无功和电压约束。直流潮流框架下这是必然漏洞。解决方法是把联络线两端的主变容量作为额外约束加进子问题,替代单纯的有功上限。处理之后越限次数直接降到0。
5.3 避坑清单:从建模到调参的经验浓缩
最后整理一份避坑清单,都是我在本次项目中实际踩过或验证过的:
- 模糊集半径不是越大越安全。ε增大到一定阈值后,优化解会趋向于“什么都安排一点点”的平庸解,经济性损失远大于安全收益。务必做样本外标定,别偷懒。
- 场景削减务必保留尾部事件。K-means削减很容易把极端风况样本聚到中心,导致模糊集覆盖范围缩水。建议削减时强制保留每个季节的最大正负误差样本。
- 爬坡约束在分布式求解时容易被“拆散”。各区域子问题只知道自己区域的机组爬坡,不知道相邻区域爬坡能力上限。因此联络线功率计划跨时段波动别太大,否则协调层很难收敛。
- 储能SOC的终态约束要留余地。完全固定SOC_T=SOC_0会降低储能在日内的调节灵活性,尤其风光大发天的下午,储能往往需要在晚高峰前保持低SOC,如果硬性要求回到初始值,可能提前耗尽充电能力。建议设成SOC_T必须在[SOC_min+10%, SOC_max-10%]区间内,或者加权终端价值函数。
- ADMM的收敛判据要同时看原始残差和对偶残差,只盯一个会误判。实际操作中,原始残差先收敛,对偶残差往往滞后,如果对偶残差不收敛,说明ρ太小或子问题目标函数强凸性质不够,需要调参或加正则化。
- 分布式求解和各区域独立求解的“自主性”要平衡。这里说的自主性指的是子问题里目标函数中本地成本项和边界一致性项的相对权重。一致性项权重太高,区域为了边界一致宁可牺牲本地经济性,最终结果偏保守;权重太低,迭代又慢。这个权重就是ρ,没有通用最优值,建议按测试系统规模用网格搜索快速扫一遍。
按照我个人经验,DRO-DOPF这类方法最合适的场景,是那些风电光伏占比超过30%、区域间联络线容量紧俏、对数据隐私有硬性要求的实际电网调度系统。它不像随机规划那样依赖精确概率假设,也不像鲁棒优化那样付出过高的保守代价,数据驱动和分布式求解的组合在当前工程条件下是可落地、可验证的。如果你正在做新能源高占比的调度优化,可以先从10节点、20节点的小系统跑通DRO-DOPF,再逐步扩展到多区域ADMM框架,别一上来就追求大规模算例。算例规模越大,调试问题的复杂度往往不是线性增长,而是指数增长。
