尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

两阶段鲁棒优化在数据中心微网灵活性规划中的Matlab实现

两阶段鲁棒优化在数据中心微网灵活性规划中的Matlab实现 有一位研究生读者来找我说他拿到了一篇EI期刊论文标题是“考虑灵活性的数据中心微网两阶段鲁棒规划方法”想复现却不知道从哪下手。这让我想起自己前两年啃这类论文时被公式和代码来回折磨的经历——两阶段鲁棒优化、CCG算法、不确定性集合、数据中心负荷灵活性每个概念单独看都不算难但合在一起再加上Matlab实现这条线就成了很多人跨不过去的坎。这篇文章我打算把这套方法的建模思路、求解原理和Matlab落地过程完整拆一遍。先说清楚这东西是干什么的。数据中心微网说白了就是把数据中心这种高耗能、高可靠性要求的电负荷和光伏、储能、柴油机、上级电网这些供电资源组合成一个可以独立调控的微电网系统。传统规划方法按最大负荷配置设备结果往往是花了冤枉钱买了一堆一年只用几小时的备用容量。而“考虑灵活性”的规划方法核心思路是把数据中心本身的负荷可调能力比如IT负载迁移、UPS储能参与调节纳入规划模型配合两阶段鲁棒优化在保证最恶劣场景下系统依然安全运行的前提下把投资成本和运行成本压到最低。这篇文章适合三类人。第一类正在做微电网或数据中心供配电方向研究的硕博生尤其是需要复现EI论文的第二类从事园区级综合能源规划、需要在工程中解决不确定性问题的工程师第三类Matlab优化建模爱好者想搞懂YalmipCplex/Gurobi这套工具链怎么处理大规模鲁棒优化问题的。后面我写的内容会尽量照顾到这三个层次模型推导讲清楚来龙去脉代码实现给可落地的框架常见问题就按我实际踩过的坑来写。1. 项目背景与核心问题拆解1.1 数据中心微网为什么需要“灵活性”规划数据中心是出了名的电老虎。一个中型数据中心的IT设备功率可能就是几兆瓦加上冷却系统、供电损耗总负荷轻松翻倍而且全年8760小时基本不停歇不像民用负荷那样有明显的早晚峰谷。更麻烦的是IT设备对供电质量极其敏感电压波动、频率偏移都有可能引发宕机所以传统的供配电设计习惯就是“往高配、往冗余配”——变压器容量留裕度柴油发电机按最大负载配UPS按满载后备时间买。这样做的结果是数据中心微网的投资成本居高不下而很多设备在正常运行时实际负载率不到50%年利用率低得可怜。换句话说传统规划方法本质上是用“过剩的容量”去换“可靠性”花钱买平安。但如果我们换个角度看数据中心这个负荷其实自带“弹性”。第一层弹性来自IT负载调度部分非关键业务的计算任务可以延迟处理或者在不同机柜间迁移相当于电网侧可以把一部分负荷按需削减或平移第二层弹性来自UPS储能系统数据中心本来就必须配备电池储能做不间断供电保障这些电池在保障备电时间之外剩余容量完全可以参与微网的削峰填谷和调频第三层弹性来自冷却系统蓄冷罐、冷冻水系统都有一定的热惯性短时间调节冷冻机组出力不会影响机房温度。这三层弹性叠加起来数据中心就从一个“刚性负荷”变成一个“柔性可调资源”这才是“考虑灵活性”的核心含义。把这层灵活性纳入规划模型意味着在配置储能、光伏、柴油机容量时不需要再按照传统的最大负荷刚性切除来校核而是可以在优化模型里通过约束条件表达“系统在最坏情况下依然可以通过调节IT负荷和储能来保证功率平衡”。这样一来设备容量可以适当下调投资成本显著降低运行阶段则依靠灵活性资源应对不确定性这就是这类方法在经济性上的根本优势。1.2 两阶段鲁棒规划到底解决什么问题先明确一点微网规划天然是一个多时间尺度、多决策主体的问题。你不可能在规划阶段就精确预知未来一年每一天的风光出力和负荷曲线所以必须把问题拆成两个层次——上层做“投资决策”下层做“运行决策”。第一阶段决策发生在规划时间尺度核心变量是设备选型和容量配置比如光伏装多少千瓦、储能装多少千瓦时、柴油机装几台。这个决策一旦做出在规划周期内基本不会变动所以对应成本是一次性投资费用。第二阶段决策发生在运行时间尺度核心变量是每个时刻的调度策略比如储能充放电功率、柴油机出力、从电网买电的功率、数据中心IT负荷的调节量。这个决策依赖第一阶段确定的设备容量同时必须满足各种运行约束。两阶段规划的难点在于第二阶段的运行决策是在不确定性已经暴露的情况下做出的——现实中风光出力、负荷需求都不可能提前精确知道所以规划方案必须能在“最坏情况”下依然有可行的运行策略。随机优化处理这个问题的方式是给不确定量赋予概率分布然后优化期望成本而鲁棒优化走的是另一条路它不给概率分布只给一个不确定集合要求模型对集合内所有可能实现的不确定参数都可行并且优化最坏情况下的成本。这就在数学上形成了一个典型的min-max-min结构。外层min对应第一阶段投资决策中间max对应寻找最坏不确定场景内层min对应第二阶段运行调度。这种三层结构不能直接用常规求解器处理必须借助专门的分解算法而目前在工程和学术圈应用最成熟的就是CCG也就是列与约束生成算法。1.3 EI复现的核心思路与整体框架拿到一篇EI论文做复现最大的忌讳是上来就写代码。我的建议是先做三件事读懂模型假设、理顺变量索引、确认参数来源这三件事做完写代码只是时间问题。先说模型假设。EI论文里的微网拓扑通常不会太复杂常见的配置是一路上级电网连接、一组光伏、一组储能、若干柴油机加上数据中心负荷。论文会在某个不起眼的段落里交代检修率、效率、成本系数的取值这些参数直接影响结果必须完整摘出来。再说变量索引。两阶段鲁棒规划最让人崩溃的就是变量下标投资变量有设备类型下标运行变量有设备和时刻两组下标不确定性变量又有场景和时刻两组下标。我建议复现第一步先把所有变量用纸笔列一张表给每个变量命名规范这样后面写Yalmip代码时不容易乱。最后是参数来源。很多论文的算例参数来自公开数据集或者某个实际园区改造项目如果原文给了基准值直接采用即可如果没给全就需要用行业报告或相近文献的值补全。这里要注意参数不一致会导致你的结果和原文有出入这属于正常现象复现的目标是验证方法和代码逻辑的正确性不是把结果数字逐位对齐。整体框架按模块划分的话可以分成四块数据模块负责生成或读入负荷、风光出力、电价等基础数据模型模块用Yalmip定义目标函数、约束条件和不确定集合求解模块实现CCG迭代流程后处理模块画出投资方案对比、最坏场景运行调度和收敛曲线。下面我按这个顺序逐步展开。2. 数学模型分解与原理剖析2.1 目标函数与两阶段决策变量两阶段鲁棒规划的目标函数在数学上是个完整的表达式但因为存在min-max-min结构实际求解时必须拆开处理。我这里先给出完整的目标函数形式再用大白话解释每一块的含义。第一阶段的目标是投资成本最小可以写成min C_inv Σ_i (c_i_inv × S_i)其中i遍历所有可投资设备光伏、储能、柴油机S_i是第一阶段决策变量即设备配置容量c_i_inv是单位容量投资成本。这个表达式看起来简单但在CCG算法里它会随着迭代不断追加新变量和新约束因为每次迭代都会新增一组第二阶段运行变量和对应的最优割约束。第二阶段的目标是运行成本最小在CCG的子问题中这部分会成为内层优化目标min C_op Σ_t ( c_elec × P_buy_t c_fuel × P_dg_t c_om × P_op_t c_cur × P_cur_t )这里t遍历调度时刻P_buy_t是从上级电网购电功率P_dg_t是柴油机出力P_op_t是各设备的运行功率P_cur_t是切除的负荷量这个变量通常带很大的惩罚系数。注意第二阶段的运行成本是依赖于不确定参数实现的不同场景下为了维持功率平衡购电量、柴油机出力和负荷切除量都会不同。完整的两阶段目标函数是min-max-min嵌套结构如果写成紧凑形式就是min_x { C_inv(x) max_u∈U min_y∈F(x,u) C_op(y) }其中x代表第一阶段投资变量u代表不确定参数风光出力、负荷y代表第二阶段运行变量F(x,u)是在给定x和u下满足全部运行约束的可行域。这个形式是理解CCG算法的钥匙因为CCG的核心就是把中间的max和内部的min通过“枚举极端场景求解子问题”的方式交替推进而不是直接去解这个嵌套表达式。2.2 约束条件全拆解数据中心微网的“灵活性”表达约束条件是模型的核心也是“考虑灵活性”这个标题的灵魂所在。我把约束分成四组一组一组说清楚。第一组是功率平衡约束。数据中心微网在任何时刻都必须满足有功功率平衡P_pv_t P_dg_t P_buy_t P_dis_t P_load_t P_ch_t P_sell_t其中P_pv_t是光伏出力P_dis_t和P_ch_t分别是储能放电和充电功率P_load_t是数据中心总负荷P_sell_t是向电网售电功率。如果考虑IT负荷可调节P_load_t不是一个固定值而是一个区间内的决策变量这正好体现灵活性。第二组是储能系统约束。储能是数据中心本来就有的设备它的蓄电量SOC_t满足递推关系SOC_(t1) SOC_t (η_ch × P_ch_t - P_dis_t / η_dis) × Δt / E_bat同时SOC_t要在安全区间内充放电功率有上下限。这里实现阶段要特别小心SOC递推里的充放电效率是非线性项好在Yalmip处理线性约束没问题这一块直接用线性表达式即可。第三组是数据中心IT负荷灵活性约束。这一组最能体现“考虑灵活性”。数据中心的总负荷可以拆成IT设备负荷和冷却负荷IT负荷可以在一定范围内调节P_it_min ≤ P_it_t ≤ P_it_max同时调节速率有上限-P_it_slope_max ≤ P_it_t - P_it_(t-1) ≤ P_it_slope_max这条速率约束在短时间尺度上相当于给IT设备负载变化加了“爬坡率”防止调度方案要求计算任务短时间剧烈迁移这在工程中不现实。如果原文还考虑了UPS参与调节那UPS备电容量和放电时限也是一组约束核心思想是UPS在保障备电时间的前提下可调度容量是一个随当前SOC变化的动态值。第四组是与上级电网交互约束。购电功率受变压器容量限制购电和售电不能同时发生0 ≤ P_buy_t ≤ P_buy_max × z_buy_t0 ≤ P_sell_t ≤ P_sell_max × z_sell_tz_buy_t z_sell_t ≤ 1这里的z变量是0-1整数变量在子问题里处理对偶时要注意整数变量的存在会导致子问题不能直接对偶实际中要么把子问题拆成纯线性规划处理要么用大M法把逻辑约束线性化。2.3 两阶段鲁棒模型的数学结构与CCG求解原理理解了目标函数和约束之后必须把min-max-min结构本身讲透。我见过不少人拿着论文公式却不知道代码里该怎么写迭代本质上就是对CCG原理理解不到位。CCG算法的基本思想是不要试图一次性求解这个大模型而是把它分解成一个主问题MP和一个子问题SP通过迭代逼近最优解。主问题的形式在迭代第k次时是这样的min_x { C_inv(x) θ }s.t. θ ≥ C_op(y_l), ∀l 1,...,k以及第一阶段的投资约束和第二阶段的运行约束针对前k次迭代中已经找出的极端坏场景u_l^*。看到这里你应该能理解CCG名字里“约束生成”的含义了——每轮迭代向主问题新增一组与坏场景对应的运行变量y_l和约束同时新增一个辅助变量θ来表示运行成本的最坏情况。子问题的形式就是给定主问题解出来的投资方案x^*求解内部的max-min问题max_u∈U min_y∈F(x^*,u) C_op(y)这个问题的物理含义是在已经确定了设备容量的前提下去搜索哪个不确定场景会让运行成本最高同时算出对应最坏场景下的最低运行成本。子问题本身还是一个嵌套结构需要通过强对偶理论把内层min问题转为max问题得到对偶问题后与外层max合并转化为一个单层max问题求解。一旦子问题解出了新的最坏场景u^*和最优值就把它代入主问题再解主问题得到新的投资方案如此反复直到主问题的目标函数值对应运行成本下界和子问题的最优值对应运行成本上界之间的间隙收敛到设定阈值。数学上可以证明CCG算法在有限次迭代内收敛到全局最优解而且收敛速度比传统的Benders分解快得多这也是它在工程中更受青睐的原因。3. Matlab代码实现与核心环节落地3.1 工具准备Yalmip Cplex/Gurobi环境搭建开始写代码之前先把环境搭好。我推荐用Yalmip作为建模语言求解器选Cplex或Gurobi两者都支持二次约束和整数变量处理两阶段鲁棒优化这种规模的模型完全够用。安装步骤并不复杂。先去Yalmip官网下载最新版压缩包解压后把整个文件夹加入Matlab路径然后在Matlab命令行里运行yalmip测试命令如果正常输出版本信息就说明安装成功。求解器方面Gurobi需要申请学术许可Cplex在IBM官网注册后可以下载社区版两者在Matlab里的调用方式类似主要区别在于Gurobi在处理纯线性规划和大规模整数规划时通常更快一些。有一个容易被忽略的细节求解器必须和Yalmip版本兼容。早期版本的Yalmip和最新版Cplex之间可能因为接口变动导致调用失败我自己的经验是装好求解器后先跑一遍Yalmip自带的示例脚本能跑通再进主流程避免在建模一半的时候才发现求解器接口有问题。3.2 不确定集合的参数化设计两阶段鲁棒规划的核心输入之一是不确定集合。最常用的两类是盒式集合和带预算约束的盒式集合。盒式集合的定义是每个不确定参数独立地在一个区间内取值U { u : u_min ≤ u ≤ u_max }这种集合的优点是简单直观缺点是过于保守——它允许所有不确定参数同时取到最坏值而现实中风光出力不可能同时达到最低、负荷也不可能同时达到最高。为了在鲁棒性和经济性之间找平衡工程上普遍使用预算不确定集合U { u : u_min ≤ u ≤ u_max, Σ |(u_t - u_nom_t)| / Δu_t ≤ Γ }这里的Γ就是预算值它限制了总的不确定偏离程度。Γ取0时模型退化为确定性模型Γ取最大值时等价于盒式集合。在Matlab实现中预算约束需要引入辅助变量来线性化绝对值项Yalmip支持这种建模直接在约束里用abs()函数即可。参数化过程有一个关键点不确定参数的区间宽度不能拍脑袋定。比较靠谱的做法是搜集历史运行数据用正态分布拟合每个时段的风光出力和负荷波动范围取95%置信区间作为上下界。如果没有历史数据可以参考相似规模微网的公开年报数据做估算区间宽度取基准值的5%到15%之间这个范围在算例中比较常见。3.3 CCG主子问题迭代的Matlab实现现在进入最核心的部分怎么写CCG迭代。这里我给出一个精简但可运行的框架具体的参数设置需要根据你自己的算例调整。先定义主问题的求解部分。在Yalmip中主问题里需要使用sdpvar定义投资变量以及一个θ变量表示运行成本估计值。由于CCG是迭代的每次迭代都需要向主问题“追加”新变量和新约束所以代码结构上应该把主问题的变量和约束放在一个动态增长的存储结构中。% 主问题建模第k次迭代时调用 function [x_opt, theta_opt] solve_MP(x_var, y_cell, constraint_cell, params) % x_var: 第一阶段投资变量 % y_cell: 每一轮迭代对应的第二阶段运行变量单元数组 % constraint_cell: 每一轮迭代对应的运行约束单元数组 % 目标函数C_inv(x) theta Objective params.C_inv * x_var theta_var; % 约束组装 Constraints [investment_constraints]; for l 1:length(y_cell) Constraints [Constraints, theta_var params.C_op * y_cell{l}]; Constraints [Constraints, constraint_cell{l}]; end % 求解 optimize(Constraints, Objective, sdpsettings(solver, gurobi)); x_opt value(x_var); theta_opt value(theta_var); end再看子问题的实现。子问题是一个max-min结构需要对内层min问题做对偶转换。在Yalmip中可以用dual方式直接建立对偶问题但更稳妥的做法是根据原问题的拉格朗日函数手动推导对偶问题因为自动对偶在某些约束下可能产生不容易调试的表达式。% 子问题建模给定x_opt求解最坏场景 function [u_worst, obj_val] solve_SP(x_opt, params) % 定义第二阶段运行变量 y 和不确定变量 u y sdpvar(size_y, 1); u sdpvar(size_u, 1); % 不确定集合约束 Constraints_U [u_min u u_max, sum(abs(u - u_nom)/delta_u) Gamma]; % 定义运行约束 F(x_opt, u, y) 0 Constraints_F build_operation_constraints(x_opt, u, y, params); % 对偶问题这里简化为直接调用Yalmip的内层处理 % 实际实现中需要把min_y C_op(y) 转为对偶形式或者用KKT条件 Constraints [Constraints_U, Constraints_F]; Objective params.C_op * y; % 为了让求解器处理max-min需要把内层min目标换成对偶形式 % 完整代码中这里会构造对偶问题并求解 optimize(Constraints, -Objective, sdpsettings(solver, gurobi)); u_worst value(u); obj_val value(Objective); end需要说明上面的代码只是主流程的骨架真正写完整代码时子问题的对偶化处理是最复杂的一步。我见过不少复现工作卡在这里主要原因是内层min问题包含等式约束和不等式约束对偶时需要区分哪些约束对应非负对偶变量哪些对应自由对偶变量。一个建议是先用纸笔对一个小规模算例手动完成对偶推导验证逻辑无误后再写Matlab代码这比直接在代码里调试数学问题快得多。此外CCG迭代总控代码也要特别注意收敛判据的设置。通常把间隙定义为Gap (UB - LB) / LB其中LB是主问题目标函数值UB是子问题目标函数值加第一阶段投资成本。迭代终止条件可以设为Gap小于某个阈值比如0.01%或0.1%具体看你要复现的论文要求。3.4 结果可视化与对比分析算例跑完之后结果分析是体现“复现完成度”的关键环节。至少三张图是必须画的。第一张是投资方案对比图。把考虑灵活性前后的设备配置容量放在一张柱状图上对比横轴是设备类型纵轴是配置容量一眼就能看出灵活性约束带来的容量下降幅度。通常储能容量会明显下降光伏容量变化不大柴油机容量可能略有上升——这是因为灵活性约束降低了峰值负荷的刚性需求但极端场景下仍然需要柴油机兜底。第二张是最坏场景下的运行调度图。把子问题求出的最坏场景下光伏出力、负荷、储能SOC、购电功率画成堆叠面积图或曲线图验证功率平衡约束是否满足同时观察储能和IT负荷调节在哪些时刻起了关键作用。第三张是CCG迭代收敛曲线。横轴是迭代次数纵轴是上下界数值两条曲线应该逐渐靠拢并最终贴合这是判断代码正确性的最直观证据。如果上下界震荡不收敛那多半是主问题或子问题里某个约束写错了下面第五节会详细讲这个问题的排查思路。4. 常见问题与排查技巧实录4.1 求解器配置与Yalmip报错排查我在复现工作中遇到最多的就是环境问题一类是求解器找不到另一类是Yalmip版本不兼容。求解器找不到的典型报错是No suitable solver found常见原因有两个。一是求解器安装后没有加入Matlab路径二是调用optimize函数时没有指定solver参数。解决办法是在调用时显式指定sdpsettings(solver, gurobi);或者在optimize命令里用sdpsettings选项指定求解器。如果确认求解器已经正确安装但依然报错可以运行yalmiptest命令它会列出Yalmip能找到的所有求解器接口方便定位问题。还有一个容易被忽视的坑Yalmip默认会调用它认为“最适合”的求解器但在某些情况下它会优先选择已经安装在路径上的其他求解器比如默认的sedumi或sdpt3这些求解器处理大规模线性规划效率很低可能导致程序卡死或内存溢出。所以无论什么时候都要在sdpsettings中显式指定Gurobi或Cplex。4.2 子问题对偶推导错误导致收敛异常CCG迭代不收敛十有八九是子问题写错了。子问题的最坏场景搜索结果出了问题主问题就会被带入错误的场景和割平面上下界自然无法收敛。最常见的一个错误是内层min问题的对偶推导遗漏了某些约束。比如储能SOC递推约束在原始问题里是等式约束对偶变量应该是自由变量但有人把它当成非负变量处理导致对偶问题可行域错误子问题求出的“最坏场景”根本不是真正的最坏场景主问题的割平面自然无效。排查这类问题有一个技巧用一个小规模随机算例分别用暴力枚举法和CCG算法求解对比两者结果是否一致。暴力枚举法就是把不确定集合离散化对每个离散场景依次求解运行优化问题取最大值作为最坏情况成本。小规模算例下暴力枚举完全可以跑完如果CCG的结果和暴力枚举结果不一致那基本可以判定是子问题推导或实现有问题。4.3 大M参数选择与数值稳定性问题两阶段鲁棒模型中有不少逻辑约束需要大M法处理比如购电和售电不能同时发生的0-1约束、设备启停的二进制指示变量等。大M的取值如果过大会引入严重的数值病态问题导致求解器在可行域边缘反复震荡如果过小又会错误地削减可行域导致得到次优解。大M的选择应遵循“刚好比约束物理上限大一个量级”的原则。比如购电功率上限是5MW那M取6或8就足够不要习惯性地取1e6。这在模型里也要注意主问题和子问题的大M参数必须保持一致我见过有人主问题用M1000子问题用M1e5结果两个问题描述的可行域根本不一样CCG永远无法收敛。还有一个实用技巧把模型中的变量量纲统一到同一数量级。比如功率用kW成本用万元SOC用0到1的标幺值这样可以显著提升求解器的数值稳定性。这个问题在做大规模算例的时候尤其突出因为我处理过一个节点数较多、参数跨数量级的模型统一量纲后求解时间缩短了近一半。4.4 结果不合理的系统排查思路代码能跑、收敛曲线也正常但画出来的设备配置或运行调度图怎么看都不对劲这种情况我也遇到过几次往往是最隐蔽的逻辑错误。我总结了一套排查顺序先检查参数输入和量纲这是最容易被忽视却最容易出问题的地方再检查功率平衡约束是否真的满足在Yalmip里可以对求解后的变量做一次完整校验看每个时刻的功率出入是否相等然后检查储能SOC曲线是否在安全范围内如果SOC长期贴在边界上甚至越界那多半是SOC递推公式里的效率项写错了最后检查IT负荷调节变量是否越界如果灵活性调节幅度超过给定区间说明约束条件没有正确写入可能是在Yalmip变量索引上出了问题。排除法是个好用的思路。把预算值Γ设为0此时模型退化为确定性规划如果确定性结果都不合理那问题一定出在模型本身的参数或约束而不是鲁棒求解部分如果确定性结果正常再把预算值逐渐调大观察结果是否合理地趋于保守。这样逐级深入可以快速锁定出错位置。5. 复现工作的延伸拓展与个人体会代码跑通只是第一步真正把这套方法用在工程或研究里还有几个方向可以深入拓展。第一是把单目标扩展为多目标数据中心微网规划不仅要考虑经济性还要考虑碳排放和新能源利用率这时可以把目标函数改成加权和或者用NSGA-II这类多目标进化算法搜索帕累托前沿。第二是引入场景概率信息把纯鲁棒优化改成分布鲁棒优化用Wasserstein距离构建模糊集这样既保留了鲁棒优化的安全性又在平均性能上有更大提升空间。第三是考虑更细致的运行策略比如把数据中心IT负载调度细化到虚拟机层面把冷却系统的蓄冷能力建模为虚拟储能进一步挖掘灵活性资源的潜力。整个项目做下来我最深的一个体会是复现EI论文真正的难点不是那些花哨的公式而是把公式“翻译”成代码时各种细节的统一。变量命名是否清晰、索引是否对齐、参数的物理单位是否一致、大M取值是否恰当这些看似不起眼的小事决定了你调试三天还是三周。所以我特别建议在开工之前先画一张变量表把符号、含义、单位、索引范围全部写清楚贴在最显眼的地方写代码时随时对照这能帮你省掉大量来回翻论文的时间。另外一件事也值得多说一句CCG算法的调试一定要从小算例开始。这个道理虽然老生常谈但我在实际中看到很多人一上来就用自己的真实数据跑一旦不收敛根本分不清是模型错误还是算法实现问题。我先用一个3个时刻、2类不确定参数的小算例把整个流程调通确认逻辑无误之后再扩充到24小时或8760小时的真实规模。有了这个小算例作为基准后面出了问题也有对照物可比对排查效率会高很多。如果你也在复现这个方向的论文希望这篇内容能帮你少走一些弯路。代码框架和调试思路都很清楚了剩下就是耐着性子把每一个细节抠扎实——这活儿确实磨人但跑通一次之后你对两阶段鲁棒优化的理解会比看十篇论文都深刻。
返回列表