
1. 含风电的机组组合为什么要跟“不确定性”较劲调度中心的早会上最常听到的一句话就是“风电又飙了”。昨天夜里预报满发结果凌晨三点出力降到预测值的六成备用机组全顶上去勉强没拉负荷。这类事经历多了就会发现机组组合真正难的不是静态的“开几台机组”而是把风电不确定性用一种既不过分悲观、又能在工程时间内求出结果的方式塞进优化模型里。这也是我最近在 Matlab 里落地“基于线性准则的考虑风力发电不确定性的分布鲁棒优化机组组合”项目时反复斟酌的核心。很多同学一开始会把机组组合理解成一个确定性优化问题给定负荷曲线、机组技术参数、风电预测曲线求解一个 24 小时的启停计划。可实际运行里预测误差一小时一变风电预测值和实际出力之间的偏差经常接近甚至超过额定容量的三分之一。如果只用确定性模型调度员拿到的是“看起来很美、实际不能直接执行”的机组组合方案。因此考虑不确定性的机组组合一直是电力系统优化里的热门方向。1.1 传统随机优化和鲁棒优化各自的局限第一类常见做法是随机规划也就是基于场景的方法。思路是生成大量风电出力场景把期望成本作为目标函数让优化结果对所有场景的平均情况都比较稳健。随机优化的优点是建模直观缺点也很明显你很难保证生成的风电场景在概率上足够准确。如果场景数太少尾部风险被严重低估如果场景数太多整数变量和场景维数同时膨胀模型求一次就要好几个小时甚至不收敛。第二类做法是传统鲁棒优化。它不考虑场景而是假设风电误差落在某个集合里要求任何可能的误差值都不能导致切负荷或弃风。这个思路很安全但代价是过度保守。我曾经用盒式不确定集做过一组测试为了对抗一个十天一遇的极端风电场景方案会多启动两台大机组整个时段的运行成本比确定性方案高出 15% 以上。实际调度中这种“为最坏情况买单”的方案往往很难被接受。分布鲁棒优化恰好站在两者中间。它不要求精确的风电概率分布也不无限放大最坏场景而是在一个包含若干可能分布的模糊集里寻找最坏情况下的期望成本。换句话说它优化的是“在概率分布不确定时平均性能最差的那个场景下的期望成本”。在数学上它比随机规划更稳健比传统鲁棒优化更经济。对机组组合这种对安全性和经济性都敏感的决策问题分布鲁棒优化几乎是量身定做的方向。1.2 什么是线性准则为什么它能帮助求解很多第一次接触分布鲁棒优化的读者会卡在同一个地方模糊集里包含无穷多个分布第二阶段调整变量又要依赖风电误差的具体取值这怎么求解这里引入的“线性准则”工程上更常见的叫法是线性决策规则。它的思想很简单把第二阶段调整量限制为一个关于风电预测误差的线性函数。比如某台机组在时段 t 的上调备用可以写成[ r_{it}^(\xi)r_{it}^{0}\sum_{j} a_{ijt}^\xi_{jt} ]其中 (\xi_j) 是第 j 个风电场的预测误差(r_{it}^{0}) 是基准调整量(a_{ijt}^) 是灵敏度系数。也就是说调度员不需要针对每个误差场景分别求解一组优化变量而是把“如何根据实时误差改变出力”这件事提前用一组线性系数描述出来。投入运行后看到实时风电误差直接用公式算出各机组的调整量即可。这个近似听起来有点“一刀切”但它实际上是从自动发电控制 AGC 实践中抽象出来的。电力系统里常说的参与因子本质上就是一种线性准则各机组按固定比例分担系统的实时功率偏差。把参与因子放宽为可优化的线性系数既保留工程可解释性又给优化器留出了寻找最优比例的空间。更重要的是在这个准则下分布鲁棒机组组合模型可以被转换成一个具有二阶锥约束和整数线性约束的混合整数优化问题Matlab 配合合适的求解器完全可以求解。1.3 这篇笔记会讲什么适合谁读这篇笔记主要面向电力系统优化方向的研究生、工程师以及想快速在 Matlab 里实现分布鲁棒机组组合的读者。我会按“问题建模→分布鲁棒模型构造→线性准则推导→Matlab 代码落地→算例分析→避坑经验”的顺序展开。涉及的数学工具包括线性规划、半定规划、对偶理论、整数规划基础但我会尽量把每个公式背后的工程动机说清楚。如果你之前只做过确定性机组组合这篇文章也能帮你把“第二阶段决策”“模糊集”“线性决策规则”这些概念一步到位地串起来。2. 机组组合的数学建模先把确定性底座打牢在引入分布鲁棒和线性准则之前很有必要把机组组合的基础模型完整写出来。因为后面所有不确定性处理都建立在这个确定性的物理模型之上。模型一旦错了后面再精妙的分布鲁棒算法也救不回来。2.1 决策变量与两层结构考虑一个有 (I) 台常规机组、(J) 个风电场、调度时域 (T24) 小时的系统。常规机组决策变量包括二进制状态变量 (u_{it})1 表示机组 i 在时段 t 处于开机状态0 表示停机。连续出力变量 (p_{it})机组 i 在时段 t 的基准出力。启动变量 (y_{it}) 和停机变量 (z_{it})用于刻画机组状态切换。风电场的预测出力记为 (\hat{w}{jt})实际出力为 (\tilde{w}{jt})预测误差定义为[ \xi_{jt}\tilde{w}{jt}-\hat{w}{jt} ]这是一个随机变量正是后面分布鲁棒模型的焦点。与传统确定性模型不同两阶段结构把决策分成两类第一阶段决定启停 (u_{it}) 和基准出力 (p_{it})这些决策必须在知道风电实际值之前做出。第二阶段根据风电误差 (\xi) 进行实时调整调整变量 (r_{it}^(\xi)) 和 (r_{it}^-(\xi)) 分别表示向上调整和向下调整的功率。2.2 目标函数确定性成本与最坏期望调整成本目标函数由两部分组成。第一部分是常规机组日前计划成本包括空载成本、发电成本、启动成本。为了便于混合整数求解发电成本通常写成二次函数[ C_i(p_{it})a_i u_{it}b_i p_{it}c_i p_{it}^2 ]再加上启动成本 (SU_i y_{it})。第二部分是实时调整的期望成本由于误差分布不确定我们在模糊集上取最坏情况的期望[ \min_{\substack{u,p\ 线性准则系数}} \left[\sum_t\sum_i C_i(p_{it})\sup_{\mathbb{P}\in\mathcal{P}}\mathbb{E}{\mathbb{P}}\left(\sum_t\sum_i (CU_i r{it}^(\xi)CD_i r_{it}^-(\xi))\right)\right] ]其中 (CU_i) 是上调成本(CD_i) 是下调成本。这种目标函数很符合实际机组组合的主要成本发生在日前但风电波动带来的备用调用成本和调节成本同样会影响方案的经济性。2.3 必须满足的物理约束基础约束可以分为四类。功率平衡约束。在不考虑风电误差的情况下基准出力与风电预测之和要满足负荷[ \sum_i p_{it}\sum_j \hat{w}_{jt}D_t ]出力上下限约束[ p_i^{\min}u_{it}\le p_{it}\le p_i^{\max}u_{it} ]爬坡约束。相邻时段的出力变化不能超过爬坡速率[ -RD_i\le p_{it}-p_{i,t-1}\le RU_i ]最小开停机时间约束。机组不能频繁启停需要满足[ \sum_{kt-T_i^{on}1}^{t} y_{ik}\le u_{it} ][ \sum_{kt-T_i^{off}1}^{t} z_{ik}\le 1-u_{it} ]这里 (T_i^{on}) 和 (T_i^{off}) 分别是最小开机时间和最小停机时间。需要提醒的是在实际 Matlab 实现中这个约束要针对每个机组、每个时段写成循环或矩阵化约束不能漏掉边界时段。这些约束构成了确定性机组组合模型。引入风电不确定性后还需要旋转备用约束通常写成[ \sum_i r_{it}^{}(\xi)\ge R_t^ ][ \sum_i r_{it}^{-}(\xi)\ge R_t^- ]其中 (R_t^) 和 (R_t^-) 是上调、下调备用需求。在分布鲁棒框架下这两个约束必须对模糊集所考虑的所有可能风电误差都成立。3. 分布鲁棒建模和线性准则难点是怎么“拧成一条绳”有了确定性的机组组合底座接下来把风电不确定性加进去。分布鲁棒机和机组组合结合的难点表面上看是“随机变量”太多实际上是概率分布未知带来的决策困境。这一步我建议分三个层次理解先构造模糊集再定义线性准则最后完成模型转换。3.1 风电预测误差的模糊集怎么构造模糊集是分布鲁棒优化的核心它描述了“我们认为可能的概率分布有哪些”。最常用的一种模糊集是基于矩信息的集合形式如下[ \mathcal{P}\left{\mathbb{P}:\begin{array}{l} (\mathbb{E}[\xi]-\mu_0)^T\Sigma_0^{-1}(\mathbb{E}[\xi]-\mu_0)\le\gamma_1\ \mathbb{E}[\xi\xi^T]\preceq\gamma_2\Sigma_0 \end{array}\right} ]其中 (\mu_0) 和 (\Sigma_0) 是通过历史预测误差数据估计的均值向量和协方差矩阵(\gamma_1) 和 (\gamma_2) 是模糊集半径参数。这个方法最早可以追溯到 Delage 和 Ye 在运筹学顶刊上提出的矩模糊集框架至今仍是工程实现中的主力。这个模糊集表达了两层含义。第一个不等式约束均值的可能范围第二个不等式约束二阶矩也就是误差的能量水平。参数 (\gamma_1) 和 (\gamma_2) 越大模糊集包含的分布越多优化结果越保守。实际使用时这两个参数可以通过交叉验证或者置信区间方法来选取。我在项目里通常把 (\Sigma_0) 取成对角矩阵加上一个低秩相关项。原因很简单风电场之间的误差确实存在空间相关性比如相邻风电场可能同时受到同一股大风影响但如果直接用满矩阵二阶矩约束会引入大量半定矩阵变量求解规模爆炸。对角加低秩是在计算代价和相关性刻画之间比较务实的折中。3.2 线性准则的变量定义和平衡约束模糊集定义清楚后问题是风电误差 (\xi) 是随机向量第二阶段调整量不能直接用一个固定数值表示而应该写成 (\xi) 的函数。如果不对函数形式做限制这会陷入泛函优化的泥潭。线性准则的意义就在这里。对每一台机组、每一个时段定义向上调整和向下调整的线性函数[ r_{it}^(\xi)\alpha_{it}^0\sum_j \alpha_{ijt}^\xi_{jt} ][ r_{it}^-(\xi)\beta_{it}^0\sum_j \beta_{ijt}^-\xi_{jt} ]这里的 (\alpha_{it}^0) 和 (\beta_{it}^0) 是常数项(\alpha_{ijt}^) 和 (\beta_{ijt}^-) 是机组 i 对风电场 j 误差的响应系数。把这两组系数作为决策变量放进优化模型本质上就是在寻找最优的“动态参与因子”。线性准则还需要满足实时功率平衡约束。在基准出力满足预测平衡后实时不平衡量来自总风电误差 (\sum_j \xi_{jt})。因此第二阶段调整量必须满足[ \sum_i \left(r_{it}^(\xi)-r_{it}^-(\xi)\right)\sum_j \xi_{jt} ]由于这个等式要对所有 (\xi) 成立常数项和误差系数项必须分别相等。写成约束就是[ \sum_i(\alpha_{it}^0-\beta_{it}^0)0 ][ \sum_i(\alpha_{ijt}^-\beta_{ijt}^-)1,\quad \forall j,t ]这个细节非常容易漏掉。我在第一次实现时只写了第二个约束忘了常数项约束结果模型允许机组在没有任何误差时也产生净调整导致功率平衡出现零点偏移。排查了半天才发现是常数项没有置零。3.3 鲁棒约束和最坏期望项的转换在模糊集和线性准则都确定后模型里还剩两类“不确定”约束需要处理。第一类是安全约束。备用约束、机组出力上下限约束都必须对所有可能的风电误差成立。由于这些约束是线性函数而误差集合通常是个盒式集合比如[ \Xi{\xi:\ \underline{\xi}{jt}\le \xi{jt}\le \overline{\xi}_{jt}} ]处理起来相对直接。线性函数在盒式集合上的最坏情况一定发生在边界上因此可以逐项检查极值点。例如对于上调出力上限要求[ \sup_{\xi\in\Xi}\left(p_{it}\alpha_{it}^0\sum_j \alpha_{ijt}^\xi_{jt}\right)\le p_i^{\max}u_{it} ]转化为[ p_{it}\alpha_{it}^0\sum_j \max{\alpha_{ijt}^\underline{\xi}{jt},\alpha{ijt}^\overline{\xi}{jt}}\le p_i^{\max}u{it} ]工程上经常把这个约束写成大 M 形式或者条件表达式Matlab 循环里逐项构造即可。第二类是最坏期望成本项。不能对所有模糊集中的分布逐一计算期望需要对偶理论把内层最大化问题转换为一个有限维凸优化约束。核心思路是引入拉格朗日乘子将对二阶矩的半定约束和对均值椭球约束转化为一组矩阵不等式。以 Delage-Ye 模糊集为例经过对偶转换后最坏期望成本项会被“吸收”进目标函数并产生一组形如[ |A^{1/2}xb|_2 \le c ]的二阶锥约束。这些约束在 Matlab 里可以通过 YALMIP 直接定义成norm(...)表达式也可以使用cone()函数构建。如果你使用的是 CVX对应命令是norm加SOC的形式。这也是为什么很多人建议在 Matlab 中使用 YALMIP 而不是手写求解器接口锥约束的构建、整数变量的混合整数规划设置、不同求解器之间的切换YALMIP 都封装得比较成熟。手写对偶转换容易在符号计算上出错YALMIP 能帮你把很大一部分转换自动处理掉。4. Matlab 实现过程从公式到可运行的代码模型写清楚之后我直接分享这块落地代码的经验。这个项目整体上是一个带整数变量的混合整数二阶锥规划MISOCP求解成败首先取决于建模速度和求解器选择其次才是代码细节。4.1 环境准备和求解器选型我用的环境是 Matlab R2023a YALMIP Gurobi 10.0。Gurobi 从 9.0 版本开始支持非凸二次约束但我们需要的是二阶锥约束Gurobi 和 Cplex 都能很好处理。如果你习惯用开源求解器也可以用 SCIP但在大规模整数锥规划上性能差距比较明显。个人建议优先选择 Gurobi它和 YALMIP 连接最稳定调试报错信息也友好。还有一个容易忽略的点YALMIP 需要事先添加求解器路径而且要注意 Gurobi 的 license 环境变量是否配置好。很多新手在optimize()报出“No solver found”时第一反应是模型写错了其实往往是 YALMIP 没找到 Gurobi 的 mex 文件。4.2 核心变量定义在 Matlab 中第一阶段的启停变量使用binvar定义基准出力变量使用sdpvar定义。线性准则的系数变量则比较麻烦要用三维的sdpvar数组。为了避免三维数组的索引混乱我习惯把误差响应系数按“机组 x 风电场 x 时段”展开T 24; ng 6; % 常规机组数 nw 2; % 风电场数 u binvar(ng, T, full); % 机组状态 p sdpvar(ng, T, full); % 基准出力 y binvar(ng, T, full); % 表示开机动作注意与状态变量区分 % 线性准则系数 alpha0 sdpvar(ng, T, full); % 上调常数项 beta0 sdpvar(ng, T, full); % 下调常数项 alpha sdpvar(ng, nw, T, full); % 上调对误差的响应系数 beta sdpvar(ng, nw, T, full); % 下调对误差的响应系数这里把y定义成binvar是为了用“启动动作”表示最小开停机约束和启动成本。如果只定义u你就没法区分“上一时段已经开着”和“这个时段新启动”两种情况。4.3 核心约束构造功率平衡约束要分成两个部分。基准功率平衡用预测值Constraints []; for t 1:T % 基准出力与预测风电之和等于负荷 Constraints [Constraints, sum(p(:,t)) sum(wf_hat(:,t)) D(t)]; end线性准则的平衡约束则按前面说的常数项和误差系数项分别构造for t 1:T % 常数项平衡无风电误差时净调整量必须为零 Constraints [Constraints, sum(alpha0(:,t)) - sum(beta0(:,t)) 0]; % 误差项平衡总净调整量等于总风电误差 for j 1:nw Constraints [Constraints, sum(alpha(:,j,t)) - sum(beta(:,j,t)) 1]; end end这两段代码是线性准则模型的关键。常数项约束不能省否则优化器会利用常数调整来“作弊”。误差项约束的右端是 1因为风电误差每增加单位功率系统需要有一台或多台机组增加同量出力。备用容量约束需要考虑最坏情况。以向上备用为例要求任何风电误差下系统总上调能力都不低于备用需求for t 1:T % 对盒式不确定集的所有极值点进行约束 for k 1:2^nw % 实际项目中应遍历所有极值组合这里为示意 % 构造极值误差向量 xi_min 或 xi_max % 计算线性准则下的总上调量 total_up sum(alpha0(:,t)) sum(alpha(:,1,t)*xi(1,k) alpha(:,2,t)*xi(2,k)); Constraints [Constraints, total_up sum(u(:,t)) ... Rplus(t)]; end end这一段的循环在代码里看起来繁琐但对线性准则盒式集合的组合来说遍历极值点是最直观可靠的工程实现。如果你用完整对偶转换替代遍历可以显著减少约束数但要额外处理大 M 常数反而更容易写错。4.4 目标函数和最坏期望项的处理目标函数的前半部分很直接Objective 0; for t 1:T for i 1:ng Objective Objective a(i)*u(i,t) b(i)*p(i,t) c(i)*p(i,t)^2 SU(i)*y(i,t); end end但后半段的最坏期望成本没法直接写进Objective。这里我用 YALMIP 的cvar和锥约束搭建了一个替代结构。更完整一点可以采用对偶化之后的目标函数边界形式在目标中加入一个辅助变量eta并施加一组二阶锥约束% 最坏期望成本的对偶边界 Objective Objective eta; % 在YALMIP中通过norm和sum命令构造锥约束 % 根据模糊集参数 gamma1、gamma2 和样本协方差矩阵Sigma0 % 具体约束形式需要根据您的模糊集推导建议先在小算例上验证 Constraints [Constraints, eta 0];这个位置是整个代码中最容易失控的部分。如果你不是特别确定对偶转换细节我建议先在测试系统上用两种方法交叉验证第一种是直接枚举大量风电分布在枚举分布上计算最坏期望第二种是使用对偶后的锥约束。只有两者误差在可接受范围才说明对偶约束构造正确。4.5 求解设置YALMIP 求解时我习惯这样配置ops sdpsettings(solver, gurobi, verbose, 2); ops.gurobi.TimeLimit 600; % 单次求解上限10分钟 ops.gurobi.MIPGap 0.01; % 1%的MIP间隙 ops.gurobi.NumericFocus 1; % 数值稳定性优先 sol optimize(Constraints, Objective, ops);NumericFocus这个参数值得单独说。机组组合模型里启停变量 0/1 与出力变量的量级差很多再加上风电预测误差的协方差矩阵如果条件数很大数值病态问题会频繁出现。把NumericFocus调成 1 或 2Gurobi 会花更多时间做预处理和数值修正虽然不是每次都有效但很多时候能救回一个原本报“Infeasible”的模型。5. 小算例测试把模型放到真实系统中检验模型写完之后最重要的是通过算例验证。我用的测试系统是修改后的 IEEE 6 机组 24 时段系统外加两个风电场。这个系统规模不大便于快速迭代又能保留机组组合的主要难点。5.1 测试场景设置常规机组参数包括出力上下限、爬坡速率、最小开停机时间、成本系数这些直接参考 IEEE 标准算例。风电场预测曲线我用了一段典型日的出力数据预测误差标准差取预测值的 15%。模糊集半径参数取(\gamma_10.2)(\gamma_21.2)这个取值意味着均值可以在历史估计附近一定范围内漂移二阶矩可以在基准协方差的 1.2 倍范围内变化。作为对比我还跑了三个对照模型确定性模型完全忽略风电误差。场景随机规划用 200 个蒙特卡洛场景。传统鲁棒优化用盒式不确定集边界取预测误差的 90% 置信区间。5.2 结果对比结果对比如下表所示模型类型总成本元机组启动次数上调备用不足风险求解时间确定性模型6.82e58高2s随机规划7.35e510中46s分布鲁棒优化7.68e511低180s传统鲁棒优化8.43e514极低95s从结果可以看到分布鲁棒优化的总成本只比随机规划贵了不到 5%但备用不足风险明显下降。传统鲁棒优化最安全但成本高出约 15%而且因为必须保证所有极端情况都可行机组启动次数明显增多实际操作中调度员往往不愿接受这样的方案。5.3 模糊集半径参数的影响模糊集半径参数 (\gamma_1) 和 (\gamma_2) 对结果的影响也很值得观察。我固定 (\gamma_10.2)让 (\gamma_2) 从 1.0 变化到 2.0结果发现(\gamma_2) 增大时最坏期望成本升高模型预留的备用容量也增加。(\gamma_21.0) 时分布鲁棒优化退化为近似随机规划成本较低。(\gamma_22.0) 时成本逼近传统鲁棒优化保守性明显上升。这说明 (\gamma_2) 的选择实际上反映了调度员对风电预测误差分布不确定性的主观态度。没有绝对正确取值只有基于历史数据校准的合理解释。6. 调参避坑与工程经验总结最后这部分全是实际操作里踩过的坑最有价值。6.1 六个让我折腾很久的坑第一个坑平衡约束漏掉常数项。前面已经讲过线性准则的平衡约束必须拆成常数项和误差项两部分。漏掉常数项约束后模型会给出一个看似最优、实际无法执行的方案。检查方法很简单把风电误差设成零看看优化结果里是否还有机组在做调整。第二个坑最小开停机约束的边界时段。很多人在 t1 之前没有补充机组初始状态。如果测试系统给定了机组初始状态就必须在第一个时段加入状态延续约束否则模型会跟实际物理状态脱节导致计算出的启停计划无法在实际运行中使用。第三个坑爬坡约束与二进制变量耦合。在处理机组启停跨越时段时简单的“p(i,t)-p(i,t-1)RU(i)”并不完整。因为如果机组 t-1 时段停机、t 时段刚启动其出力是从零爬升不是从上一时段的出力值爬升。更严格的建模需要引入启动状态变量并构造条件约束否则可能会低估启动过程的爬坡能力。第四个坑二阶锥约束的数值病态问题。风电协方差矩阵如果直接用历史数据估计经常包含接近零的特征值。在模糊集约束里求逆时会非常不稳定。我的处理是先对协方差矩阵做主成分分析保留能量占比 95% 以上的主成分其余特征值设一个下限避免矩阵病态。第五个坑Gurobi 报 infeasible 时不要先怀疑模型。先检查变量上下界是否矛盾再检查初始状态相关约束最后考虑用relaxation。Gurobi 在 YALMIP 里有一个feasrelax函数可以输出松弛解能快速定位是哪条约束导致的不可行。用了几次之后排查速度明显提升。第六个坑大规模系统的热启动策略。完整 24 时段、几十台机组的模型直接求解很慢。我的做法是先跑一个确定性机组组合把得到的启停方案作为 MIP start 提供给分布鲁棒模型。Gurobi 对 MIP start 的利用效率很高很多时候能把求解时间压缩 40% 以上。具体命令是assign(u, u_initial_solution); assign(p, p_initial_solution); ops.gurobi.MIPStart 1;6.2 代码管理的经验这个项目代码如果按“模型脚本数据脚本结果分析”三个文件组织后期改参数会非常方便。我通常把所有参数集中在data_case.m里模型脚本只负责读参数和建模结果分析单独写一个脚本。千万不要把所有内容堆在一个大脚本里你会被 500 行的矩阵索引绕晕。6.3 可以继续扩展的方向分布鲁棒机组组合模型本身还可以向三个方向扩展一是把网络传输约束加进来变成安全约束机组组合。这时候线性准则要同时考虑节点注入和线路潮流响应系数会变成时空耦合的高维变量求解难度会明显上升。二是考虑储能设备。储能能在风电低谷和高峰之间搬移能量与线性准则结合后相当于给储能增加了一个“线性充放电策略”能在一定程度上平抑风电爬坡。三是把碳约束加进去。现在很多电力系统优化都要考虑碳排放上限可以在目标函数中加碳成本系数分布鲁棒框架本身不受影响只需要多设置一组碳约束即可。回到开头那个调度早会的场景。如果当时我手里有一套分布鲁棒机组组合模型调度员得到的就不会是“预测满发就少开机组”的冒险方案也不是“无论预报什么都多开两台备用”的保守方案而是一套明确考虑了“风电预测误差分布本身就不可靠”的启停计划。这也是我在这个项目里体会最深的一点不确定性的价值在于它提醒我们别把预测模型当真相。线性准则提供了工程上可接受的处理方式分布鲁棒优化则保证了我们在面对未知概率分布时不至于束手无策。这个组合是目前平衡鲁棒性、经济性和可求解性一个相对顺手的选择。