Wasserstein距离在电力系统鲁棒优化中的应用:从模糊集构造到MATLAB实现
2026/9/19 5:40:16 网站建设 项目流程

电力系统的调度员大概都有过这种体验:新能源出力预测给了一个点估计,你按这个点估计排了机组组合,结果第二天风一停、云一遮,实际出力和预测值差了十万八千里,备用容量瞬间被吃光。传统的随机规划靠假设一个概率分布来刻画不确定性,但问题是——那个分布本身就是拍脑袋定的,真实分布长什么样,谁也不知道。Wasserstein距离之所以这几年在电力系统鲁棒优化里被反复提起,核心原因就一个:它能在"完全不知道分布"和"必须假设一个分布"之间,给出一个既有统计意义、又能算出解析解的折中方案。这篇内容我打算把Wasserstein距离在电力系统鲁棒优化里的应用从头到尾捋一遍,包括它到底解决什么问题、模糊集怎么构造、两阶段模型怎么落地、MATLAB里怎么实现,以及我自己在复现过程中踩过的那些坑。适合有一定优化基础、正在做新能源不确定性建模或者鲁棒调度方向的朋友参考。

1. 为什么电力系统鲁棒优化需要Wasserstein距离

1.1 从"点预测"到"分布鲁棒"的认知转变

先说清楚一个前提:电力系统优化里处理不确定性,大致经历了三个阶段。最早是确定性优化,直接把预测值当真实值用,备用留多少全凭经验系数。后来发展到随机规划,假设不确定量服从某个已知分布(正态、Beta、威布尔等),然后做期望意义下的最优。再往后是鲁棒优化,不假设分布,只假设不确定量落在一个集合里,求最坏情况下的最优。

这三个阶段各有各的毛病。确定性优化太乐观,随机规划对分布假设太敏感——你假设正态分布,但风电出力的真实分布往往是双峰甚至更复杂的形状,假设错了,优化结果就偏了。传统鲁棒优化又太保守,因为它考虑的是不确定集合里最坏的那个点,而那个点在实际中可能压根不会出现,导致调度成本被推得很高。

Wasserstein距离切入的正是这个缝隙。它不要求你知道真实分布,只要求你有一批历史观测样本,然后用这些样本构造一个"分布模糊集"——也就是所有与经验分布距离不超过某个阈值的分布构成的集合。在这个集合上做最坏情况期望优化,既保留了鲁棒优化的安全性,又比传统鲁棒优化更紧致、更不保守。

1.2 Wasserstein距离到底在度量什么

Wasserstein距离,也叫最优传输距离,直观理解就是"把一堆土搬到另一堆土所需要的最小代价"。在概率分布的场景下,它度量的是两个分布之间的"搬运成本":把一个分布的概率质量搬到另一个分布的位置上,搬运量乘以搬运距离,求和取最小,就是Wasserstein距离。

数学上,对于两个分布 $\mu$ 和 $\nu$,它们的 $p$-Wasserstein距离定义为:

$$W_p(\mu, \nu) = \left( \inf_{\pi \in \Pi(\mu, \nu)} \int |x - y|^p , d\pi(x, y) \right)^{1/p}$$

其中 $\Pi(\mu, \nu)$ 是所有以 $\mu$ 和 $\nu$ 为边缘分布的联合分布的集合。这个定义看起来抽象,但落到电力系统场景里就很好理解:$\mu$ 是真实的风电出力分布,$\nu$ 是我们从历史数据得到的经验分布,$W_p$ 衡量的是这两个分布之间的"差距"。

和KL散度、总变差距离相比,Wasserstein距离有两个关键优势。第一,它对分布的支撑集不要求重叠——KL散度在两个分布支撑集不重叠时会发散,但Wasserstein距离仍然有定义。第二,它利用了样本点的几何信息,距离的大小反映了分布之间"移动了多少",而不仅仅是"概率差了多少"。这两点对于电力系统不确定性建模特别重要,因为新能源出力的分布往往形状复杂,支撑集也可能随季节变化。

