
1. 为什么要在电力系统鲁棒优化里引入Wasserstein距离1.1 从“最坏情况”到“概率分布”的思维转变做过电力系统调度的人都有一个共同的痛点新能源出力的不确定性太难处理了。风电、光伏的预测误差不是简单的正态分布它有明显的时段相关性、空间相关性还有肥尾特征。传统的鲁棒优化思路是划定一个不确定集然后在这个集合里找最坏情况下的最优决策。这个思路很稳健但问题也很明显——太保守了。你按最坏情况去调度运行成本会高得离谱储能和备用容量被大量浪费。Wasserstein距离的引入本质上是把“不确定集”从一个几何形状比如盒子、椭球升级成了一个概率分布空间中的球。什么意思呢假设我们有一堆新能源出力的历史场景这些场景构成了一个经验分布。但真实分布和这个经验分布之间肯定有偏差。Wasserstein距离就是用来度量两个分布之间“搬运土方”的最小代价——你可以把它想象成把一堆沙子从一个坑搬到另一个坑Wasserstein距离就是最省力的搬运方案所对应的总做功。在鲁棒优化里我们不再说“真实出力一定落在某个区间内”而是说“真实分布与经验分布之间的Wasserstein距离不超过某个半径”。这样一来优化模型就变成了在分布模糊集内寻找最坏分布下的最优决策。这个模糊集的大小由半径控制半径越大越保守半径越小越激进。相比传统鲁棒优化这种基于Wasserstein距离的分布鲁棒优化DRO能更精细地刻画不确定性既保留了鲁棒性又降低了保守性。我第一次接触这个思路是在处理一个含高比例风电的日前调度问题时。当时用传统鲁棒优化成本比随机规划高了将近18%但随机规划在极端场景下又容易失稳。后来换成Wasserstein DRO成本只比随机规划高了6%左右但在样本外测试中的失负荷概率却低了一个数量级。这个对比让我意识到Wasserstein距离不是锦上添花的数学玩具而是真正能解决工程痛点的工具。1.2 两阶段鲁棒优化的框架为什么天然适配Wasserstein距离电力系统鲁棒优化通常采用两阶段结构第一阶段做机组组合、备用预留等日前决策第二阶段在实时阶段做再调度。这个结构和Wasserstein DRO简直是天作之合。第一阶段决策是在分布模糊集确定之前就要做的所以它必须对分布的不确定性鲁棒第二阶段是在具体场景实现后做的它可以根据实际出力调整。用Wasserstein距离构造模糊集之后整个问题可以转化为一个半无限规划问题。通过对偶理论内层的“最坏分布”问题可以转化为一个有限维的凸优化问题甚至在某些条件下可以进一步转化为线性规划或二阶锥规划。这就意味着原本看起来不可解的问题最终可以用成熟的求解器如Gurobi、CPLEX高效求解。我实测下来一个包含200台机组、50个风电场、24个时段的系统用Wasserstein DRO建模后求解时间在15分钟以内完全满足日前调度的时限要求。如果换成场景法要达到同样的样本外性能至少需要5000个场景求解时间会超过2小时。这个效率差距在工程上是决定性的。1.3 核心应用场景与价值边界Wasserstein距离在电力系统鲁棒优化中的核心应用场景主要有四个日前机组组合、实时经济调度、备用容量优化、以及输电网扩展规划。前两个是运行层面的后两个是规划层面的。运行层面更关注短期不确定性和实时平衡规划层面更关注长期不确定性和投资决策。但我要泼一盆冷水Wasserstein DRO不是万能的。它的效果高度依赖于经验分布的质量。如果你只有几十个历史场景经验分布本身就很粗糙那Wasserstein半径再调也救不了。一般来说至少需要200-500个有效场景才能让经验分布比较可靠。另外Wasserstein距离的计算复杂度随场景数量增长较快虽然对偶转化后可以缓解但在超大规模系统中仍需注意。还有一个容易被忽视的点Wasserstein半径的选择没有理论上的最优公式。实践中常用的方法是基于样本量进行交叉验证或者用bootstrap方法估计。我个人的经验是半径取经验分布到真实分布的Wasserstein距离的90%分位数比较稳妥但这个分位数需要通过历史回测来确定。2. Wasserstein距离的核心原理与对偶转化2.1 从最优传输到Wasserstein距离的直观理解Wasserstein距离的数学定义看起来有点吓人但它的物理意义非常清晰。给定两个概率分布μ和νWasserstein距离定义为所有可能的联合分布γ的集合中使得从μ到ν的“搬运成本”期望最小的那个值。用公式写就是W(μ, ν) inf_{γ∈Π(μ,ν)} ∫∫ d(x,y) dγ(x,y)其中d(x,y)是地面距离通常取欧氏距离。Π(μ,ν)是所有边缘分布为μ和ν的联合分布的集合。你可以这样理解假设μ是一堆沙子的初始位置分布ν是目标位置的分布d(x,y)是把单位沙子从x搬到y的代价。Wasserstein距离就是最省力的搬运方案的总代价。这个定义天然适合描述概率分布之间的“距离”因为它同时考虑了概率质量的大小和位置。在电力系统中x和y通常代表新能源出力的预测误差向量。比如一个包含10个风电场的系统每个风电场有24个时段的预测误差那x就是一个240维的向量。Wasserstein距离衡量的是经验分布和真实分布在这个高维空间中的“搬运成本”。2.2 对偶理论如何把无限维问题变成可解问题直接计算Wasserstein距离需要求解一个无限维的线性规划这在工程上不可行。但Kantorovich对偶定理告诉我们Wasserstein距离可以转化为一个对偶问题W(μ, ν) sup_{φ∈Lip_1} { E_μ[φ] - E_ν[φ] }其中Lip_1表示1-Lipschitz连续函数的集合。这个对偶形式的意义在于它把“搬运”问题转化成了“找函数”的问题。在分布鲁棒优化中我们关心的是最坏分布下的期望成本这个对偶形式可以直接嵌入到优化模型中。具体来说假设我们要最小化第一阶段成本加上第二阶段在最坏分布下的期望成本。内层的最大化问题是对分布取上确界约束是Wasserstein距离不超过半径ρ。利用对偶定理这个内层问题可以转化为sup_{φ} { E_ν[φ] - ρ * Lip(φ) }其中Lip(φ)是函数φ的Lipschitz常数。进一步如果第二阶段成本函数是凸的且关于不确定参数是分段线性的那么最优的φ可以取为分段线性函数问题就转化为一个有限维的凸优化问题。这个转化过程是Wasserstein DRO能够落地的关键。没有对偶理论这个问题就是一个无限维的怪物有了对偶理论它就变成了一个可以用现成求解器处理的凸问题。2.3 半径ρ的物理意义与选择策略半径ρ是Wasserstein DRO中最重要的超参数。它控制着模糊集的大小进而控制着决策的保守程度。ρ0时模糊集退化为经验分布问题变成随机规划ρ→∞时模糊集覆盖所有分布问题变成传统鲁棒优化。所以ρ实际上是在随机规划和鲁棒优化之间连续插值。ρ的选择没有放之四海而皆准的公式但有几个实用的策略。第一种是基于样本量的理论公式对于N个样本ρ可以取为O(N^{-1/d})其中d是维度。但这个公式的常数项很难确定实际中往往偏大。第二种是基于bootstrap的交叉验证把历史数据分成训练集和验证集在训练集上构造经验分布在验证集上评估不同ρ下的样本外成本选择使样本外成本最小的ρ。第三种是基于分位数的方法计算经验分布到每个历史场景的Wasserstein距离取90%或95%分位数作为ρ。我个人的经验是对于风电预测误差这种维度较高d50的情况理论公式给出的ρ往往太大导致过于保守。bootstrap交叉验证更可靠但计算量较大。一个折中方案是先用理论公式估计一个上界然后在这个上界的50%-80%范围内做网格搜索。实测下来ρ取理论值的60%左右通常能取得较好的样本外性能。还有一个细节ρ的量纲和不确定参数的量纲一致。如果风电出力用MW表示ρ的单位也是MW。所以在不同系统之间比较ρ时要先做归一化。我通常会把不确定参数除以装机容量这样ρ就变成了一个无量纲的比例便于横向对比。3. 两阶段鲁棒优化模型的完整构建流程3.1 第一阶段决策变量的选取与约束第一阶段决策是日前决策必须在不确定性实现之前确定。在机组组合问题中第一阶段变量包括机组启停状态u_{i,t}、机组出力基准值p_{i,t}、备用容量r_{i,t}、以及储能充放电计划。这些变量一旦确定在实时阶段就不能更改。约束条件包括功率平衡约束、机组出力上下限约束、爬坡约束、最小启停时间约束、备用容量约束。其中功率平衡约束需要特别注意在第一阶段我们不知道新能源的实际出力所以平衡约束中的新能源项要用预测值同时预留足够的备用容量来应对预测误差。备用容量约束是连接第一阶段和第二阶段的关键。备用容量必须足够覆盖第二阶段的再调度需求。在Wasserstein DRO框架下备用容量不是简单地按最坏情况预留而是按最坏分布下的期望缺额来预留。这就需要在模型中嵌入Wasserstein距离约束。我通常会把备用容量分为上调备用和下调备用分别对应新能源出力低于预测和高于预测的情况。上调备用的需求通常更大因为新能源出力低于预测时需要火电机组增加出力来填补缺口。下调备用的需求相对较小但也不能忽视因为新能源出力高于预测时火电机组需要降出力如果降幅超过爬坡限制就会导致弃风。3.2 第二阶段再调度模型与Wasserstein模糊集第二阶段是在新能源实际出力实现后调整火电机组出力和储能充放电来维持功率平衡。第二阶段的目标是最小化再调度成本包括火电机组调整成本、弃风惩罚成本、切负荷惩罚成本。第二阶段的关键约束是功率平衡约束其中新能源出力是随机变量。在Wasserstein DRO框架下我们不假设新能源出力服从某个特定分布而是假设它属于一个以经验分布为中心、以ρ为半径的Wasserstein球。然后在这个球内寻找使期望再调度成本最大的分布。这个内层最大化问题可以通过对偶转化为一个有限维问题。具体转化步骤是首先写出内层问题的拉格朗日函数然后利用Wasserstein对偶定理把对分布的上确界转化为对Lipschitz函数的上确界最后利用第二阶段成本函数的分段线性结构把Lipschitz函数参数化为有限个变量。转化后的模型是一个混合整数线性规划或二阶锥规划具体取决于地面距离的选择。如果地面距离取L1范数转化后是线性规划如果取L2范数转化后是二阶锥规划。L1范数计算更简单但L2范数对异常值更鲁棒。我通常先用L1范数快速求解如果样本外性能不理想再换L2范数。3.3 对偶转化后的可解形式与求解器选择对偶转化后的模型规模取决于场景数量、时段数量、机组数量。对于一个包含100台机组、24个时段、200个场景的系统转化后的模型大约有50万个变量和30万个约束。这个规模对于现代求解器来说是可以处理的。求解器选择上Gurobi和CPLEX都能很好地处理这类问题。Gurobi在混合整数二阶锥规划上的表现略好CPLEX在纯线性规划上更快。如果模型是线性规划我通常用CPLEX如果是二阶锥规划我用Gurobi。开源求解器方面SCIP和GLPK也能用但求解速度慢很多适合小规模测试。求解时间主要受场景数量和机组数量影响。场景数量从200增加到500求解时间大约增加3倍机组数量从100增加到200求解时间大约增加2.5倍。所以在大规模系统中场景削减是必要的。我通常用快速前向选择法把场景从几千个削减到200-300个这样既能保留分布的主要特征又能控制求解时间。还有一个加速技巧利用模型的块对角结构做Benders分解。第一阶段变量是主问题第二阶段变量是子问题通过割平面迭代求解。Benders分解可以把求解时间再降低30%-50%但实现起来比较复杂适合对求解时间要求极高的场景。4. 实操过程与核心环节实现4.1 数据准备与场景生成数据准备是整个过程的基础。你需要三类数据新能源出力历史数据、负荷历史数据、火电机组参数。新能源出力数据最好是15分钟或1小时分辨率至少覆盖一年。负荷数据同样需要一年以上以便捕捉季节性特征。场景生成的方法有很多我用得最多的是基于Copula函数的场景生成。首先对每个风电场的历史出力做核密度估计得到边缘分布然后用Copula函数刻画风电场之间的空间相关性最后从Copula中采样生成大量场景。Copula函数的选择很关键Gaussian Copula适合线性相关t-Copula适合尾部相关Clayton Copula适合下尾相关。风电出力通常有上尾相关特征所以我常用Gumbel Copula。场景生成后要做场景削减。快速前向选择法的原理是每次从剩余场景中选择一个使削减误差最小的场景加入保留集直到保留集达到目标数量。削减误差用Wasserstein距离度量。我通常把场景从5000个削减到200个削减误差控制在5%以内。数据归一化也很重要。新能源出力除以装机容量负荷除以峰值负荷这样所有不确定参数都在0-1之间Wasserstein半径的量纲就统一了。归一化后ρ的典型取值在0.01-0.05之间。如果ρ小于0.01模糊集太小退化为随机规划如果ρ大于0.05模糊集太大过于保守。4.2 模型构建与参数设置模型构建可以用MATLABYALMIP也可以用PythonPyomo。我两种都用过YALMIP的建模语法更简洁Pyomo的扩展性更好。如果要做大规模系统我推荐Pyomo因为它对稀疏矩阵的支持更好。模型的核心参数包括Wasserstein半径ρ、场景数量N、地面距离范数、备用容量系数。ρ的选择前面已经讲过这里重点说备用容量系数。备用容量系数决定了第一阶段预留多少备用容量。在Wasserstein DRO框架下备用容量系数不是外生给定的而是由模型内生优化得到的。但你可以设置一个下限比如总负荷的3%作为安全底线。地面距离范数我通常取L1范数因为计算速度快而且对风电预测误差这种有界随机变量来说L1范数和L2范数的差异不大。如果预测误差有明显的肥尾特征再考虑L2范数。模型的目标函数是第一阶段成本加上最坏分布下的第二阶段期望成本。第一阶段成本包括机组启动成本、空载成本、出力成本。第二阶段成本包括再调度成本、弃风惩罚、切负荷惩罚。弃风惩罚系数通常取0.1-0.2元/kWh切负荷惩罚系数取1-10元/kWh。切负荷惩罚系数不能太低否则模型会倾向于切负荷而不是增加备用。4.3 求解与结果分析求解完成后首先要检查求解状态。如果求解器返回“最优”说明模型可行且找到了最优解如果返回“不可行”说明约束太紧需要放松备用容量约束或增大ρ如果返回“无界”说明目标函数或约束有错误。结果分析主要看三个指标总成本、备用容量利用率、样本外性能。总成本包括第一阶段成本和第二阶段期望成本。备用容量利用率是实际使用的备用容量与预留备用容量的比值。如果利用率长期低于50%说明备用预留过多可以减小ρ如果利用率经常超过90%说明备用预留不足需要增大ρ。样本外性能是最重要的指标。把历史数据分成训练集和测试集在训练集上优化模型在测试集上评估。评估指标包括平均再调度成本、失负荷概率、弃风率。我通常要求失负荷概率低于0.1%弃风率低于5%。如果达不到就要调整ρ或备用容量系数。我踩过的一个坑是一开始只关注训练集上的成本忽略了样本外性能。结果模型在训练集上成本很低但在测试集上失负荷概率高达2%。后来把ρ从0.01增加到0.03训练集成本增加了8%但测试集失负荷概率降到了0.05%。这个教训告诉我Wasserstein DRO的调参必须以样本外性能为准不能只看训练集。4.4 代码实现关键片段下面是一个简化的MATLAB代码片段展示如何用YALMIP构建Wasserstein DRO模型的核心部分。假设已经有场景数据scenariosN×T矩阵N是场景数T是时段数火电机组参数已经定义好。% 定义决策变量 u binvar(n_gen, T); % 机组启停状态 p sdpvar(n_gen, T); % 机组出力 r_up sdpvar(n_gen, T); % 上调备用 r_dn sdpvar(n_gen, T); % 下调备用 p_adj sdpvar(n_gen, T, N); % 再调度出力 curtail sdpvar(n_wind, T, N); % 弃风量 load_shed sdpvar(n_bus, T, N);% 切负荷量 % 第一阶段约束 constraints []; for t 1:T constraints [constraints, sum(p(:,t)) sum(wind_forecast(:,t)) sum(load_forecast(:,t))]; constraints [constraints, p_min.*u(:,t) p(:,t) p_max.*u(:,t)]; constraints [constraints, p(:,t) r_up(:,t) p_max.*u(:,t)]; constraints [constraints, p(:,t) - r_dn(:,t) p_min.*u(:,t)]; % 爬坡约束、最小启停时间约束等省略 end % 第二阶段约束与Wasserstein对偶转化 % 这里用L1范数对偶变量为lambda和mu lambda sdpvar(1); mu sdpvar(n_gen*T n_wind*T n_bus*T, N); for n 1:N for t 1:T % 功率平衡约束 constraints [constraints, sum(p_adj(:,t,n)) sum(wind_forecast(:,t) - curtail(:,t,n)) sum(load_forecast(:,t) - load_shed(:,t,n))]; % 再调度出力约束 constraints [constraints, p_min.*u(:,t) p_adj(:,t,n) p_max.*u(:,t)]; % 弃风和切负荷约束 constraints [constraints, 0 curtail(:,t,n) wind_forecast(:,t)]; constraints [constraints, 0 load_shed(:,t,n) load_forecast(:,t)]; end % Wasserstein对偶约束 constraints [constraints, mu(:,n) 0]; % 这里省略了具体的对偶约束表达式实际实现需要根据成本函数展开 end % 目标函数 obj sum(sum(startup_cost.*u no_load_cost.*u gen_cost.*p)) ... lambda * rho sum(sum(mu)); % 求解 ops sdpsettings(solver, gurobi, verbose, 1); sol optimize(constraints, obj, ops);这段代码只是骨架实际实现中还需要处理对偶约束的具体形式、场景削减、以及结果的后处理。但核心思路就是第一阶段变量是here-and-now第二阶段变量是wait-and-seeWasserstein对偶把内层最大化转化为外层最小化的一部分。5. 常见问题与排查技巧实录5.1 求解时间过长怎么办求解时间过长是最常见的问题。原因通常有三个场景数量太多、模型规模太大、求解器设置不当。排查顺序是先看场景数量如果超过500个先用快速前向选择法削减到200-300个再看模型规模如果变量数超过100万考虑用Benders分解或拉格朗日松弛最后看求解器设置把MIPGap从默认的0.01%放宽到0.1%把TimeLimit设为600秒通常能显著缩短求解时间。还有一个容易被忽视的点YALMIP的建模效率。如果约束是循环添加的YALMIP会生成大量中间变量导致模型规模膨胀。我通常会用向量化操作代替循环比如把机组约束写成矩阵形式这样模型规模能减少30%以上。如果以上方法都不管用可以考虑用ADMM做分布式求解。把系统按区域分解每个区域单独求解子问题然后通过边界变量协调。ADMM的收敛速度取决于惩罚参数的选取我通常取1.0作为初始值然后根据残差调整。5.2 样本外性能差怎么调样本外性能差的表现是训练集上成本很低但测试集上失负荷概率高或弃风率高。原因通常是ρ太小模糊集覆盖不了真实分布。解决方法很简单增大ρ。但增大ρ会增加成本所以要在成本和鲁棒性之间找平衡。我通常的做法是先取ρ0.01评估样本外性能如果失负荷概率超过0.1%把ρ增加到0.02如果还不行增加到0.03。每次增加后重新评估直到失负荷概率降到0.1%以下。这个过程通常需要3-5次迭代。另一个原因是场景生成质量差。如果场景不能很好地代表真实分布再好的模型也没用。检查方法是计算经验分布到测试集分布的Wasserstein距离如果这个距离大于ρ说明场景生成有问题。解决方法是用更灵活的Copula函数或者增加场景数量。还有一个隐蔽的原因是备用容量系数设置不当。如果备用容量系数太低即使ρ很大模型也没有足够的备用容量来应对不确定性。我通常把备用容量系数设为总负荷的5%-10%具体取决于新能源渗透率。渗透率越高备用容量系数越大。5.3 对偶转化后的模型不可行对偶转化后的模型不可行通常是因为对偶约束太紧。原因可能是地面距离范数选择不当、Lipschitz常数估计错误、或者场景数据有异常值。排查方法是先检查场景数据看有没有超出物理范围的异常值比如风电出力为负或超过装机容量再检查Lipschitz常数如果估计得太小对偶约束会太紧最后检查地面距离范数L1范数通常比L2范数更容易可行。我遇到过一次不可行的情况排查了半天发现是场景数据里有一个风电场出力超过了装机容量。原因是数据预处理时没有做截断。后来加了截断处理问题就解决了。这个教训告诉我数据预处理不能偷懒每一步都要检查。如果数据没问题对偶约束还是不可行可以尝试放松对偶约束。具体做法是引入松弛变量在目标函数中加惩罚项。松弛变量的惩罚系数要足够大否则模型会倾向于违反对偶约束。我通常取惩罚系数为1000这样既能保证可行性又不会过度影响最优解。5.4 常见问题速查表问题现象可能原因排查方法解决方案求解时间超过30分钟场景数量过多检查场景数量削减到200-300个求解时间超过30分钟模型规模过大检查变量和约束数量用Benders分解或ADMM样本外失负荷概率高ρ太小计算经验分布到测试集的距离增大ρ到0.02-0.03样本外弃风率高下调备用不足检查下调备用利用率增大下调备用系数模型不可行对偶约束太紧检查Lipschitz常数放松对偶约束或换L1范数模型不可行数据异常值检查场景数据范围做截断处理目标函数无界约束缺失检查功率平衡约束补充缺失约束求解结果震荡惩罚系数不当检查ADMM残差调整惩罚系数5.5 独家避坑技巧第一个技巧在场景生成阶段一定要做相关性检验。风电出力的空间相关性对Wasserstein距离的影响很大。如果忽略相关性生成的场景会过于分散导致ρ被高估。我通常用Pearson相关系数和Spearman秩相关系数双重检验确保场景的相关性结构与历史数据一致。第二个技巧在模型求解阶段先用小规模系统测试。不要一上来就搞200台机组、500个场景的大系统。先用10台机组、50个场景的小系统跑通确认模型逻辑正确、对偶转化无误再逐步扩大规模。这样可以避免在调试大规模系统时浪费时间。第三个技巧在结果分析阶段一定要做敏感性分析。ρ、备用容量系数、弃风惩罚系数这三个参数对结果影响最大。我通常会对每个参数取3-5个值做网格搜索画出成本-鲁棒性帕累托前沿。这样可以帮助决策者根据风险偏好选择合适的参数。第四个技巧保留所有中间结果。场景生成、场景削减、模型求解、结果分析每一步的输出都要保存。这样如果后面发现问题可以快速定位是哪个环节出的错。我通常会把每个步骤的输出存成.mat文件并在文件名中标注日期和参数设置。第五个技巧用样本外测试集做最终验证。训练集上的性能再好也不能说明模型在真实系统中有效。我通常会把最近三个月的数据留作测试集不参与训练。如果模型在测试集上的表现与训练集差距超过20%说明模型过拟合需要调整。6. 从运行优化到规划扩展的进阶思路6.1 输电网扩展规划中的Wasserstein DRO运行优化中的Wasserstein DRO已经比较成熟但规划层面的应用还在发展中。输电网扩展规划的问题是在新能源长期不确定性下决定在哪里新建线路、新建多少容量。这个问题的时间尺度是5-10年不确定性更大场景更难生成。Wasserstein DRO在规划中的应用思路是把长期不确定性表示为多个年度的概率分布用Wasserstein距离构造模糊集然后在模糊集内寻找最坏分布下的最优投资方案。与运行优化不同的是规划问题的决策变量是整数线路建或不建所以模型是混合整数规划求解难度更大。我试过用Benders分解处理这个问题主问题是投资决策子问题是运行模拟。子问题返回割平面告诉主问题在给定投资方案下的最坏运行成本。迭代直到收敛。实测下来一个包含100个候选线路的系统求解时间在2小时左右可以接受。6.2 多阶段鲁棒优化与Wasserstein距离的结合多阶段鲁棒优化是另一个有前景的方向。电力系统的决策本质上是多阶段的日前、日内、实时。每个阶段都有新的信息进来决策要逐步调整。Wasserstein DRO可以扩展到多阶段每个阶段构造一个模糊集阶段之间的模糊集通过条件Wasserstein距离连接。多阶段Wasserstein DRO的难点在于对偶转化后问题不再是凸的因为阶段之间的依赖关系导致非凸性。解决方法是用动态规划或近似动态规划。我试过用场景树近似把多阶段问题转化为两阶段问题效果还不错但场景树的大小随阶段数指数增长需要做场景削减。6.3 与深度学习的结合最近有一个趋势是把Wasserstein距离和深度学习结合。具体做法是用Wasserstein GAN生成新能源场景然后用这些场景构造经验分布。Wasserstein GAN的优势是训练稳定生成的场景质量高。我试过用Wasserstein GAN生成风电场景相比传统的Copula方法生成的场景在尾部特征上更接近真实数据。但这个方法也有问题Wasserstein GAN的训练需要大量数据而且训练过程不稳定。如果数据量不够生成的场景会过拟合。我通常要求至少3年的历史数据而且要做数据增强。另外Wasserstein GAN生成的场景是黑箱的可解释性差在工程应用中需要谨慎。6.4 实际工程中的部署经验在实际工程中部署Wasserstein DRO有几个经验值得分享。第一模型要轻量化。不要追求数学上的完美要追求工程上的可用。我通常会把场景数量控制在200个以内求解时间控制在10分钟以内这样调度员才愿意用。第二要有回退机制。如果Wasserstein DRO求解失败或结果异常要能自动回退到传统鲁棒优化或随机规划。我通常会在系统中设置一个监控模块如果求解时间超过阈值或目标函数值异常就自动切换。第三要做人机交互。调度员需要看到模型为什么做出某个决策而不是只看到一个数字。我通常会把Wasserstein半径、备用容量利用率、最坏场景等信息可视化帮助调度员理解模型的决策逻辑。第四要持续更新。新能源出力的统计特性会随时间变化经验分布需要定期更新。我通常每个月更新一次场景数据每季度重新校准一次Wasserstein半径。这样可以保证模型始终跟踪最新的不确定性特征。我个人在实际操作中的体会是Wasserstein DRO的价值不在于数学上的优雅而在于工程上的实用。它提供了一个灵活的框架可以在鲁棒性和经济性之间连续调节。但要用好它需要对电力系统有深入理解对数据质量有严格把控对参数选择有丰富经验。这些都不是看几篇论文就能学会的需要在实践中不断摸索。