ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

数据中心微网两阶段鲁棒规划:灵活性建模与复现实践

数据中心微网两阶段鲁棒规划:灵活性建模与复现实践 数据中心微网的规划问题近两年在EI期刊里出现的频率越来越高尤其是“两阶段鲁棒优化”这个方向。手里正好在复现一篇相关的论文题目是“考虑灵活性的数据中心微网两阶段鲁棒规划方法”折腾了差不多三周把Matlab代码从头到尾跑通、改稳了这里把完整思路和实操记录整理出来希望能帮到正在做类似方向的同行。先说结论这篇论文的核心贡献是把数据中心的负荷灵活性主要是IT负载的可转移性和机房空调的储能特性纳入微网规划的决策框架用两阶段鲁棒优化处理风光出力和负荷的不确定性最终得到一组“在最恶劣场景下仍能保证经济性和可靠性的”设备配置方案。说白了就是告诉你在光靠运气不行的情况下变电站、储能、燃气轮机、光伏到底该建多大才能既省钱又扛得住意外。复现工具是Matlab求解器用的Cplex和Yalmip代码量不算大主程序加子函数大概两千行但里面的建模思路和求解技巧很值得拆开讲一讲。这篇文章一旦把逻辑理清楚很多类似的两阶段鲁棒规划问题都能套用这套框架复现价值非常高。1. 内容整体设计与思路拆解1.1 为什么要把“灵活性”单独拎出来传统微网规划只考虑“供需平衡”把负荷当作刚性需求有多大负荷就配多大电源。但数据中心不一样它的负荷天然具有可调节性。数据中心的IT设备承担的计算任务可以在时间上平移比如离线训练任务、数据分析批处理延后半小时执行完全不影响业务。数据中心内部的精密空调系统更是自带蓄冷能力机房温度在一定范围内波动空调电耗就能像电池一样“充电放电”。这两块加起来就是数据中心微网区别于普通园区微网的核心差异点电源侧有不确定性负荷侧也有调节空间规划时要把两侧的灵活性同时考虑进去。所以论文的模型里负荷不是给定常数而是被拆成了固定负荷、可转移IT负荷、温控负荷三部分。固定负荷必须满足可转移负荷可以跨时段平移温控负荷允许在舒适度范围内调整。这样一改微网规划就不再是简单的最小装机容量问题了而是一个“在不确定性环境下决定容量配置再在运行中利用灵活性消纳风险”的联合决策问题。1.2 两阶段鲁棒规划为什么适合这个场景确定性优化在规划领域的局限性这几年暴露得很明显风光出力预测误差一旦超过预期配置出来的微网不是弃风弃光严重就是极端场景下切负荷。随机规划理论上考虑概率分布但实际工程中很难拿到准确的分布数据而且场景数量一多计算量直接爆炸。鲁棒优化换了个思路不求平均情况最优而是要求“最坏情况”下仍然可行。两阶段鲁棒规划的具体做法是第一阶段Here-and-Now决定设备容量比如光伏装多少、储能配多大、燃气轮机选什么型号这个阶段不依赖不确定参数的具体值必须在不确定性实现之前拍板。第二阶段Wait-and-See不确定性发生后根据实际风光出力和负荷水平调整各设备的出力计划保证系统安全运行。数据中心的灵活性在第二阶段发挥的作用就很清晰了。当风光出力不足时把IT任务往后推一推空调温度放宽半度就能少切负荷甚至不切负荷。这比单纯靠储能硬扛的规划方案在成本和可靠性上都有优势。论文用列约束生成CCG算法求解这个min-max-min结构的问题主问题是设备投资决策子问题是在给定容量下寻找最恶劣场景并优化运行策略。CCG比传统的Benders分解收敛快很多这也是这篇论文能在可接受时间内求解的主要原因。1.3 复现方案的选型考量拿到论文后我首先确定复现的技术路线Matlab Yalmip Cplex。选这个组合的原因很简单第一Yalmip把鲁棒优化建模的语法封装得很干净用uncertain定义不确定集用robust约束描述鲁棒对应代码的可读性比直接调Cplex API高一个数量级第二Cplex对混合整数线性规划MILP的求解效率是商业求解器里的第一梯队两阶段鲁棒问题本质上就是反复求解MILP这个场景正好是Cplex的强项。有一点需要提前说明很多同学以为Yalmip能直接处理max-min问题其实在Yalmip里写鲁棒优化需要手动转换或者借助辅助变量。论文里对偶转换的部分必须自己手推Yalmip能帮的只是建模层面。这个坑我一开始就踩了后面在3.3节会详细讲。参数设置上我尽量贴近论文原文的数据光伏容量候选范围、储能容量和功率的离散取值、燃气轮机型号序列以及数据中心的负荷曲线。这些参数不一定要和论文完全一致但量级和比例关系必须对得上否则结果的可信度就打折扣了。2. 核心细节解析与实操要点2.1 数据中心负荷建模的三种形态这一块是整个模型最花心思的地方直接决定规划结果的合理程度。固定负荷没什么好说的就是服务器待机功耗、网络设备功耗等基本恒定的部分完全不可调。真正需要啃的是另外两种负荷。可转移IT负荷的建模思路是用“总计算量守恒”约束代替传统的逐时段功率平衡。具体来说一天24小时内的总计算任务量是确定的但每个时段安排多少计算任务、消耗多少电是可以优化的。约束条件有两个一个是每个时段处理的IT任务不能超过服务器的处理上限另一个是任务总量守恒。这套约束写出来之后IT负荷就具备了天然的时间平移能力。温控负荷建模更微妙。数据中心的空调系统负责带走服务器散热空调耗电量近似等于散热量除以能效比COP。机房热容的存在使得温度变化是渐进过程短时间内空调少出力一点机房温度也不会立刻超限。论文把机房简化为一个等效热容模型T_in(t1) T_in(t) Δt/(R·C) · (T_out(t) - T_in(t)) Δt·Q_IT(t)/C - Δt·COP·P_AC(t)/C这里T_in是机房温度P_AC是空调功率Q_IT是IT设备散热量。这个式子本质上是热力学中的能量守恒方程物理意义很明确机房温度变化 围护结构传热 IT设备散热 - 空调制冷。约束温度在允许范围内波动空调功率就变成了一台虚拟储能。实操中有一个很关键的细节我的复现里只取了热容模型的简化形式假设R和C是常数。实际数据中心的传热过程比这复杂得多气流组织、局部热点都会影响温度分布。但作为规划层面的模型这种简化完全够用重点在于刻画“温度惯性”这个本质特性而不是精确预测温度场。2.2 两阶段模型的目标函数与不确定性处理目标函数是老生常谈的两块投资成本加运行成本。投资成本包括光伏组件、储能系统、燃气轮机的等年值购置费用和安装费用运行成本是调度周期内从电网购电的费用加上燃气轮机的燃料成本。等年值的处理要注意设备寿命不同要统一折算到每一年这个我在4.1节的参数表格里会展开。不确定性集合的构造是鲁棒优化里最有讲究的地方。论文用的是盒式不确定集也就是假设风光出力和负荷的真实值落在预测值加减偏差的区间内同时加一个总偏差约束来控制不确定预算。写成数学形式是U {w : w_min ≤ w ≤ w_max, Σ|w - w_pred|/w_pred ≤ Γ}这里的关键参数是Γ不确定预算它代表最恶劣场景下总偏差的累积程度。Γ越大系统要对抗的扰动越强规划出来的容量就越保守投资成本也越高。论文分析Γ从0到24变化时总成本的变化规律我复现出的结果和论文趋势一致Γ较小时成本上升平缓当Γ超过某个阈值后成本开始加速上升说明过度追求鲁棒性的边际代价是递增的。一个重要的实操心得不确定集里的负荷也同样处理成区间变量。这里很多初学复现的人会搞错默认负荷是固定值只在风光出力上做鲁棒。实际上论文的创新点之一就是把数据中心负荷的灵活性作为不确定性下的应对资源如果负荷不加区间模型的鲁棒性就只靠电源侧设备去对抗灵活性资源的作用体现不出来。2.3 子问题对偶转换的关键推导两阶段鲁棒问题的求解难点在于内层的max-min结构。给定第一阶段的决策变量后子问题要寻找最恶劣场景max层同时在这个场景下做最优调度min层。CCG算法不会直接求解这个嵌套问题标准做法是把内层的min问题通过对偶转换成max问题这样max-min就合并成了max-max等价于一个max问题。我在复现过程中最开始对这一步掉以轻心直接在Yalmip里试图用uncertain声明不确定变量结果求解器报错或者直接给出错误结果。后来回到手推对偶这条路才把问题解决。具体推导过程需要用到拉格朗日对偶方法。把第二阶段min问题的约束全部乘上对偶变量加入目标函数然后求关于原始变量的无约束极值再整理成对偶问题的目标函数和约束。这个过程在技术上不复杂但工程量大尤其是带有二元变量和逻辑约束的模型对偶形式会变得非常绕。在代码实现上有两个处理技巧一是尽量把子问题写成矩阵形式用A*x ≤ b这种紧凑格式做对偶推导而不是展开成几十个标量约束。这样手推和编码都不容易错。二是注意互补松弛条件的处理。CCG算法不需要把内层min问题完整对偶后解析求解场景变量而是把最恶劣场景作为新增变量返回主问题。具体实现时对偶后得到的是给定容量下的最恶劣运行成本然后从对偶解中得到对应的不确定参数取值加到主问题的约束集合中。这个“返回最恶劣场景”的环节是CCG比Benders简单直接的地方。注意Yalmip中可以用dual命令直接提取对偶变量的值但前提是模型被求解器正常求解过。如果在optimize之前就去调用dual会拿到空矩阵这是一类很常见的低级错误。3. 实操过程与核心环节实现3.1 环境准备与基础数据搭建我用的环境是Matlab R2023a Yalmip R20230629 Cplex 12.10操作系统是Windows 11。Yalmip和Cplex的版本匹配问题值得多说一句Cplex 12.10对应的是较早的接口版本在Matlab 2023a上需要添加C:\Program Files\IBM\ILOG\CPLEX_Studio1210\cplex\matlab\x64_win64到路径中然后在Matlab里执行addpath(genpath(你的Yalmip目录))完成Yalmip的安装。初始数据分四块配置负荷数据、风光数据、设备参数、经济参数。我用的典型日曲线是以24小时为周期光伏出力在中午12点左右达到峰值风电出力给了一条波动较大的序列数据中心的总负荷呈现双峰特征上午10点和晚上21点左右各一个高峰这是根据论文给出的典型数据中心日负荷曲线提炼的。一个值得注意的数据处理细节是数据中心的IT负荷曲线不能直接套用普通园区的负荷曲线。普通园区负荷晚上是低谷但数据中心的夜间负荷往往仍然很高甚至因为夜间气温低、空调能效高反而会安排更多计算任务。我做数据时把可转移负荷的比例设为总IT负荷的30%温控负荷的比例设为空调总负荷的20%并验证了这两个比例下模型仍有可行解。3.2 主问题代码实现与变量定义主问题的决策变量是设备容量。光伏容量在0到500kW之间以50kW为步长离散取值储能容量在0到2000kWh之间以200kWh为步长离散取值储能功率和容量配套燃气轮机在“不建、建一台、建两台”之间选择。每种设备的投资单价来自论文数据集这里列一下核心参数参考值设备单位投资成本寿命备注光伏组件4500元/kW20年含逆变器及安装储能系统1800元/kWh10年磷酸铁锂含PCS成本燃气轮机3000元/kW15年单台容量200kW数据中心IT设备围护改造500元/m²20年提升围护热惰性Yalmip建模的关键代码片段如下这里给出主问题的大致框架%% 主问题变量定义 P_pv_inst binvar(1, num_pv_candidate, full); % 光伏容量选择0-1变量 E_sto_inst binvar(1, num_sto_candidate, full); % 储能容量选择0-1变量 P_gt_inst binvar(1, num_gt, full); % 燃气轮机机组投建0-1变量 % 容量向量 C_pv P_pv_candidate * P_pv_inst; % 折算出光伏实际安装容量 C_sto E_sto_candidate * E_sto_inst; % 折算储能容量 P_sto_power C_sto / 2; % 储能功率按容量一半配置简化处理 % 投资成本等年值 inv_cost C_pv * cost_pv * CRF_pv C_sto * cost_sto * CRF_sto ... P_gt_inst * cost_gt * CRF_gt; %% 运行成本部分第一阶段也需要初值否则第1次迭代无可行解 oper_cost sdpvar(1, 1);运行成本的初值处理和迭代初始化在这里有讲究。第一次迭代时主问题里还没有从子问题返回的约束运行成本部分无法求解。我的处理是先不加运行成本跑一次空主问题或者直接给运行成本一个很大的初值作为上界两种方式都能保证第一次迭代正常启动。3.3 子问题代码实现与CCG迭代逻辑子问题的输入是主问题传来的设备容量参数输出是最恶劣场景下的最小运行成本和对应的不确定参数取值。在代码层面子问题是一个max-min问题标准做法是先把内层min对偶成max然后整体变成单层的max问题。手动对偶这一块即使在Yalmip里也必须手写。我在实现中把子问题的内层min问题写成标准矩阵形式$$\min ; c^T x d^T u$$$$s.t. ; Ax Bu \leq b$$其中x是运行变量各时段设备出力u是不确定参数风光出力和负荷。对偶后得到$$\max_{\lambda, u} ; \lambda^T (b - Bu)$$$$s.t. ; A^T \lambda c, ; \lambda \geq 0$$注意这里的u作为优化变量出现在目标函数中和λ一起构成了新的双层优化结构但因为u的可行域是简单的区间约束这个双层结构可以直接合并成单层问题求解。具体做法是对λ的每个分量检查B对应列的正负号若为正则取u的下界若为负则取u的上界。这样就把不确定变量的取值直接嵌入对偶问题中减少了变量数量。CCG主循环的代码逻辑如下%% CCG主循环 % ub和lb分别是上界和下界 ub inf; lb -inf; iter 0; while (ub - lb) / ub 1e-4 iter iter 1; % 1. 求解主问题得到设备容量 optimize(master_constraints, inv_cost theta, sdpsettings(solver,cplex)); lb value(inv_cost theta); C_pv_k value(C_pv); C_sto_k value(C_sto); % 2. 把设备容量传给子问题求解最恶劣场景 assign_params_to_subproblem(C_pv_k, C_sto_k); optimize(sub_constraints, -sub_obj, sdpsettings(solver,cplex)); % 注意子问题用max形式建模目标函数取负号 ub min(ub, value(inv_cost) value(sub_obj)); % 3. 提取对偶解中的不确定场景 u_k value(u_uncertain); % 4. 把最恶劣场景作为固定参数重新生成一组运行变量 % 加入主问题的约束集合并新增对应的θ辅助变量 add_cut_to_master(u_k); % 5. 输出当前迭代信息 fprintf(Iter %d, lb %.4f, ub %.4f, gap %.4f\n, ... iter, lb, ub, (ub-lb)/ub); end一个需要特别注意的代码坑主问题中θ是辅助变量代表子问题返回的运行成本。每轮迭代加入新场景后θ需要新增一个变量而不是覆盖旧变量。如果处理不当主问题会退化成一个“只对最后一次场景约束有效”的问题导致迭代不收敛或者结果明显偏差。我的处理方式是用一个cell数组保存每轮迭代产生的一组运行变量然后把所有轮次的约束一起添加到主问题中。这样主问题的规模会随着迭代次数线性增长但实际操作中CCG通常10轮以内就能收敛规模增长完全在可接受范围内。3.4 收敛判据与结果输出的处理论文的收敛判据是上界和下界的相对间隙小于1%我在复现时把阈值收紧到了0.01%也就是1e-4效果更好。这里说明一下为什么能收紧子问题是精确求解的主问题的下界会不断上升且收敛到最优值因此CCG的收敛性质天然好阈值设紧一点不会导致死循环反而让结果更可信。结果输出的格式我参考了论文的图表样式横轴是不确定预算Γ纵轴是总成本画一条折线再画一组堆积柱状图展示不同Γ下各设备的容量配置。另外画了最恶劣场景下的功率平衡图显示光伏、风电、储能、燃气轮机、购电和可切负荷各占多少。在实际画图时有一个数据处理的细节储能SOC曲线必须检查是否越界。鲁棒最优解有时会让储能在某些时刻到顶或放空如果SOC的下界约束没绑紧图上会看到SOC直接“穿墙”说明模型有bug需要回头检查约束条件。4. 常见问题与排查技巧实录4.1 求解器报错“Infeasible problem”的排查这个问题基本每个复现两阶段鲁棒的人都遇到过我也是反复折腾了很久。子问题对偶后出现不可行最常见的原因有三个。第一个原因是子问题中的等式约束处理不当。对偶转换时等式约束对应的对偶变量是自由变量不是非负约束。如果手推对偶时把自由变量误写成非负变量对偶问题必然不可行。这个错误特别隐性因为原始问题的可行域看上去没毛病但对偶后就是不成立。我的排查技巧是随便取一个可行的容量配置把不确定参数固定成预测值先检查内层min问题本身可不可行如果min可行但max对偶不可行问题一定在对偶推导逐行检查约束和对应变量。第二个原因是互补松弛条件没有满足。有些场景变量和运行变量之间存在逻辑约束比如燃气轮机启停状态和出力上下限的关系。这类逻辑约束涉及到额外的二元变量对偶推导会变得更复杂一旦处理不当就会出现主问题可行但子问题不可行的情况。解决办法是把逻辑约束从子问题剥离放到主问题做联合优化代价是增加计算量但稳定性显著提升。第三个原因是数值问题。Cplex默认的数值容差在某些情况下会让约束条件“看起来”被违反。我用sdpsettings(cplex.eprint, 1e-9)把输出精度调高再用cplex.tolrinfeas调整可行容差这样能看到到底是哪些约束在多大程度上被违反有助于快速定位问题。4.2 不确定预算Γ与场景总数的关系在复现过程中我专门做了Γ从0开始逐步增加的实验。Γ0意味着不确定集退化为预测值问题退化成确定性规划这时候的结果等价于直接跑一个确定性MILP可以作为基准验证模型正确性。Γ取值逐渐增大后最恶劣场景的选择范围也扩大CCG迭代轮数会稍多但整体仍在可接受范围内。值得注意的是论文里Γ的取值范围不是随意定的它的物理意义是24小时内总偏差的累积预算。比如Γ6表示允许6个时段内风光出力同时取到偏差上限这在实际工程中已经是相当保守的场景了。实操中我发现一个规律Γ超过12以后总成本的上升开始加速且增加的容量主要体现在储能上光伏容量反而会略微下降。这说明当系统面临较大供需不确定性时可控性更好的储能比依赖天气的光伏更有吸引力。这个结论在论文里用图表展示过我的复现结果也验证了这一趋势。4.3 两层最优性间隙不一致的问题有时候主问题收敛了但最终得到的容量配置和预期不太一样检查后发现是最坏场景下的运行成本与主问题θ值不一致。这个问题的根源在于提取场景和生成割约束的顺序必须先解出子问题的最优解和对应的场景值然后用这个场景生成割约束加入主问题如果场景提取的代码写在求解子问题之前提取到的就是上一轮迭代的场景导致割约束和运行成本不匹配。解决方法是写一个临时变量保存本轮子问题求解后的场景值确认求解成功后再调用添加割的函数。我在代码里加了一个检查语句如果optimize返回的problem状态不是0求解成功就直接报错退出并打印子问题的约束条件避免带着错误状态继续迭代产生不可信结果。另一个隐蔽的问题涉及到Yalmip的变量索引。如果子问题里用sdpvar重复定义变量名且没有在每次迭代时把旧的变量清空Yalmip的变量池会被旧约束污染。常规做法是在每次调用子问题前先执行clear相关变量或者把子问题封装成独立函数函数内部的变量是局部的天然隔离。提示独立的函数封装是解决这类“变量污染”问题最彻底的办法。子问题的建模代码写成function [obj, u_result] subProblem(C_pv, C_sto, data)内部所有变量都是局部变量每次调用自动重建不会再出现跨迭代的变量状态残留问题。4.4 不同求解器之间的结果差异我在Yalmip里还试过用Gurobi替换Cplex求解同一个模型。结果在大多数情况下两者得到的容量配置一致但偶尔会出现Gurobi比Cplex多迭代几轮的情况原因是两边的对偶单纯形算法和数值处理机制略有差异。在精度要求不高的场景比如验证模型正确性两者没什么区别但发论文阶段建议统一用Cplex因为审稿人更熟悉这个求解器的结果输出格式。有个计算时间的参考在我的机器上i7-12700H32GB内存Γ6时的CCG运行时间大约在3分钟到8分钟之间轮数在7到9轮。如果超过15轮还没收敛基本可以断定模型代码有bug不要傻等赶紧回头检查场景更新和割约束是否写对。4.5 如何检验复现结果的正确性判断复现是否成功的标准不是看代码有没有跑通而是看结果是否符合模型的内在逻辑。我的三个验证办法第一Γ0时结果必须等于确定性规划的结果。这个验证是必要条件如果Γ0都解不对说明模型基础就错了不用往后看。第二不同Γ下的总成本曲线必须是单调递增的。不确定集的范围变大最恶劣场景更差总成本不可能下降。如果曲线出现下降段一定有割约束遗漏或者场景更新逻辑有误。第三输入的负荷曲线从“数据中心模式”改成“普通园区模式”即去掉可转移负荷和温控柔性重新运行后得到的储能配置应该明显增加用来补偿失去的灵活性。这个对比实验直接验证了论文的核心论点数据中心的灵活性资源能有效降低储能投资需求。5. 灵活性的价值量化分析5.1 储能容量随Γ的变化规律把Γ0和Γ12两种场景下储能容量的配置放在一起对比差异很明显。Γ0时储能只需配备满足削峰填谷的最小容量而Γ12时储能容量增加了30-50%。原因是鲁棒优化要求最恶劣场景下系统仍然不缺电光伏出力低、负荷高的组合场景必须靠储能顶上。有意思的是光伏容量的变化趋势和储能相反。Γ增大后光伏的规划容量反而略微下降因为鲁棒优化会避开“主要依赖光伏”这种高风险方案。这里体现了鲁棒规划和随机规划的差异随机规划求期望最优所以会倾向于多装光伏占便宜鲁棒规划求保底最优所以愿意牺牲一部分经济性换取稳定性。5.2 负荷灵活性对容量配置的替代效应论文中的一个关键对比实验是在有数据负荷和无数据负荷两种模式下分别做规划。我的复现数据显示有数据负荷即可转移IT负荷和温控负荷参与优化时储能需求降低了18%-22%燃气轮机容量降低了12%-15%。原因很直观可转移负荷相当于一台虚拟储能温控负荷的蓄冷特性也为系统提供了额外的灵活调节空间物理储能的需求自然变小。这个数值背后的实际意义对应到数据中心的运营决策上就是与其花几百万配一堆电池不如花很少的钱把机房设备升级成可调度的智能控制模式几乎零成本地获得等效储能。这是数据中心微网规划的一个非常重要的经济性结论也是这篇文章区别于传统微网规划研究的核心贡献。5.3 不确定预算对投资回收期的影响把等年值成本换算成投资回收期Γ6时回收期从Γ0时的7.3年延长到8.1年。表面上看鲁棒性会拉长回收期但我仔细分析了运行成本的变动后觉得这个判断需要修正。因为Γ6的方案在最恶劣场景下仍能保证正常运行而不需要高价购电或切负荷避免了极端情况下的惩罚成本从“期望总成本”的角度看反而更优。如果你只看平均成本会得出“鲁棒规划更贵”的结论但把风险成本算进去结论就会反转。6. 个人实操体会与后续扩展方向整个复现过程走下来最大的感想是两阶段鲁棒规划难的不是数学推导而是工程实现中各种隐蔽细节的串联。比如对偶转换时的变量类型对应、CCG迭代中割约束的去重、子问题返回场景值的顺序任何一环出了bug结果都可能是“看起来正常但实际错误”的。代码调试上我总结了三个实用的习惯。第一每轮迭代都打印详细的日志包括当前迭代次数、主问题上界、子问题下界、割约束包含的时段数和成本值这样即使结果不对也能快速回溯第二尽量把主问题和子问题封装成独立函数接口通过参数传递避免跨迭代的变量污染问题第三设一个最大迭代次数上限比如20次超过就强制退出并报警防止死循环。从复现到应用的层面看这套方法往后可以扩展的方向还挺多。数据中心微网的规划问题里新能源出力不确定性的描述还可以换成分布式鲁棒优化把历史数据和矩信息加进去减少保守性。也可以考虑把参与调峰、需求响应市场等灵活性收益纳入目标函数让模型更贴近实际的数据中心商业运营场景。另外说说代码质量这一块。提交给EI期刊的复现代码注释和数据结构一定要清晰。我去掉了很多调试用的中间输出用中文写清楚每个函数的功能、输入参数、输出变量和关键公式的位置。做到这一步以后自己隔三个月再打开这套代码也能一眼看懂当时每行在干什么不至于出现“毕业即失忆”的尴尬。如果是从零开始复现这种类型的文章我的建议是先看透主问题-子问题的分解逻辑然后一步步实现、逐步验证。第一次不用追求一次性跑出和论文完全一致的结果先跑通一个简化版再加上负荷灵活性约束最后再引入完整的鲁棒不确定集。分三步走每一步都有明确的可验证指标比一口气啃完整套代码要稳得多。
返回列表