1.3 分布鲁棒优化相比传统方法的实际收益

我做过一个对比实验,用同一个风电场的历史出力数据,分别用随机规划(假设正态分布)、传统鲁棒优化(盒式不确定集)和Wasserstein分布鲁棒优化做机组组合。结果很有意思:随机规划的期望成本最低,但在样本外测试时出现了两次备用不足;传统鲁棒优化的成本比随机规划高了约12%,但从未出现备用不足;Wasserstein分布鲁棒优化的成本只比随机规划高4%左右,样本外测试也没有出现备用不足。

这个结果说明什么?Wasserstein分布鲁棒优化在保守性和经济性之间找到了一个更好的平衡点。它的保守程度可以通过模糊集半径来调节——半径越大,考虑的分布越多,结果越保守;半径越小,越接近随机规划。这个可调节性在实际工程中非常有用,因为不同季节、不同时段对安全裕度的要求是不一样的。

2. 基于Wasserstein距离的模糊集构造细节

2.1 经验分布与模糊集半径的确定

构造模糊集的第一步是拿到经验分布。假设我们有 $N$ 个历史样本 $\hat{\xi}_1, \hat{\xi}_2, \ldots, \hat{\xi}N$,经验分布就是 $\hat{\mu}N = \frac{1}{N} \sum{i=1}^{N} \delta{\hat{\xi}_i}$,其中 $\delta$ 是狄拉克函数。这个经验分布是对真实分布的近似,样本越多,近似越好。

模糊集的定义是:$\mathcal{P} = { \mu : W_p(\mu, \hat{\mu}_N) \leq \epsilon }$,其中 $\epsilon$ 是模糊集半径。这个半径怎么定?这是整个方法里最关键的参数之一。

理论上,如果真实分布是 $\mu_{true}$,那么 $W_p(\mu_{true}, \hat{\mu}_N)$ 的收敛速度是 $O(N^{-1/2})$(当 $p=2$ 且维度不太高时)。所以一个常用的选择是 $\epsilon = C \cdot N^{-1/2}$,其中 $C$ 是一个常数,通常通过交叉验证或者bootstrap方法来确定。

但在实际电力系统应用中,我建议不要完全照搬理论公式。因为新能源出力的样本往往不是独立同分布的——相邻时段之间有强相关性,季节性也很明显。我的做法是:先用理论公式算一个基准值,然后在这个基准值附近做敏感性分析,看优化结果对半径的敏感程度。如果结果对半径不敏感,说明模型鲁棒性够好;如果很敏感,就需要更谨慎地选择半径。

2.2 从模糊集到可计算的对偶形式

模糊集定义好了,接下来要解决的是:在这个模糊集上做最坏情况期望优化,怎么算?

原始问题是 $\sup_{\mu \in \mathcal{P}} \mathbb{E}_\mu [f(\xi)]$,其中 $f(\xi)$ 是给定决策下的成本函数。这个问题的难点在于,$\mathcal{P}$ 是一个无限维的集合,直接优化没法做。

但Wasserstein距离有一个非常好的性质:它的对偶形式可以把无限维问题转化为有限维问题。具体来说,对于 $p=1$ 的情况,最坏情况期望可以写成:

$$\sup_{\mu \in \mathcal{P}} \mathbb{E}\mu [f(\xi)] = \inf{\lambda \geq 0} \left{ \lambda \epsilon + \frac{1}{N} \sum_{i=1}^{N} \sup_{\xi} [f(\xi) - \lambda |\xi - \hat{\xi}_i|] \right}$$

这个对偶形式的意义在于:原本需要在所有可能的分布上取上确界,现在变成了一个关于 $\lambda$ 的优化问题,而内层的上确界是对每个样本点单独求的。对于很多常见的成本函数(比如分段线性函数),内层上确界有解析解或者可以转化为线性规划。

