多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

电动汽车与可再生能源协同调度:论文复现与Matlab-Python实现

电动汽车与可再生能源协同调度:论文复现与Matlab-Python实现 1. 项目概述与问题拆解1.1 这个复现项目到底在做什么先说清楚一个问题很多朋友看到“硕士论文复现”这几个字第一反应是“把论文里的图和数据重新跑出来”。但真正的复现远不止画图你要复现的是论文作者解决问题的思路框架包括问题建模、约束条件、求解算法、参数敏感性分析这一整套逻辑链条。我拿到这个题目时的第一判断是这个项目本质上是在做一件事把风电、光伏这类可再生能源出力的不确定性和电动汽车充电负荷的随机性放进同一个优化调度框架里进行协同优化。为什么要协同因为可再生能源发电和电动汽车充电在时间维度上是错位的。风电在夜间往往出力大而这时候恰恰是负荷低谷光伏在午间出力大但EV车主习惯下班后集中充电正好撞上晚高峰。如果没有一个调度层去主动协调就会出现两种浪费一是弃风弃光二是电网峰谷差拉大。传统做法是分头优化——发电侧单独做机组组合EV侧单独做有序充电。但这个项目的核心创新点就是把两侧放在同一个约束体系下联合求解让EV充电负荷去主动“消化”可再生能源出力用需求侧灵活性去换发电侧的消纳空间。论文复现的第一件事不是打开代码而是先把论文里的模型写清楚。我看过不少同学上来就急着跑代码结果跑了三天发现结果对不上论文回头一问才知道目标函数里漏了一个惩罚项。所以这里强烈建议复现之前先花两到三个小时把论文里的数学公式抄一遍逐项注释它的物理含义。这是整个项目最值得投入的时间。1.2 协同调度模型的数学骨架无论论文里写得多么复杂调度模型的大体结构逃不出下面这个框架目标函数 功率平衡约束 机组出力约束 EV充电约束 网络约束可选。我先把这个骨架画出来后面写代码的时候你会反复回到这几行公式。目标函数一般是系统运行成本最小化包含火电机组的燃料成本、启停成本可再生能源的弃用惩罚注意这里不是发电成本而是“弃风弃光惩罚”目的是让调度结果优先消纳新能源以及EV充电的负荷调度成本。写成数学形式大概是min Σ_t [ Σ_i (a_i * P_i,t^2 b_i * P_i,t c_i) λ_curtail * (P_available_t - P_accepted_t) λ_ev * (P_ev_charge_t - P_ev_base_t)^2 ]其中a_i、b_i、c_i是火电机组的成本系数P_i,t是第i台机组在t时段的出力λ_curtail是弃风弃光惩罚系数P_available_t是可再生能源在t时段的可用出力P_accepted_t是实际接受并网出力EV部分的二次项是为了让充电负荷尽量平滑避免出现剧烈的充电功率波动。约束方面最核心的是功率平衡约束所有电源出力加上购电功率等于常规负荷加上EV充电负荷。在等式里同时出现EV的决策变量和可再生能源的决策变量这就是“协同”的数学体现。除此之外还有机组爬坡约束、出力上下限、EV充电需求约束每辆车在离网前必须充到用户设定的SOC目标这些约束构成了模型的可行性域。这个项目在复现时最关键的地方在于EV部分的建模粒度。论文里如果用的是集群EV模型那实现起来相对容易——把上百辆车聚合成几个集群每集群一个聚合充电功率变量如果是每辆车单独建模那状态变量数量会爆炸式增长需要引入时空转移约束代码复杂度完全不一样。我复现的时候发现大多数硕士论文用的是聚合模型好处是求解速度快坏处是忽略了车辆到达/离开时间的异质性结果会偏乐观。这一点你在看论文时要特别留意因为它直接影响你复现结果的对比口径。1.3 为什么这个方向值得做如果把视野放到行业层面这个题目的现实意义很直接随着电动汽车保有量增长充电负荷对配电网的影响已经从一个“研究假设”变成了实实在在的问题。一个普通小区的充电桩如果同时开启瞬时功率可以轻松达到变压器容量的60%以上。而另一边新能源装机还在高速增长弃风弃光率在某些地区居高不下。这两个问题单独看都有不少研究但放在同一时间尺度、同一空间节点上协同优化才更贴近实际运行需求。从论文复现的角度来说这个题目的好处是模型复杂度适中不像电力市场出清那样涉及复杂的双层博弈也不像输电网规划那样需要处理混合整数非线性规划。它用到的数学工具主要是混合整数线性规划或二次规划对在校学生非常友好现有的求解器基本都能搞定。这正是我推荐新手选择这类题目的原因模型不至于简单到没东西可写又不会难到让你卡死在求解器上。2. 双语言技术栈为什么必须Matlab和Python混搭2.1 Matlab在整个流程里的定位我发现很多初学者有一个误区觉得“用一个语言就够了”。但实际上在这个项目里Matlab和Python各有不可替代的位置。我的判断是优化求解主逻辑用Matlab数据处理与可视化用Python两者通过文件接口做数据交换。这个架构不是拍脑袋定的而是我试了多次之后觉得最顺手的方案。先聊Matlab。这个项目叫“协同调度策略研究”本质上是一个优化问题。Matlab在求解优化问题上的优势在于它有非常成熟的工具箱体系和建模语言。YALMIP这个建模工具类库可以直接把符号化的约束条件写进去然后调用外部求解器Gurobi、CPLEX、MOSEK等求解代码结构跟论文里的数学公式基本一一对应。这一点简直是为论文复现量身定做的——你在代码里能直接看到“subject to”开头的约束语句而不是像纯Python那样需要写一堆矩阵拼装代码。我举个例子。用YALMIP建模机组出力上下限约束核心代码就这么几行% 决策变量机组出力P、EV充电功率Pev P sdpvar(n_units, T, full); Pev sdpvar(n_ev_clusters, T, full); % 目标函数燃料成本 弃风惩罚 EV调节惩罚 objective sum(sum(fuel_cost_coeff .* P)) ... lambda_curtail * sum(P_avail - P_accept) ... lambda_ev * sum((Pev - Pev_base).^2, all); % 功率平衡约束 Constraints [sum(P, 1) sum(Pev, 1) P_load P_loss]; % 机组上下限约束 Constraints [Constraints, P_min P P_max]; % EV充电需求约束离网前必须达到目标SOC Constraints [Constraints, P_ev_sum E_ev_req];这套写法的好处是你在论文里看到什么公式在代码里就能找到什么声明。调试时特别好用因为你不需要在脑内把公式翻译成矩阵索引直接对着论文检查代码哪里不对一眼就能看出来。相比之下如果用Python的SciPy.optimize写同样的模型你得把约束矩阵拼好一个不小心索引错位就会导致结果完全变形。2.2 Python在整个流程里的定位那Python负责什么负责两件事数据前处理和结果后处理可视化。调度问题需要输入的数据很杂包括各时段的风电出力预测曲线、光伏出力预测、常规负荷曲线、EV数量/到达时间/充电需求等。这些数据在论文章节里通常只是一个图表但复现的时候你得自己把底层数据生成出来。我的做法是用Python做原始数据清洗和特征工程因为pandas处理时间序列数据、重采样、滑动平均这些操作比Matlab的表格工具箱顺手得多尤其在面对CSV格式的原始负荷数据时Python的生态明显更省事。可视化也是Python的强项。Matlab的绘图默认风格偏老气而且调图例、调字体折腾起来效率不高。Matplotlib和Seaborn出图更符合现在学术论文的审美要求配色、排版、pdf导出都更友好。我自己是先用Matlab把优化结果跑出来存成CSV或者MAT格式再用Python读进来画图。这样分工各取所长效率最高。下面这段Python代码是我处理风光出力数据并生成调度输入的典型代码核心就两步滑动窗口平滑、归一化import pandas as pd import numpy as np # 读取原始风电/光伏出力数据 df pd.read_csv(renewable_raw.csv, parse_dates[time]) df.set_index(time, inplaceTrue) # 对风光出力做滑动平均模拟预测曲线的平滑效应 df[wind_smooth] df[wind_power].rolling(window6, centerTrue).mean() df[pv_smooth] df[pv_power].rolling(window6, centerTrue).mean() # 归一化到标幺值方便后续统一处理 df[wind_pu] df[wind_smooth] / df[wind_capacity] df[pv_pu] df[pv_smooth] / df[pv_capacity] df df.fillna(methodbfill).fillna(methodffill) # 输出给Matlab使用的输入文件 df[[wind_pu, pv_pu]].to_csv(input_renewable.csv)2.3 双语言的接口设计别让数据流成为瓶颈既然涉及两个环境接口设计就非常重要。我的习惯是所有中间数据统一用CSV交互不用MAT文件。因为CSV是纯文本任何语言都能读而且出现问题时可以直接用Excel打开检查排查数据异常非常方便。具体的数据流是这样Python处理完毕的输入数据机组参数、负荷、风光出力、EV参数写成input_data.csvMatlab跑完优化求解后把机组出力、EV充电功率、目标函数值这些结果写成result_output.csv最后Python读进来画图生成论文复现版的图表。这个流程里有一个关键点两次CSV文件的列名和索引顺序必须严格对齐否则读进来后错一位后面所有分析都白费。我自己踩过这个坑在Matlab里用writetable输出时默认会带列名但Python读取时光标偏移一格导致时间轴错位结果图画出来全是乱的。解决办法是在Python侧读取时用index_col0并在Matlab侧写表时显式指定VariableNames。还有一个小技巧MATLAB和Python之间传参时建议把仿真场景参数单独放在一个JSON配置文件里统一管理。比如风电渗透率、EV渗透率、惩罚系数这些关键参数不要硬编码在代码里而是放在一个config.json中这样做敏感性分析时只需要改配置文件不用动任何代码逻辑。这也符合工程化的思维方式——论文复现到最后要做参数实验可配置化能让所有实验都跑在同一套代码基座上。3. 核心模块的代码实现路线3.1 数据准备风光出力曲线的生成与处理对于一个论文复项目来说数据通常分两种形态一种是论文作者公开了数据可以直接下载使用另一种是只有论文里的图表原始数据拿不到这时候必须自己在合理范围内生成近似数据。绝大多数情况下你会遇到第二种因为直接公开完整数据集的论文还是少数。如果论文的案例研究部分给出了典型日曲线图我的建议是先手动提取几个关键点的数值再用插值补全。具体做法是用Python的matplotlib读取论文图片中的曲线手动标注几个关键坐标点比如风出力的两个峰值和谷值然后用三次样条插值生成一条平滑的24小时曲线。这样做的好处是复现出来的曲线在趋势上能和论文对得上不至于差太远。下面这段是我做风电和光伏典型日出力曲线生成的常用代码用正弦函数叠加噪声模拟波动并加入一个随机扰动项import numpy as np import pandas as pd np.random.seed(42) T 24 # 24个时段每小时一个点 # 风电典型出力夜间高白天低 波动 wind_base 0.3 0.4 * np.exp(-((np.arange(T) - 2) ** 2) / 12) wind_fluct 0.1 * np.sin(2 * np.pi * np.arange(T) / 8 0.5) wind_power np.clip(wind_base wind_fluct 0.05 * np.random.randn(T), 0, 1) # 光伏典型出力白天有功率晚上为零 pv_power np.zeros(T) daytime np.arange(7, 19) pv_power[daytime] np.maximum(0, np.sin(np.pi * (daytime - 6) / 12)) pv_power 0.02 * np.random.randn(T) pv_power np.clip(pv_power, 0, 1) # 转成DataFrame并存成CSV df pd.DataFrame({wind_pu: wind_power, pv_pu: pv_power}) df.to_csv(typical_day_renewable.csv, indexFalse)注意这里的曲线形状要尽量贴近论文里的描述。如果论文里说“风电出力夜间维持在较高水平”那你的曲线在凌晨0点到6点就应该有明显的平台段而不是随机波动得很厉害。处理这些细节决定复现的曲线和论文对比时是不是“形似”这也是很多人在复现环节最容易偷懒但最能体现水平的地方。3.2 EV充电负荷模型的搭建逻辑EV部分是这个项目区别于普通机组组合问题的关键也是最容易把你卡住的地方。EV充电负荷有两个核心特征时间灵活性充电时段可以在一定范围内滑动和电量需求约束每辆车离网前必须充够电。如果你的模型只考虑了总充电功率限制而没考虑单车的离网时间那优化结果会让所有EV在电价最低的时刻扎堆充电这在经济上最优但在真实场景中完全不合理。所以EV建模至少要分两层聚合层和单辆层。聚合层的变量是每个时段的总充电功率单辆层的约束是每辆车到达、离网时间和充电需求。论文复现时我会建议你按下面的“时间窗口-功率上限-电量下限”三层约束框架来写时间窗口约束EV只能在到达时间到离网时间之间充电其他时段充电功率为0功率上限约束每个时刻的单车充电功率不超过充电桩的额定功率一般取7kW或11kW电量约束累计充电量在离网时不能低于用户设定的目标电量同时不超过电池容量这三层约束在MATLAB里的表达需要把每个集群的EV到达时间和离网时间预先处理好。集群化的做法是统计每个时间段内正在充电的EV总数然后把“总量上限”拆成“在网车辆数乘以单桩功率上限”。代码大概是% 构建在网车辆数矩阵 EV_onGrid(t)每个时段有多少辆车在网 % 这个矩阵由Python端根据每辆车的到达/离网时间统计生成传给MATLAB % EV集群t时段充电功率不能超过在网车辆数*单桩功率 Pev_max EV_onGrid .* P_station_max; Constraints [Constraints, 0 Pev, Pev Pev_max]; % 集群累计充电量约束等效SOC约束 % 每辆车按平均充电功率累积必须满足总需求 Constraints [Constraints, sum(Pev, 2) EV_energy_demand];这里有个点值得提醒sum(Pev, 2) EV_energy_demand是硬约束如果车辆数量和充电时间窗口本身就不匹配这个等式很可能无解。比如某些EV在网时间特别短即使满功率充电也到不了目标电量模型就会报“不可行”。现实中处理方法是把这个等式约束改成不等式“累计充电量不小于需求”同时允许目标函数里有未满足电量惩罚项。这样既能保证模型有解又能体现“尽量满足”的优先级。3.3 目标函数的构建与场景参数设计目标函数的细节直接决定优化的“性格”。我复现过一个只考虑系统运行成本的模型结果EV全部被调度到凌晨充电虽然成本最低但跟论文里的充电曲线完全对不上。后来检查了一下发现是惩罚项的系数设计出了问题。在协同调度模型里常见的惩罚项有三类弃风弃光惩罚、碳排放惩罚、EV用户满意度惩罚。这三者在目标函数里的量级必须经过仔细调节否则某一项会主导整个优化结果。比如弃风惩罚系数如果设得太大优化器会为了让EV多充电而不管充电是否在合理的时段结果是充电曲线形状跟负荷曲线一样剧烈如果设得太小又会出现大量弃风看着风光出力曲线却在白白浪费。我的做法是用敏感性分析来确定系数。具体操作是把某一惩罚系数从0逐渐增大到10倍观察目标函数的各项分量变化和EV充电曲线形状变化找到曲线形状发生明显变化的拐点然后取拐点附近的数值作为基准。这个过程听起来费时间但实际上Python循环改配置文件就行了半小时内能跑完。这个方法几乎适用于所有这类多目标协同项目值得你在复现之前先走一遍。典型参数参考表参数推荐范围说明弃风弃光惩罚系数50~200元/MWh太小会导致大量弃电太大会导致调度过度激进EV调节惩罚系数5~30元/MW·h用于平滑充电曲线过大则充电时段分布过于均匀火电燃料成本系数a0.001~0.01元/MW²二次项系数决定机组间出力分配的经济性常规负荷基线论文场景数值的±20%用于和自己生成的风光出力曲线配平功率平衡3.4 求解器选型与参数设置求解器的选择是整个复现过程中我踩过最多坑的地方。YALMIP只是一个建模层真正解算要靠底层求解器。常见选择有以下几种Gurobi性能最强但对学术用户需要申请免费 license申请流程一般1~2个工作日在校师生用学校邮箱申请含金量很高建议尽早准备CPLEX老牌商业求解器IBM 旗下功能稳定新版本在很多特征上追赶 GurobiMOSEK适合求解二次规划和锥规划如果你的EV成本项用了二次惩罚项MOSEK的表现可以不输 GurobiSCIP/GLPK开源免费适合小型问题调度问题变量数量上千之后性能会明显下降我个人推荐的做法是建模时不要绑定具体求解器。YALMIP的好处就是求解器之间可以自由切换。只要在代码里改成ops sdpsettings(solver, gurobi, verbose, 0); optimize(Constraints, objective, ops);切换求解器只需要换一行字符串。这样你在不同机器上跑代码时不管装了什么求解器都能跑起来只是性能差异而已。这种“解耦”的思想不仅体现在语言分层上也体现在建模和求解的分离上本身就是工程化的核心习惯。3.5 结果可视化与对比分析复现的最终目标是让生成的图表和论文里的图表“长得像、数值接近、结论一致”。可视化的代码不需要多花哨但关键信息必须齐全。一张合格的调度结果图至少需要包含以下几条曲线常规负荷、EV充电总功率、风电出力、光伏出力、火电出力。在同一个时间轴上把这些曲线画出来配合功率平衡的验证一眼就能看出结果是否正确。Python画图的代码框架如下import matplotlib.pyplot as plt import pandas as pd # 读取Matlab优化结果 result pd.read_csv(result_output.csv, index_col0) plt.figure(figsize(12, 6)) plt.plot(result.index, result[load_base], label常规负荷, linewidth2) plt.plot(result.index, result[load_ev], labelEV充电负荷, linewidth2) plt.plot(result.index, result[wind], label风电出力, linestyle--) plt.plot(result.index, result[pv], label光伏出力, linestyle--) plt.plot(result.index, result[thermal], label火电出力, linewidth1.5) plt.xlabel(时段 (h)) plt.ylabel(功率 (MW)) plt.legend() plt.grid(alpha0.3) plt.tight_layout() plt.savefig(dispatch_result.png, dpi300) plt.show()这里有个额外的检查技巧把各电源出力加上EV充电负荷再减去常规负荷画一条“功率不平衡量”曲线。如果模型求解正确这条曲线应该严格为0或接近0。我每次跑完优化都会先看这条误差曲线而不是直接看结果图。这个习惯帮我避免了至少三次由于约束拼装错误导致的“看起来对但实际错”的结果。4. 复现过程中最常踩的坑与排查技巧4.1 求解器报错不可行解的处理思路第一次跑通模型的时候大概率会遇到infeasible problem的报错。大多数人的第一反应是去检查约束条件是否写错但根据我的经验在约束本身没错的前提下不可行解最常见的来源是数据的不自洽。举个例子EV需求总量是50MWh但这些EV分布在网时间只有晚上6点到早上8点且单桩功率有限最大可充量只有40MWh那这个模型必然不可行。这是物理问题不是数学问题。处理不可行解的标准流程是“松绑定位法”先解除全部约束从无约束状态开始逐步添加约束组每次加一组就求解一次。当某组约束被加入后模型开始变得不可行问题就锁定在那一组约束上。这个过程确实耗时但定位问题的准确性极高而且每次都能加深你对模型的理解。另一个实用技巧是在目标函数中添加松弛变量。给功率平衡约束和EV电量约束各加入一个非负松弛变量然后在目标函数里加上一个很大的惩罚系数。这样即使某个约束暂时无法满足模型仍然有解你通过看松弛变量取了什么值就能知道是哪一类资源的缺口。这个方法在论文复现阶段非常推荐能帮你迅速定位数据和约束之间的冲突点。4.2 收敛慢或者求解时间过长求解时间的问题在EV数量较多时特别突出。如果每辆车单独建一个0-1变量表示该时段是否充电24个时段的0-1变量会随着车辆数线性增长混合整数规划的搜索空间会迅速膨胀。我遇到过原始模型跑了一个小时还没出结果的情况后来通过两个手段把时间压缩到两分钟以内。第一个手段是聚类。把到达时间和离网时间接近的车辆聚成同一类类内共享建模参数。这样做会损失部分颗粒度但论文复现阶段完全够用。第二个手段是在YALMIP里设置求解器的参数Gurobi的MIPGap设成0.011%的最优性差距TimeLimit设成120秒。对调度类问题1%的差距在结果上几乎肉眼不可见但求解时间可以差出一个数量级。4.3 数据格式坑时段对齐和量纲这个坑看似低级实际非常常见。电动车充电功率的单位常用kW而机组出力常用MW两者相差1000倍。如果你在合并数据时忘记统一量纲优化结果会诡异到难以解释要么EV充电功率几乎为0要么火电出力全部越限。检查量纲的工作要在数据预处理阶段完成而不是等到结果出来之后再怀疑。时段对齐的问题主要出在“0点”的归属上。调度模型的理解是时段值24个点代表的是t1到t24的功率t1对应0点到1点。但CSV里时间列的索引如果从00:00开始就会产生偏移。我的习惯是统一用时段编号1~24作为索引所有输入数据都要做一次核对曲线峰值是不是出现在你认为的那个时段。如果光伏峰值出现在第13时段12点到13点但代码里写成第12时段整个模型的功率平衡就会被系统性偏移一小时结果和论文必然对不上。4.4 环境配置与版本兼容环境配置这块要特别说一下。我复现时遇到过两个非常头疼的问题一是YALMIP在较新的MATLAB版本上偶发兼容问题二是Python端pandas版本升级导致的API变动。针对第一点建议在项目目录下固定一个requirements.txt和说明文档记录自己使用的版本号这样过几个月回来看代码时还能复现当时的环境。MATLAB版本从2021b到2024a之间大部分功能是稳定的但工具箱更新可能改了一些内部实现的参数名所以锁定版本很有必要。Python环境则强烈建议用虚拟环境管理依赖。在项目根目录下执行python -m venv venv然后激活并安装依赖就能把整个复现环境隔离在独立空间里。尤其注意matplotlib和pandas的新版本变更比较大比如pandas 2.0开始对concat行为做了调整用老教程的代码在新版本上跑大概率会报错。4.5 论文对不上的情况学会判断哪些可以接受最后聊一个许多人没意识到的问题复现结果和论文不一致时未必是你做错了也可能论文本身就没有提供足够的信息让你完全复现。比如论文没有说明EV的聚类数量、没有给出罚因子的具体数值、甚至没有说明用哪个求解器。这种信息缺失在硕士论文里非常常见。这时候我的判断标准是只要趋势一致、关键结论一致比如“协同调度可以降低系统总成本”“EV充电被引导到夜间低谷时段”就可以认为复现成功。数值完全一致反而是少数情况因为论文里很可能用了某个随机种子生成的车型数据你没有原始数据就难以精确对齐。我建议在博文或文档里把“复现时采用的假设与论文不一致之处”如实列出来这是学术严谨性的体现。5. 项目扩展与实践价值5.1 模型扩展方向从单目标到多目标如果你还有余力这个项目有很自然的扩展路径。最基本的扩展是把单目标成本最小化改成多目标优化系统运行成本与碳排放量同时作为优化目标。实现方式有两种一是加权法在目标函数中加入碳成本二是用字典序法按优先级依次优化。加权法实现起来最简单我个人更建议用字典序法先优化碳排放最小化结果再在碳排放不超过该结果一定比例的前提下优化成本这样能给出一个帕累托前沿论文讨论更丰富。另外一个有意义的扩展是考虑EV的放电能力V2G。原模型里EV充电负荷只有正的功率变量加入V2G后EV可以反向送电相当于分布式储能。这就引入了电池损耗成本目标函数的EV部分变成了“充放电联合优化”。阿尔法和贝塔系数充电效率、放电效率的建模需要额外实验数据但代码框架完全可以复用。5.2 数据扩充与场景变换原始论文一般只给了一个典型日的场景。你可以在不影响核心逻辑的前提下把单日数据换成多日数据比如一周或四季的典型日然后观察调度结果的季节性差异。这个扩展做起来非常快因为核心代码完全不动只需要修改输入的负荷数据文件和风光出力数据文件。我用这个方式做出来的四季对比图在汇报时可以作为额外的分析亮点直接提升交作业的观感。多场景分析还有一个好处能检验模型在不同数据分布下的鲁棒性。如果模型只在夏天一个典型日上表现好那说明模型参数过拟合了该场景实际应用价值有限。用更丰富的数据做验证既是学术上的要求也是工程上的基本素养。5.3 个人经验总结复现这个题目的整个过程中我最深的体会是论文复现拼的其实是“建模的组织能力”而不是“数学能力”。大部分模型你没见过但它们的构成模块你都认识关键是怎么把散落的公式组织成一套能求解的代码。分层处理、参数可配置、数据流清晰、接口解耦这些工程习惯在复现中带来的效率提升是实打实的。另一个实际建议是所有实验记录用Markdown或Excel持续更新。每跑完一组实验就记录下参数、结果、图表哪怕过程很潦草坚持一周后你会拥有一份自己的复现日志。这在最后写技术报告或者回答评审提问时能帮你省下大量回忆时间也让你在复盘时能看清自己当初是怎么一步步把问题解决的。如果你现在准备动手做这个复现项目我的建议顺序是先跑通一个最简单的确定性模型只考虑24时段的功率平衡和机组约束然后加入EV集群约束最后加可再生能源不确定性场景。每一步都验证无误后再进入下一步。走完这三步你掌握的不仅是一套代码而是一整套调度问题的建模方法论这比单纯复现出几张论文图有价值得多。
返回列表