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

文章详情

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

动态分时电价下电动汽车有序充放电优化调度与Matlab实现

动态分时电价下电动汽车有序充放电优化调度与Matlab实现 充电桩刚铺开那两年很多人觉得“电动汽车充电”这件事很简单插上充电枪、扫码、充满走人出一张账单就完了。但做园区充电运营或者电网侧规划的人很快就会发现问题没那么简单晚高峰同一批车同时插枪整台箱变的高峰负荷被瞬间拉上去跌落熔断丝和烧开关的事我都见过不止一次。用户那边也不舒服同样的车白天不充晚上充电费能差出好几倍。所以当我在仿真项目里看到“动态分时电价下的电动汽车有序充放电实时优化调度”这个标题时第一反应就是——这是个典型的多目标工程问题既有用户侧的节能省钱需求也有电网侧的削峰填谷压力还要在“充”和“放”两个方向上找到最优解。这类问题放到 Matlab 里实现核心不是把优化模型写完而是要建立一条完整的链路动态电价建模、车辆接入行为模拟、电池状态约束、实时滚动优化、结果可视化。很多同学卡住不是因为某一句代码不会写而是对整条链路缺一个整体认知什么叫有序动态电价和静态峰谷电价有什么区别充放电同时存在时约束条件怎么加才不矛盾本文我就按这个思路把项目完整拆开从数学模型到 Matlab 代码框架再到实际落地时最容易踩的坑一步一步展开。1. 项目背景与整体设计思路1.1 无序充电到底会造成什么影响先看一个最简单的场景一个园区里停着 20 辆电动汽车下班后 18 点左右集中到达每台车插上就按 7kW 慢充或者 60kW 快充直接干到 Max。这个时候园区本身的基础用电负荷也正好在晚高峰变压器会同时承担办公负载和充电负载。假设基础负荷已经到 300kW20 台车同时充电按 100kW 合计算负荷瞬时跳到 400kW如果变压器容量只有 350kVA结果就是过载报警、跳闸甚至设备损坏。从电网的角度看这种“无序充电”等于把原本可以错开的负荷全部叠加到同一个时间窗口会让一天的负荷曲线变得更陡峭。电网不是怕用电量大而是怕负荷变化太快、峰谷差太大。峰谷差增加发电侧就需要留出更多的旋转备用容量输配电设备也要按最大负荷来选型最终这部分成本还是会传导到电费里。所以“有序充电”的本质是给每一辆车安排一个时间上尽量均匀、价格上尽量便宜、又不影响车主出行需求的充电计划。而有序充电并不是一个简单的“晚点充”策略因为电网可能凌晨负荷低但凌晨电价也不一定最低或者某些时段电网需要车辆反向放电来支撑负荷这时用户不仅不充电还要把电池里的电卖回电网。题目里同时出现“动态分时电价”“有序充放电”“实时优化调度”这三个限定词说明我们要建立的是一个双向、动态、带时间窗的调度系统。1.2 动态分时电价与静态峰谷电价的差异静态分时电价很好理解就是一天被划分成固定的峰、平、谷三个时段电价在一个月内基本不怎么变。比如 8:00—11:00 和 18:00—22:00 是峰段电价 1.2 元/kWh11:00—18:00 和平段电价 0.8 元/kWh22:00—次日 8:00 是谷段电价 0.4 元/kWh。这种电价结构下用户的优化策略相对简单把充电尽量挪到谷段如果允许放电就在峰段放、谷段充赚一个价差。动态分时电价则更多反映实时电力供需关系。它依赖于负荷预测、新能源出力预测和电网运行状态每隔一段时间更新一次小时级电价。比如某天光伏出力很强中午电价可能被压低到接近谷段而傍晚光伏出力骤降、负荷上升电价也随之走高。动态电价还可能出现连续变化的价格曲线而不是三段式的阶梯电价。这给优化调度带来了两个本质改变第一电价数据不再是常量而是随时间变化的输入序列程序要按时间索引去读取第二离线一次性算出的全天计划可能无法适应电价在运行中的刷新需要实时滚动更新。很多做这个项目的同学用静态三段电价算完一遍再把模型改成动态电价结果目标函数里只改了一个变量名以为就完成了。实际上价格序列的时变特性和更新机制才是动态电价建模的重点。电价类型时间维度更新频率优化特点静态分时电价固定峰谷时段月度或季度离线优化结果稳定动态分时电价小时级或15分钟级实时滚动更新需要滚动优化对不确定性更敏感1.3 充放电一体化对优化带来的变量如果只做“有序充电”模型只需要决定每辆车在哪段时间充电、以多大功率充电决策变量是充电功率和时间。但题目里加入“放电”之后问题就变成每个时段要么充电、要么放电不能同时进行。从工程上这叫充放电互斥约束从建模上我们需要引入 0/1 二进制变量来表示当前时段的充放电状态。允许放电之后用户的收益来源不只是“少花钱充电”还包括“高价卖电给电网”的收入。但电池在每完成一次放电循环后容量都会出现一定程度的衰减这相当于增加了一项隐含成本。优化目标不能单纯是“用户支付电费最小”否则模型会鼓励车辆频繁深度放电表面上车主有收入实际上电池寿命却被快速消耗。合理的做法是在目标函数中加入电池放电损耗成本项用价格信号和寿命成本做一个折中。简要总结整个项目可以理解成一个带约束的时序优化问题在满足出行需求和电网安全的前提下通过调度充电功率、放电功率、充放电状态使综合费用最小或负荷波动最小。Matlab 的作用是把这个优化问题用代码表达出来交给整数规划求解器去计算再把结果还原成直观的功率曲线和费用报表。2. 数学模型与优化问题建模2.1 决策变量与时段离散化一个标准的电动汽车充放电调度模型第一步是把时间离散化。假设调度周期是 1 天 24 小时步长取 15 分钟那么一天共有 T 96 个时段。每辆车 i 在每个时段 t 有两个连续决策变量充电功率 P_c(i,t) 和放电功率 P_d(i,t)单位通常取 kW也就是这辆车在这 15 分钟内的平均功率。连续决策变量之外还有一个常见动作就是每个时段的充放电状态标记。引入两个二进制变量 u_c(i,t) 和 u_d(i,t)分别表示该时段是否允许充电、是否允许放电。u_c1 表示充电u_d1 表示放电u_c0 且 u_d0 表示空闲。有些论文也会把“已接入电网”作为一个状态变量用 0/1 表示车辆是否在桩上。车辆没有接入时充放电功率必须为 0。这个约束不能用整数变量直接用“接入状态矩阵”把 P_c 和 P_d 的上限相乘即可实现起来更简洁。还有一个状态变量是电池荷电状态 SOC(i,t)这是连接各时段的核心状态量体现了充电量和电池容量的累计关系。从代码设计角度我这里习惯用矩阵而不是 cell 数组来装这些变量。因为后续无论是写约束条件还是算目标函数矩阵运算都能直接匹配时间轴避免写一大堆 for 循环。用 Matlab 处理这种问题维度管理是头等大事后面我会专门讲。2.2 目标函数用户成本与电网负荷双重目标优化目标需要回答一个问题我们到底在优化什么从用户角度目标函数是最小化整个调度周期内的净充电费用写成min F Σ_t Σ_i ( price(t) × P_c(i,t) − price(t) × P_d(i,t) ) × Δt β × Σ_t Σ_i s_dep(i) × P_d(i,t) × Δt第一项是充电费用第二项是放电收益的负向贡献第三项是电池损耗惩罚。price(t) 是动态电价Δt 是每个时段的时长小时β 是单位放电量对应的电池损耗成本系数。如果价格相同放电收益表现为负费用也就是目标函数里减去放电项。不过实际项目里单纯让用户省钱可能导致所有车辆挤在同一个低电价时段充电造成新的负荷尖峰。这就是“峰谷差放大效应”。所以在电网视角下目标函数还需要加入负荷方差或者峰谷差惩罚项min α × 用户总费用 γ × Σ_t ( P_base(t) Σ_i P_c(i,t) − Σ_i P_d(i,t) − P_avg )²P_base(t) 是基础负荷P_avg 是调度周期内全网平均负荷。加上这一项之后模型会把“总负荷曲线尽可能平缓”也作为目标的一部分。α 和 γ 是权重系数项目里一般通过多组权重扫描来平衡两个目标而不是拍脑袋直接定。有同学问负荷方差是个二次项会让整个模型变成二次规划求解速度变慢怎么办一种做法是在工程上改用“线性化近似”比如按时段引入正、负偏差变量将绝对值之和最小化另一种做法是仅在电网侧方案中启用这一项在纯用户成本方案中忽略。我常用的方法是主目标函数保持线性负荷平滑度用约束条件形式约束在某个范围内避免非线性求解器拖慢滚动优化。2.3 约束条件电池、充电桩和配网约束约束条件是这个项目的灵魂。少了任何一个结果都可能出现“看起来费用很低实际上根本执行不了”的情况。第一个是电池 SOC 递推约束。它在每个时段之间建立联系SOC(i,t1) SOC(i,t) ( η_c × P_c(i,t) − P_d(i,t) / η_d ) × Δt / E_bat(i)其中 E_bat(i) 是电池容量kWhη_c 是充电效率η_d 是放电效率。这一步最容易错的地方是单位换算功率单位是 kW时间单位是小时电流算出来的能量单位是 kWh但 SOC 是百分比必须再除以电池容量才能对齐。第二个是 SOC 上下限约束。电池不能过充也不能过放一般取 0.1~0.9。如果车主设置了出发时的目标电量比如第二天早上要出远门那么 SOC(i, t_dep) ≥ SOC_need(i) 就成了硬约束。这个约束在滚动优化里非常重要因为如果模型把全部电量都用来放电导致车主出门时没电那调度方案就没有实际意义。第三个是充放电互斥约束P_c(i,t) ≤ M × u_c(i,t) P_d(i,t) ≤ M × u_d(i,t) u_c(i,t) u_d(i,t) ≤ 1这里的 M 是一个足够大的数工程上取车辆最大充放电功率即可。两个二进制变量不能同时为 1否则同一辆车在同一时段既充又放目标函数会出现套利漏洞在动态电价下如果充放同时计算模型可能在同一价格差里无限循环充放整个结果就废了。第四个是配网和充电桩容量约束。园区总进线功率不能超过变压器上限 P_limit用公式表示P_base(t) Σ_i P_c(i,t) − Σ_i P_d(i,t) ≤ P_limit这里放电功率起到削减总负荷的作用所以在总负荷公式里是减项。但需要注意配网约束不能直接写成“P_base 小于某个值”因为 P_base 是外部给定的负荷模型改变不了只能通过调整 P_c 和 P_d 来保证总负荷不超过上限。2.4 动态分时电价曲线怎么处理动态电价在代码里通常表现为一个 T 维的价格向量 price(1:T)对应每个调度时段的实时电价。但从哪来是一个关键问题。真实项目里一般由市场或电网发布的价格预测文件获得如果是仿真实例则需要自己构造。常见做法是用一条 24 小时基础负荷曲线再映射到一个基础电价上价格高的时段对应负荷高的时段价格低的时段对应负荷低谷。也可以把动态电价设计成“分时电价 不确定扰动”的形式比如某一时段价格在某一个基准范围内上下浮动用来分析电价波动对调度结果的影响。在滚动优化的代码里价格向量的时间索引要格外小心。第一次优化是从 t1 到 tT第二次优化如果从 t2 开始那么价格向量也应该从第 2 个元素开始否则错位会导致结果根本不对。很多同学调试了很久最后发现只是索引偏移了一位这种问题我建议一开始就把时间轴统一写成 t_now:T_window而不是始终用 1:T。2.5 实时调度与滚动时域优化离线调度是一次性算出全天计划然后直接执行适合输入条件完全已知的场景。但现实不会那么简单车辆实际接入时间可能和预测不一样电价也可能因为负荷波动被刷新新能源出力的变化还会影响配网裕度。所以题目里的“实时优化调度”强调的是一种滚动时域控制也叫模型预测控制。滚动时域的基本逻辑是每 15 分钟或者每 30 分钟重新求解一次。每次求解时读取当前时刻的真实 SOC、车辆接入状态、最新电价预测以当前时刻为起点预测未来 N 个小时的负荷和电价将未来 N 个小时的充放电计划求出来只执行第一个时段的结果然后等待下一轮更新。这样做的好处是优化永远基于最新状态不会因为一个突发事件让计划全部作废。在 Matlab 代码里这相当于在最外层套一个 for 循环循环变量是调度时刻循环内部反复调用同一个优化模型函数。下一节我就讲具体代码怎么写。3. Matlab 实现代码框架与核心技巧3.1 代码目录结构与参数定义这个项目写起来如果全部堆在一个 main.m 里后期调试基本没法做。建议按功能拆成下面这样main.m主入口设置全局参数调用滚动优化循环输出结果data_define.m定义车辆参数、基础负荷、动态电价、接入状态build_model.m输入某个时刻的状态和预测数据构建优化模型并求解plot_results.m绘制负荷曲线、SOC曲线、电价曲线和充放电功率曲线。参数定义要在独立的脚本里集中管理。比如最关键的几个参数dt 0.25单时段时长 15 分钟T 96一天 96 个时段N 20参与调度的车辆数E_bat 40 × ones(N,1)每辆车电池容量 40 kWhP_max 7 × ones(N,1)每辆车最大充电功率 7 kWSOC_min 0.2、SOC_max 0.9price 是 1×T 的动态电价值。参数集中定义的好处是后面做敏感性分析时只需要改一处变量定义模型代码完全不用动。我接项目时最怕看到参数散落在各个函数里改一个电池容量要搜索半天。3.2 用 Yalmip 建混合整数线性规划模型Matlab 环境下推荐直接使用 Yalmip 工具箱来建模。它可以把优化问题用很接近数学公式的方式写出来然后统一交给求解器求解。核心流程是先创建优化变量再写约束条件再写目标函数最后调用 optimize。一个简化版的模型构建代码大概是这个样子function results build_model(params, state) % params: 系统参数结构体 % state: 当前时刻的车辆状态和价格预测 T params.T; N params.N; dt params.dt; Pc sdpvar(N, T, full); Pd sdpvar(N, T, full); SOC sdpvar(N, T, full); uc binvar(N, T, full); ud binvar(N, T, full); Constraints []; % SOC 递推 Constraints [Constraints, SOC(:, 2:end) SOC(:, 1:end-1) ... (params.eta_c * Pc(:, 1:end-1) - Pd(:, 1:end-1) / params.eta_d) * dt ./ params.E_bat]; % SOC 上下限 Constraints [Constraints, SOC params.SOC_min, SOC params.SOC_max]; % 充放电功率上下限 Constraints [Constraints, Pc 0, Pc params.P_max .* uc]; Constraints [Constraints, Pd 0, Pd params.P_max .* ud]; Constraints [Constraints, uc ud 1]; % 接入状态约束: 未接入车辆功率为 0 Constraints [Constraints, Pc params.avail .* params.P_max]; Constraints [Constraints, Pd params.avail .* params.P_max]; % 总负荷约束 total_load params.P_base sum(Pc, 1) - sum(Pd, 1); Constraints [Constraints, total_load params.P_limit]; % 目标函数 price_vec params.price(1:T); cost_charge sum(sum(price_vec .* Pc .* dt)); income_discharge sum(sum(price_vec .* Pd .* dt)); degradation params.beta * sum(sum(Pd .* dt)); Objective cost_charge - income_discharge degradation; ops sdpsettings(solver, gurobi, verbose, 0); optimize(Constraints, Objective, ops); results.Pc value(Pc); results.Pd value(Pd); results.SOC value(SOC); end用 Yalmip 建这个模型最关键的两点一是二进制变量用 binvar而不是把连续变量简单设一个下限二是 SOC 递推关系里等号右边的系数矩阵维数要严格对齐。初学者最容易在这里报“矩阵维度不一致”的错误。3.3 滚动优化循环的工程实现实时调度在 Matlab 里实现时主循环不复杂逻辑反而更关键。伪代码如下for tNow 1:horizon_step:total_slots % 更新当前时刻真实 SOC 和接入状态 state observe_real_vehicle_status(tNow); % 获取未来预测电价和基础负荷 params.price update_price_forecast(tNow); params.P_base update_base_load_forecast(tNow); % 只优化未来 opt_horizon 个时段 params.T opt_horizon; results build_model(params, state); % 执行第一个时段的功率指令 dispatch(results.Pc(:, 1), results.Pd(:, 1), tNow); % 记录结果更新时间状态 record_and_advance(results, tNow); end工程上很容易忽略的一点是每轮循环都要把上一轮 Yalmip 创建的变量清空。因为 Yalmip 会在工作区里累积旧变量导致内存逐渐膨胀程序越跑越慢。在函数内的局部变量在退出时会自动清理所以把 build_model 写成独立函数而不是在主脚本里循环里创建 sdpvar是更安全的方法。还有一个小技巧就是滚动优化窗口不需要取完整 96 个时段。实时预测越到后面越不可靠窗口取得太长不仅增加求解时间最后几个时段的结果也没有实际意义。我一般取 4~8 小时也就是 16~32 个时段既有前瞻性又不会让求解器负担太重。3.4 绘图与结果输出最能说明问题的几张图这个项目的结果如果只用文字报告很难让人信服。我常用的几张图是第一张总负荷曲线对比图。横轴是 24 小时时间轴纵轴是负荷功率同时画上“无控制”“有序充电”“有序充放电”三条曲线一眼就能看出削峰填谷的效果。第二张每辆车的 SOC 变化曲线。颜色深浅表示不同车辆曲线整体应该在一个合理的范围内平滑变化。如果某条曲线在某个时间点突然垂直跳变多半是模型在相邻时段之间没有正确约束或者初值数据出了问题。第三张动态电价曲线和充放电功率堆叠图。把价格曲线放在上方子图把总充电功率、总放电功率放在下方子图可以直观看到放电功率是否集中在高电价时段充电功率是否集中在低电价时段。绘图代码本身不难难点在于画完之后要能“读懂”。如果发现大量放电都集中在一个时段而该时段电价并不是全天最高那就要回头检查是不是电池损耗系数 beta 设置得太小导致模型对价格差的响应过于激进。可见画图不仅是交付物也是调试工具。4. 仿真案例与结果解读4.1 场景算例设置为了说明问题我设计了一个典型园区算例。园区内接入 20 辆电动汽车每辆车电池容量 40 kWh最大充放电功率 7 kW充电效率 0.95放电效率 0.9初始 SOC 随机分布在 0.3~0.6车主设定的出发目标 SOC 最低为 0.8。基础负荷用一条早晚双峰的曲线最大约 300kW变压器容量 350kW。动态电价按高负荷时段价格高、低负荷时段价格低的原则生成峰段 1.2元/kWh、谷段 0.4元/kWh但个别时段加入扰动模拟实时波动。这个场景虽然简化但已经足够体现动态电价和 V2G 同时作用下的调度难度晚高峰既要保证基础负荷不超限又要尽量降低充电费用同时车辆本身还需要在第二天出行前充到 0.8 以上三个目标叠在一起需要模型真正“算”出最优解。仿真结果通常会呈现几个现象无序充电场景下园区总负荷在 19:00 附近出现尖峰超过变压器限值有序充电场景下大部分充电被推迟到 22:00 以后的谷段峰值明显下降充放电场景下傍晚高电价时段部分车辆向电网放电收益抵消了部分充电成本同时缓解了晚高峰线路压力。4.2 有序充放电对负荷曲线的影响从负荷曲线看有序充电的削峰作用非常明显。无序充电时最高负荷可能到 380kW有序充电后峰值降到 330kW如果在目标函数中加入负荷平缓项还可以再压低到 300kW 左右。变压器的裕量就这么被释放出来了。充放电对曲线的改善则更精细化。在傍晚 18:00—20:00系统让一部分 SOC 较高的车辆反向放电把总负荷从接近上限的位置拉下来。与此同时为了不影响第二天出行模型会安排这些车辆在凌晨谷电时段重新充电。整个曲线表现为“晚峰削掉一块、低谷补上一块”峰谷差比单纯有序充电更小。需要注意的是这种效果并不是免费的。放电导致电池循环次数增加电池容量衰减加快。在结果里要把电池损耗成本单列出来看如果 beta 设得太低模型会倾向于每辆车都深度放电表面收益很高但电池置换成本远超这些电费收益。从工程角度讲beta 的标定需要参考实际电池厂商的循环寿命数据不能随手取一个常数。4.3 成本对比与电池损耗的敏感性分析成本对比的结果通常有两种口径一种只算电费即充电电费减去放电收益另一种把电池损耗也算进去看“社会总成本”。我用 beta 取不同值做过一组分析结论很直观beta 取值车辆平均放电量(kWh)电费净支出(元)考虑电池损耗后的总成本(元)012.518.218.20.17.822.431.20.23.627.536.10.51.031.240.9beta0 时模型全让汽车“免费放电”套取价差总成本最低但电池损耗极大。beta 增大后放电量减少电费净支出增加但总成本曲线更接近真实。项目里如果现场管理方只关心当期电费可以调低 beta如果从车主角度考虑电池寿命beta 就要取高一些。这也是为什么我坚持把电池损耗作为显式的目标项而不是后处理里简单提一句。5. 常见问题与排错经验5.1 求解器报无解先查约束是否矛盾在带二进制变量的混合整数规划里“无解”是最高频的报错。初学者第一反应是改求解器选项或者怀疑求解器坏了。其实绝大多数无解原因是约束条件自相矛盾。最常见的是 SOC 出发约束和充放电互斥约束冲突。比如车辆 19:00 接入次日 7:00 出发但模型在 19:00—22:00 安排了大量放电把 SOC 放到底部 0.2后续又没有足够时间把电量充回 0.8于是系统找不到可行解。排查方法是用 Yalmip 的 check 函数逐条检查约束残差也可以先把放电功率固定为 0看问题是否还存在。如果能解说明问题出在放电和回充的时间窗不匹配。5.2 变量量纲不统一结果满屏乱飘这个项目里出现“离谱结果”的概率比想象中大得多。比如功率单位用 kW电池容量用 kWhSOC 用百分比时间用小时这几个单位之间经常搞混。SOC 递推公式里如果忘了把充电能量除以电池容量SOC 会瞬间超过 100约束直接被击穿。我的建议是在 data_define.m 里统一注释单位比如 % E_bat: kWh, P_max: kW, dt: h。建模时先把一个简单单体车辆调通再扩展到多车辆否则几十辆车一起出错根本不知道是哪一个公式写错了。量纲检查还有个快速技巧把目标函数里的变量全部取典型值算一遍看结果是不是在一个合理量级比如总充电费用应该在几十到几百元之间而不是几百万元。5.3 实时滚动时域程序越跑越慢某些版本的滚动优化程序每循环一次耗时从 0.5 秒逐渐增加到 5 秒甚至更高这通常是变量累积导致的。当你把 Yalmip 变量创建放在主循环里每一轮循环都会在内存中留下旧的 sdpvar 对象。解决办法是像之前那样把建模代码封装成独立函数让局部变量自动释放如果必须使用脚本可以在每轮循环里调用 clear 清理不想保留的变量。另一个加速技巧是减少滚动窗口长度或者把一些非必要约束从硬约束改成软约束。硬约束会显著增加求解时间而软约束通过罚函数实现求解器处理起来更轻松。5.4 对电池退化系数的认识误区很多人直接把 tanh 或者某种经验公式塞到目标函数里导致模型变成非线性求解时间成倍增长。其实电池退化建模不需要过度复杂在短期调度场景里用一个线性折旧系数近似是够用的。重点是把放电量累计起来乘一个成本系数既保持模型线性又能反映“放电越多损耗越大”的主要趋势。如果实际项目对精度要求很高可以把电池退化分成“循环退化”和“日历老化”两部分但对大部分园区级调度来说线性模型已经可以把调度策略引导到一个合理的方向上。与其纠结退化曲线是否精确不如先把电价、SOC 约束、负荷约束这些主干逻辑做扎实。6. 扩展方向与个人体会这个项目做到这里还可以往多个方向扩展。比如把预测不确定性显式建模用随机规划或鲁棒优化来替代确定性滚动优化能应对电价预测误差更大的场景。也可以引入多智能体博弈让每个车主根据自己的偏好独立决策电网侧再通过动态价格引导整体行为这样就不再是“给每辆车直接下发指令”的单边调度了。从我实际接触过的仿真项目来看这个题目的最大价值不是那串 Matlab 代码而是帮助建立一套“把真实工程问题转换成数学优化问题再用程序求解并验证”的方法论。学生阶段可能只关注纸面费用是否降低但进入实际项目之后你会发现变压器容量、线路载流量、用户出行需求、电池健康状态每一条硬约束背后都关系着真金白银和现场安全。调参时多想想约束背后的工程意义比莽撞地把代码跑通重要得多。如果非要我分享一条最重要的实操经验那就是先跑通一个最小算例再扩展到完整场景。最小算例里车辆数量、时段数量都取很小比如 2 辆车、8 个时段人为地把每条约束、每个结果都手动验算一遍。确认无误后再逐步扩大规模。这样做看起来慢但实际上能帮你避开绝大多数后期排查时间。这套流程我用到现在无论是做课题还是接仿真项目都还一直沿用着。
返回列表