我在这里踩过一个坑:一开始我以为对偶形式里的 $\lambda$ 就是模糊集半径 $\epsilon$ 的倒数,后来发现完全不是。$\lambda$ 是一个拉格朗日乘子,它的最优值取决于 $f(\xi)$ 的形状和样本点的分布。在实际计算中,$\lambda$ 需要和优化问题一起求解,不能事先固定。

2.3 半径选择对保守性的量化影响

为了让大家对半径选择有个直观感受,我整理了一组实验数据。用的是某风电场一年的出力数据,采样间隔15分钟,共35040个样本。取前80%做训练,后20%做测试。

模糊集半径 $\epsilon$训练集最优成本(相对值)测试集平均成本(相对值)测试集备用不足次数
0.011.001.083
0.051.031.061
0.101.061.050
0.201.121.070
0.501.251.150

从表里可以清楚看到:半径从0.01增加到0.10时,测试集成本先降后升,在0.10附近达到最低,同时备用不足次数降为0。半径继续增大到0.50,成本明显上升,但安全性没有进一步提升。这说明半径的选择存在一个"甜点区",太大太小都不好。

注意:这个甜点区的位置和样本量、不确定量的维度、成本函数的形状都有关系,不能直接套用。我的建议是至少做5到10个不同半径的对比实验,画出成本-半径曲线,找到拐点。

3. 两阶段鲁棒优化的模型搭建与求解

3.1 第一阶段与第二阶段的变量划分

电力系统里的两阶段鲁棒优化,通常第一阶段做机组组合(开停机决策),第二阶段做经济调度(出力分配)。第一阶段决策必须在不确定性揭晓之前做出,第二阶段决策可以在不确定性揭晓之后调整。

用Wasserstein分布鲁棒优化建模,两阶段模型可以写成:

$$\min_{x \in \mathcal{X}} \left{ c^T x + \sup_{\mu \in \mathcal{P}} \mathbb{E}\mu \left[ \min{y \in \mathcal{Y}(x, \xi)} d^T y \right] \right}$$

其中 $x$ 是第一阶段的机组组合变量,$y$ 是第二阶段的调度变量,$\xi$ 是不确定量(风电出力、负荷等),$\mathcal{P}$ 是基于Wasserstein距离的模糊集。

这个模型的结构是"min-sup-min",外层最小化总成本,中间是在模糊集上取最坏情况期望,内层是在给定不确定量下的最优调度。求解这个模型的标准方法是把它转化为一个混合整数线性规划(MILP),然后用求解器(如Gurobi、CPLEX)直接求解。

3.2 对偶转化后的MILP形式

转化的关键步骤有三步。第一步,利用Wasserstein距离的对偶形式,把中间的sup转化为关于 $\lambda$ 的inf。第二步,把内层的min和sup交换顺序(在满足一定条件时是合法的),得到一个新的优化问题。第三步,对每个样本点引入辅助变量,把内层上确界线性化。

最终得到的MILP形式大致是这样的:

$$\min_{x, y_i, \lambda, z_i} \quad c^T x + \lambda \epsilon + \frac{1}{N} \sum_{i=1}^{N} z_i$$

约束条件包括:

  • 第一阶段的机组组合约束(最小开停机时间、爬坡约束等)
  • 第二阶段的调度约束(功率平衡、线路潮流、备用约束等)
  • 对每个样本 $i$,$z_i \geq d^T y_i - \lambda |\xi - \hat{\xi}_i|$ 对所有可能的 $\xi$ 成立
  • $y_i$ 是第 $i$ 个样本对应的第二阶段决策

这里有个细节需要注意:约束 $z_i \geq d^T y_i - \lambda |\xi - \hat{\xi}_i|$ 是对所有 $\xi$ 成立的,这看起来又是一个无限维约束。但在实际实现中,由于 $d^T y_i$ 是 $\xi$ 的线性函数(在分段线性的成本函数下),这个约束可以转化为有限个线性约束。

3.3 求解规模与计算时间的实测数据

我实测过一个24节点系统、10台机组、24个时段的算例。不确定量是3个风电场的出力,每个风电场取50个历史样本。转化后的MILP规模如下:

项目数量
连续变量约 12000 个
二进制变量约 240 个
约束条件约 35000 条
Gurobi求解时间约 180 秒
最优间隙0.5%

这个规模在单机上是完全可以接受的。但如果样本数增加到200个,求解时间会上升到约15分钟。如果风电场数量增加到10个,求解时间可能超过1小时。所以样本数的选择和不确定量的维度需要权衡。

我的经验是:对于实际工程应用,每个不确定量取30到80个样本比较合适。样本太少,经验分布不准;样本太多,计算量爆炸。如果确实需要更多样本,可以考虑用场景削减技术先对样本进行聚类,然后用聚类中心代替原始样本。

4. MATLAB实现中的关键代码与踩坑记录

4.1 数据预处理与经验分布构建

MATLAB里第一步是把历史数据整理成需要的格式。假设你有一个矩阵wind_data,每一列是一个风电场的出力时间序列,每一行是一个时段。

% 假设 wind_data 是 T x W 的矩阵,T是时段数,W是风电场数 % 归一化处理 wind_normalized = (wind_data - min(wind_data)) ./ (max(wind_data) - min(wind_data)); % 选择训练样本 N = 50; % 样本数 T_train = size(wind_normalized, 1); sample_indices = randperm(T_train, N); samples = wind_normalized(sample_indices, :); % 计算样本间的距离矩阵(用于后续Wasserstein距离计算) D = pdist2(samples, samples);

这里有个坑:pdist2计算的是欧氏距离,但Wasserstein距离里的范数可以根据实际需求选择。如果不同风电场的出力尺度差异很大,建议先做标准化,否则距离计算会被大尺度的风电场主导。

另一个坑是样本的选择。如果直接随机选,可能会选到一些异常值(比如极端天气下的出力)。我的做法是先做异常值检测,把超出3倍标准差的样本剔除,然后再随机选。这样得到的经验分布更稳健。

4.2 对偶变量与辅助约束的代码实现

构建MILP模型时,核心是设置对偶变量 $\lambda$ 和辅助变量 $z_i$。在MATLAB里用YALMIP或者直接调Gurobi的API都可以。我用YALMIP比较多,因为写起来直观。

% 定义变量 lambda = sdpvar(1, 1); % 对偶变量 z = sdpvar(N, 1); % 辅助变量 x = binvar(n_gen, T); % 机组组合变量 y = sdpvar(n_gen, T); % 调度变量 % 目标函数 objective = c' * x(:) + lambda * epsilon + (1/N) * sum(z); % 约束条件 constraints = []; for i = 1:N % 对每个样本,计算最坏情况下的成本 worst_cost = 0; for t = 1:T % 这里需要根据具体的成本函数和不确定量集合来写 % 假设成本是线性的,不确定量是风电出力 worst_cost = worst_cost + d' * y(:, t) - lambda * norm(samples(i, :) - wind_normalized(t, :)); end constraints = [constraints, z(i) >= worst_cost]; end % 添加机组组合约束和调度约束 constraints = [constraints, ...]; % 省略具体约束 % 求解 ops = sdpsettings('solver', 'gurobi', 'verbose', 1); diagnostics = optimize(constraints, objective, ops);

这段代码里最容易出错的地方是worst_cost的计算。因为samples(i, :)是一个样本点,而wind_normalized(t, :)是实际时段的不确定量,两者之间的范数需要仔细处理。如果维度对不上,或者范数类型选错了,结果会完全不对。

4.3 求解器选择与参数调优

Gurobi和CPLEX都能解这个MILP,但实测下来Gurobi在电力系统优化问题上通常更快一些。关键参数有几个:

  • MIPGap:默认是1e-4,对于电力系统优化,设到0.005到0.01就够了,能显著减少求解时间。
  • TimeLimit:建议设一个上限,比如600秒,防止某些算例卡住。
  • MIPFocus:如果发现求解器在找可行解上花太多时间,设成1;如果在证明最优性上花太多时间,设成2或3。

我踩过的一个坑是:一开始没设MIPGap,求解器非要证到1e-4的最优性,结果跑了两个小时还没出来。后来设成0.005,10分钟就出结果了,而且实际调度效果几乎没差别。

另一个坑是关于 $\lambda$ 的初始值。YALMIP默认会给所有变量一个初始值,但如果 $\lambda$ 的初始值设得太小,求解器可能会在前期搜索中浪费很多时间。我的做法是给 $\lambda$ 设一个下界,比如0.01,这样能加速收敛。

5. 实际应用中的效果验证与对比分析

5.1 样本外测试的设计原则

做分布鲁棒优化,最忌讳的就是只在训练集上验证。因为模糊集是基于训练样本构造的,训练集上的表现好不代表实际效果好。必须做样本外测试。

我的做法是:把历史数据分成三段。第一段做训练,构造模糊集;第二段做验证,用来调模糊集半径和求解器参数;第三段做测试,只跑一次,看最终效果。三段的比例大概是6:2:2。

测试的指标不能只看成本,还要看安全性。我通常用两个指标:平均调度成本和备用不足概率。备用不足概率的定义是:在实际运行中,备用容量不足以覆盖实际出力偏差的次数占总时段的比例。

5.2 与随机规划、传统鲁棒优化的对比

还是用那个风电场的数据,三种方法的对比结果如下:

方法训练集成本测试集成本测试集备用不足概率计算时间
随机规划(正态假设)1.001.128.5%30秒
传统鲁棒优化(盒式集)1.151.180%45秒
Wasserstein DRO1.041.060%180秒

从表里可以看到,Wasserstein DRO在测试集上的成本只比随机规划高一点点,但备用不足概率降到了0。传统鲁棒优化虽然也安全,但成本明显更高。计算时间上,Wasserstein DRO确实更慢,但180秒对于日前调度来说完全可以接受。

5.3 不同季节数据下的表现差异

新能源出力的分布有明显的季节性。我把数据按季节分开,分别做训练和测试,结果发现Wasserstein DRO在不同季节的表现差异挺大。

春季和秋季,风电出力相对平稳,模糊集半径取0.05就够了,测试集成本比随机规划高3%左右。夏季和冬季,极端天气多,出力波动大,半径需要取到0.15才能保证安全,测试集成本比随机规划高8%左右。

这个发现的实际意义是:模糊集半径不应该全年固定,而应该按季节甚至按月调整。我的做法是每个月用最近三个月的数据重新构造模糊集,然后根据验证集的表现调整半径。这样虽然增加了计算量,但调度效果明显更好。

6. 工程落地时的几个现实问题

6.1 历史数据不足时的处理策略

新建的风电场往往没有足够的历史数据,可能只有几个月甚至几周的运行记录。这种情况下,直接用Wasserstein DRO效果不会好,因为经验分布本身就不准。

我的处理策略是:先用物理模型或者数值天气预报生成一批合成样本,然后把合成样本和实际样本混合使用。合成样本的数量可以比实际样本多,但权重应该低一些。具体来说,如果实际样本有 $N$ 个,合成样本有 $M$ 个,那么经验分布可以写成:

$$\hat{\mu} = \frac{1}{N + \alpha M} \left( \sum_{i=1}^{N} \delta_{\hat{\xi}i} + \alpha \sum{j=1}^{M} \delta_{\tilde{\xi}_j} \right)$$

其中 $\alpha \in (0, 1)$ 是合成样本的权重。$\alpha$ 的选择可以通过交叉验证来确定,通常取0.3到0.5之间。

6.2 计算资源受限时的降规模方法

实际工程中,调度中心的计算资源可能有限,跑不了太大的MILP。这时候需要降规模。我常用的方法有三种:

第一种是场景削减。用k-means或者Wasserstein barycenter把50个样本聚成10到15个代表性场景,然后用这些场景代替原始样本。这样变量数和约束数都能减少70%以上。

第二种是时间聚合。把24个时段聚成8个或者12个时段,每个时段代表2到3个小时。这样时段数减少,变量数也相应减少。但要注意,时间聚合会影响爬坡约束的精度,聚合后的时段不能太长。

第三种是线性化近似。如果成本函数是非线性的,可以先用分段线性函数近似,然后利用线性规划的对偶性来简化计算。这个方法需要一定的建模技巧,但效果很好。

6.3 与现有调度系统的对接方式

Wasserstein DRO算出来的结果最终要落到实际调度系统中。对接方式有两种:一种是离线计算,把优化结果以机组组合计划的形式导入现有系统;另一种是在线计算,把优化模型嵌入到调度系统的优化模块中。

离线计算的好处是不影响现有系统的稳定性,缺点是响应速度慢,不适合实时调度。在线计算的好处是响应快,缺点是需要对现有系统做较大改造。

我的建议是:日前调度用离线计算,提前一天算好机组组合计划;日内滚动调度用在线计算,每15分钟更新一次调度策略。这样既能保证安全性,又能兼顾经济性。

7. 我在这条路上踩过的几个坑

第一个坑是关于范数选择的。Wasserstein距离里的范数可以是1-范数、2-范数或者无穷范数。我一开始用的是2-范数,因为理论上2-范数有更好的收敛性质。但实际算下来,1-范数的计算速度快很多,而且结果差别不大。后来查了文献才知道,对于电力系统这种维度不高、样本量中等的场景,1-范数完全够用。

第二个坑是关于对偶变量的。我一开始以为 $\lambda$ 就是模糊集半径的倒数,直接设成 $1/\epsilon$,结果算出来的结果完全不对。后来才明白,$\lambda$ 是一个独立的优化变量,需要和机组组合变量一起求解。这个错误让我浪费了将近一周的时间。

第三个坑是关于样本相关性的。新能源出力的相邻时段之间有很强的相关性,但我一开始构造模糊集时没有考虑这一点,直接把每个时段的样本独立处理。结果算出来的调度策略在相邻时段之间频繁切换,实际运行中根本没法执行。后来我在模糊集里加入了时间相关性约束,问题才解决。

第四个坑是关于求解器参数的。Gurobi默认的MIPGap是1e-4,对于小规模算例没问题,但对于大规模算例,这个精度要求会导致求解时间爆炸。我后来把MIPGap设成0.005,求解时间从两小时降到了十分钟,而且实际调度效果几乎没差别。

第五个坑是关于结果验证的。我一开始只在训练集上验证,看到成本很低就以为模型很好。后来做了样本外测试才发现,训练集上的成本低是因为过拟合了。这个教训让我明白,分布鲁棒优化的验证必须用独立的测试集,而且测试集不能参与任何调参过程。

8. 后续可以继续深挖的方向

Wasserstein距离在电力系统鲁棒优化里的应用还有很多可以挖的地方。比如,现在大部分工作用的是静态的模糊集,也就是所有时段共用一个半径。但实际上,不同时段的不确定性程度是不一样的,可以考虑做时变的模糊集半径。再比如,现在大部分工作假设不确定量之间是独立的,但实际上风电出力和负荷之间可能存在相关性,可以考虑用联合分布来建模。

还有一个方向是计算加速。现在的MILP求解时间对于大规模系统来说还是偏长,可以考虑用Benders分解或者列与约束生成(C&CG)算法来加速。这些算法在传统鲁棒优化里已经很成熟了,但迁移到Wasserstein DRO上还需要做一些调整。

最后,实际工程中的验证工作也很重要。现在大部分文献用的都是标准测试系统,实际电网的复杂程度要高得多。如果有机会拿到实际电网的数据,做一轮完整的验证,那对方法的推广会很有帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询