资讯动态

差分进化算法求解微电网经济调度的Matlab实现

发布时间:2026/9/24 21:46:32 来源:尧图企业网站定制
微电网调度是近些年储能和分布式能源领域绕不开的一个话题而差分进化算法Differential Evolution, DE在这类问题里确实算得上是一个既简单又出效果的工具。我之前在几个微电网优化调度的项目里都试过用 DE 来求解经济调度问题Matlab 写起来也顺手最近整理代码的时候正好把整个思路和实现过程重新捋了一遍。这篇文章就把这套方案的核心逻辑、建模细节、代码框架和实际调试中踩过的坑一次性讲清楚给正在做微电网调度仿真的朋友们一个可以直接参考和复现的完整路径。1. 微电网调度问题拆解先搞清楚我们到底在优化什么1.1 微电网的基本构成与能量流动微电网本质上是一个小型的发配电系统由分布式电源比如光伏、风电、柴油发电机、储能系统蓄电池、本地负荷以及并离网切换装置组成。调度问题的核心就是在满足负荷需求的前提下决定每个时段各个电源出多少力、蓄电池是充电还是放电、以及和主网之间交换多少功率。很多刚接触这个方向的朋友容易把调度问题想得太简单觉得无非就是缺电就买电富余就卖电。但实际情况要复杂得多光伏和风电的出力是波动的蓄电池有充放电效率、有SOC上下限约束、还有循环寿命代价柴油发电机有燃料成本还要考虑启停损耗分时电价又让什么时候买电卖电直接决定经济性的好坏。这一堆因素叠在一起本质上是一个带约束的非线性优化问题。从时间尺度上讲微电网调度一般分日前调度day-ahead scheduling和日内滚动调度intraday dispatch。日前调度通常以 1 小时为一个时段把未来 24 小时作为优化区间在已知预测数据的前提下给出全天的调度计划。我们这里做的 Matlab 实现就是针对这种典型的日前经济调度场景。1.2 调度优化目标里的经济账怎么算调度目标最常见的是最小化总运行成本但成本这两个字包含的项目不少。我通常会把成本拆成四块来看购售电成本向配网购电需要花钱向配网售电有收入。分时电价下这个成本和购售电时段强相关也是调度最主要的经济杠杆。燃料成本柴油发电机消耗柴油一般用二次函数近似表示燃料消耗率和出力之间的关系是一个典型的凸函数项。运维成本光伏、风电、柴油机、蓄电池在运行过程中都有维护费用可以按出力比例折算也有按启停次数计算的。蓄电池退化成本锂电池充放电循环会带来容量衰减这部分在近年来的研究里讨论得越来越多。简单处理时可以用一个充放电功率相关的惩罚项去模拟追求精细的话可以引入循环老化模型。需要强调的一点是目标函数里各项的成本系数怎么取会直接决定优化结果的方向。比如蓄电池的退化成本设得太高优化算法就会倾向于少用储能设得太低蓄电池就会被频繁充放电虽然短期经济性好但设备寿命会明显打折。所以建模阶段就要想清楚这个调度结果是要服务什么场景是偏运行经济性还是偏设备维护周期。1.3 约束条件比目标函数更容易被忽略很多人在做调度仿真时目标函数写得很快结果却栽在约束条件上。微电网调度里比较核心的约束有这些功率平衡约束每一时段内各分布式电源出力加上蓄电池放电功率、加上购电功率要等于本地负荷加上蓄电池充电功率、加上售电功率。这是硬约束不满足就没有任何物理意义。电源出力上下限光伏、风电出力受天气影响但有一个预测出力上限柴油发电机有最小技术出力不能太低和额定最大出力。蓄电池SOC动态约束下一时段的 SOC 由当前 SOC、充放电功率、充放电效率和时段长度共同决定同时 SOC 必须保持在安全区间内不能过充过放。爬坡约束柴油发电机的出力不能瞬时大范围变化每时段之间有一个出力变化速率上限。我见过不少初学者的代码目标函数都写对了但忘了加功率平衡约束或者 SOC 的计算公式里忘了乘效率系数最后仿真出来的最优方案根本没法落地。这类问题在代码实现阶段一旦不留意后面排查起来特别费劲。2. 差分进化算法为什么它适合做微电网调度2.1 DE算法的核心机制变异、交叉、选择三步走差分进化算法Differential Evolution是 Storn 和 Price 在 1997 年提出的基于种群迭代的全局优化算法。它属于进化算法家族但和遗传算法GA有显著区别GA 依赖交叉和变异算子编码方式多样而 DE 最核心的特点是用种群内个体的差分向量来驱动变异整个迭代过程几乎不需要针对特定问题设计复杂的编码和遗传算子。DE 的基本流程可以归纳为四个步骤初始化种群在决策变量的可行域内随机生成 NP 个个体每个个体就是一个候选调度方案在微电网问题里对应的就是各时段各设备的出力数组。变异操作对于种群中的每个目标个体随机选择另外三个不同的个体用其中一个加上另外两个的差值乘以缩放因子 F生成变异个体。这个差分向量是 DE 的灵魂它让变异步长能自适应地随种群分布变化——种群分散时步长大收敛后期步长变小这样在探索和开发之间形成自然的平衡。交叉操作将变异个体和目标个体按交叉概率 CR 进行参数混合生成试验个体。这里要注意的是DE 的交叉是面向决策变量维度的比如我们有 96 个决策变量24 时段 × 4 个设备每个维度都有机会来自变异个体或目标个体。选择操作计算试验个体的目标函数值如果优于当前目标个体就替换它进入下一代。这个贪婪选择策略保证了种群整体的适应度不会退化。2.2 与遗传算法、粒子群算法相比的优势做微电网调度时我为什么更推荐 DE 而不是 GA 或者粒子群PSO这不是盲目站队而是实际对比过之后得出的体会。遗传算法GA在调度问题里通常需要把连续变量离散化或采用实数编码但 GA 的交叉和变异算子参数多、调整复杂而且容易出现早熟收敛。相比之下 DE 的搜索导向更明确差分变异机制使得种群多样性维持得更好。粒子群算法PSOPSO 收敛速度确实快但对参数惯性权重、学习因子比较敏感容易陷入局部最优。在微电网这类多约束非线性问题里PSO 经常会在某个局部解附近停滞而 DE 由于变异的随机性和种群信息的利用方式不同找到全局最优的概率更高。DE 的工程优势参数少核心就是 NP、F、CR 三个结构简单Matlab 实现只需要几十行核心代码而且实测在各种测试函数上的稳定性都不错。对于微电网调度这种高维度、强约束、非线性的工程优化问题DE 是一个兼顾实现成本和求解质量的稳妥选择。2.3 差分进化算法的关键参数与调试经验DE 算法的三个核心参数种群规模 NP、缩放因子 F、交叉概率 CR具体怎么设我提几个自己常用的经验值。种群规模 NP一般取决策变量维度的 5~10 倍。24 时段调度问题如果每个时段有 4 个控制变量维度是 96那 NP 取 100~200 是合理的。太小了容易早熟太大了计算量上不划算。缩放因子 FF 控制了差分扰动的强度一般取 0.4~0.9。F 太大搜索范围广但收敛慢F 太小容易陷入局部最优。我习惯先取 0.6然后根据收敛曲线的振荡情况微调。交叉概率 CRCR 决定了试验个体从变异个体中继承基因的比例一般取 0.6~0.95。CR 小有利于保持种群多样性CR 大则加速收敛。对于微电网调度这种相邻时段变量相关性较强的问题CR 取高一些0.8 以上通常效果不错。3. 目标函数与约束条件的建模过程3.1 目标函数的具体数学表达微电网经济调度的目标函数我用一个统一的数学形式表示出来可能更直观。假设调度周期为 T24 个时段包含 m 台柴油发电机、光伏、风电和蓄电池目标函数可以写成min F Σ(P_grid_buy(t) × price_buy(t) - P_grid_sell(t) × price_sell(t)) Σ(fuel_cost_i(P_diesel_i(t))) Σ(OM_cost_j(P_j(t))) Σ(battery_degradation_cost(P_bat(t)))其中P_grid_buy(t) 和 P_grid_sell(t) 分别是 t 时段的购电和售电功率price_buy 和 price_sell 是相应的分时电价。fuel_cost_i(P_diesel_i(t)) 是第 i 台柴油发电机在 t 时段的燃料成本一般用二次函数 a×P² b×P c 表示。OM_cost_j(P_j(t)) 是第 j 个设备的运维成本通常按出力的比例系数折算。battery_degradation_cost(P_bat(t)) 是蓄电池充放电导致的退化成本我一般用充放电功率的线性或二次项来表示。代码实现时目标函数会被封装为一个函数输入是决策变量向量输出是总成本标量。这里有一个重要的实现细节所有时段的所有设备出力决策变量要组织成一维向量的形式输入给优化算法而不是用一个高维矩阵。3.2 约束条件的数学化与罚函数处理约束条件分为等式约束和不等式约束两类。等式约束最核心的就是功率平衡约束P_pv(t) P_wind(t) ΣP_diesel_i(t) P_bat_discharge(t) P_grid_buy(t) P_load(t) P_bat_charge(t) P_grid_sell(t)这个约束的处理方式直接影响优化算法的收敛效果。DE 这类元启发式算法本身不擅长处理等式约束我在实际代码实现里采用了罚函数法如果某个候选解不满足功率平衡就在目标函数上加一个很大的惩罚项让算法自动淘汰这些不可行解。罚函数的具体形式我是这样设计的penalty λ × |P_pv P_wind ΣP_diesel P_bat_discharge P_grid_buy - P_load - P_bat_charge - P_grid_sell|λ 是一个很大的惩罚系数一般取 10⁵ 甚至更大确保不可行解的适应度值远差于可行解。在 DE 的选择操作中这些带惩罚的不可行解很快就会被淘汰掉。不等式约束包括机组出力上下限、SOC 上下限、充放电功率限制、爬坡约束。这些约束在初始化种群和变异交叉后都需要做越界处理。我的做法是对于出力上下限直接把越界的变量值裁剪到边界。对于 SOC 约束因为 SOC 是时序递推变量不能简单裁剪而是在计算 SOC 序列后检查是否有越界如果有则在目标函数里加惩罚项。对于爬坡约束在目标函数里加惩罚项处理因为单纯裁剪会破坏时序变量之间的关联性。3.3 典型系统参数设置参考为了让后面的代码示例和仿真结果有具体的数值基础我列一组我常用的典型微电网系统参数。这套参数差不多是文献里比较常见的组合也是我测试代码时的标准配置。设备参数数值光伏额定容量600 kW风电额定容量300 kW柴油发电机额定功率400 kW柴油发电机最小技术出力40 kW蓄电池额定容量600 kWh蓄电池最大充放电功率150 kW蓄电池充放电效率0.95蓄电池SOC 范围0.1 ~ 0.9主网交互最大购电功率500 kW主网交互最大售电功率200 kW这里要说明一下不同研究里蓄电池容量和充放电功率的参数差异比较大大家做仿真时根据自己课题的场景合理调整就可以关键是代码逻辑要跟参数设置保持一致。4. Matlab代码实现与仿真流程4.1 程序整体架构设计Matlab 实现 DE 算法的微电网调度我习惯把代码分成几个模块每个模块一个 .m 文件结构清晰也方便调试。整体框架是这样的main.m主程序入口负责加载数据、调用 DE 优化、输出结果。DE_algorithm.m差分进化算法主体包括初始化、变异、交叉、选择循环。objective_function.m目标函数输入一维决策变量输出总成本。constraints_check.m约束检查与罚函数计算。plot_results.m结果可视化模块。这种模块化设计的好处是可以单独测试每个函数。比如我只想验证目标函数写得对不对可以在命令行手动输入一组决策变量直接调 objective_function 看输出成本是否合理不用跑完整的优化循环。4.2 决策变量的编码方式决策变量的编码是写代码前最需要想清楚的事情。在 24 时段调度问题里我用的编码方式是把每个时段的控制变量展开成一维向量。假设系统包含光伏、风电、柴油发电机、蓄电池、主网购电、主网售电六个控制对象决策变量可以组织如下变量 1~24柴油发电机各时段出力如果有多个柴油机就再扩展变量 25~48蓄电池各时段放电功率变量 49~72蓄电池各时段充电功率变量 73~96各时段购电功率变量 97~120各时段售电功率光伏和风电出力在日前调度里一般作为已知的预测序列处理不作为决策变量因为它们是不可控的。这样每个个体就是一个 120 维的向量DE 算法就在这个 120 维空间里搜索最优解。4.3 核心代码实现解析DE 算法主循环的 Matlab 实现并不复杂我贴一段核心代码框架% DE主循环 for gen 1:MaxGen for i 1:NP % 变异操作DE/rand/1策略 r1 randi([1, NP]); while r1 i, r1 randi([1, NP]); end r2 randi([1, NP]); while (r2 i) || (r2 r1), r2 randi([1, NP]); end r3 randi([1, NP]); while (r3 i) || (r3 r1) || (r3 r2), r3 randi([1, NP]); end mutant population(r1, :) F * (population(r2, :) - population(r3, :)); % 交叉操作二项式交叉 trial population(i, :); j_rand randi([1, D]); for j 1:D if (rand CR) || (j j_rand) trial(j) mutant(j); end end % 越界处理将变量裁剪到边界范围内 trial max(min(trial, ub), lb); % 选择操作贪婪选择 cost_trial objective_function(trial, data); cost_target objective_function(population(i, :), data); if cost_trial cost_target population(i, :) trial; cost_pop(i) cost_trial; else cost_pop(i) cost_target; end end % 记录当代最优 [best_cost(gen), best_idx] min(cost_pop); best_solution population(best_idx, :); end目标函数的实现也没有太多玄机核心就是根据决策变量解算出各时段的功率平衡情况然后计算成本项。一个简化的目标函数代码示例如下function total_cost objective_function(x, data) % 从决策变量x中拆出各设备出力 P_diesel x(1:24); P_bat_dis x(25:48); P_bat_ch x(49:72); P_buy x(73:96); P_sell x(97:120); % 基础数据读取 P_pv data.P_pv; % 光伏预测出力 P_wind data.P_wind; % 风电预测出力 P_load data.P_load; % 负荷曲线 % 计算各成本项 % 1. 购售电成本 grid_cost sum(P_buy .* data.price_buy - P_sell .* data.price_sell); % 2. 柴油发电机燃料成本二次函数 fuel_cost sum(data.a * P_diesel.^2 data.b * P_diesel data.c); % 3. 运维成本 om_cost sum(data.om_coeff .* [P_diesel; P_pv; P_wind; P_bat_dis P_bat_ch]); % 4. 蓄电池退化成本 battery_cost sum(data.battery_cost_coeff * (P_bat_dis P_bat_ch)); % 5. 总成本 total_cost grid_cost fuel_cost om_cost battery_cost; % 6. 约束检查与罚函数 % 功率平衡约束 balance P_pv P_wind P_diesel P_bat_dis P_buy ... - P_load - P_bat_ch - P_sell; penalty_balance data.lambda * sum(abs(balance)); % SOC约束检查需要根据充放电功率计算SOC序列 [SOC, soc_penalty] compute_SOC(P_bat_ch, P_bat_dis, data); total_cost total_cost penalty_balance soc_penalty; end4.4 仿真结果的可视化与分析优化完成后结果的展示和分析同样重要。一个好的结果可视化能够直观地展示调度方案的合理性和算法的有效性。我通常输出这几张图功率平衡图堆叠柱状图展示各时段各电源的出力、负荷、购售电功率直观看出每个时段能量从哪里来到哪里去。蓄电池 SOC 变化曲线展示储能系统的充放电状态与 SOC 变化轨迹检查是否在安全范围内。收敛曲线展示 DE 算法每代最优成本的变化轨迹判断算法收敛速度和稳定性。分时电价与购售电策略对照图把电价曲线和购售电功率曲线放在一起看能发现算法是否合理地低买高卖。5. 实际仿真中的参数调优与结果分析5.1 DE算法参数对收敛性能的影响我在调试过程中对 NP、F、CR 三个参数做过系统的对比测试这里把观察到的现象和结论分享出来。种群规模 NP 的影响NP 从 30 增加到 200收敛曲线的表现差异非常明显。NP 太小时比如 30算法经常在前期就收敛到某个局部最优后续迭代基本没有改善。NP 增大到 120 以上后最终优化结果明显更优但迭代到后期计算量也上来了。我的建议是 NP 取解码变量维度数的 1~2 倍就够用了120 维的问题 NP 取 120~240再增加收益就非常有限。缩放因子 F 的影响F 是 DE 里最敏感的参数。F0.3 时收敛快但容易早熟F0.9 时搜索范围大但收敛速度慢后期要在最优解附近精细搜索时不够高效。我最终测试下来F0.6 是一个比较稳的选择前期能探索较大的区域后期结合交叉操作也能保证局部搜索能力。交叉概率 CR 的影响CR 决定了试验个体从变异个体继承变量的比例。对于微电网调度这种决策变量之间有时序相关性的问题CR 不能取得太低。CR0.3 时试验个体大部分变量来自目标个体算法变异速度慢搜索效率低下CR 提升到 0.8 之后优化效果有明显改善。我在最终版本里用的是 CR0.85。5.2 收敛曲线的判读与运行状态诊断收敛曲线是判断 DE 算法运行状态最直接的依据。根据我的调试经验收敛曲线大致可以分三种典型形态理想形态前期迅速下降中后期平缓下降或基本持平最终稳定在一个较低水平。这说明算法既保持了较快的收敛速度又没有明显早熟。早熟收敛曲线在迭代早期就快速下降然后长期不再变化最终优化结果明显偏离理论最优。这说明种群多样性丧失过快需要增大 NP 或 F。收敛过慢曲线持续下降但速度很慢到最大迭代次数还没稳定。这说明参数设置偏向探索而忽视了开发可以适当减小 F 或增大 CR。我在实际调试中常做的一个操作是先用较少的迭代次数比如 100 代快速测试一组参数看收敛曲线的形态再根据形态调整参数。这样比直接跑完 1000 代再观察效率高得多。另一个常用的方法是对同一组参数多次重复运行观察最优解的方差。方差大说明算法稳定性差需要调整参数。5.3 典型调度结果的经济性分析用上面这套模型和参数跑完仿真后调度结果里有一些值得注意的现象。我拿一个典型场景来说明白天光伏出力高峰时段算法会优先让光伏供电多余电量在电价较高时段卖给电网夜间光伏为零、电价低谷时算法会从电网购电给蓄电池充电在电价高峰时段放电供给负荷。这种低充高放的储能运行策略正是微电网经济调度追求的效果。值得注意的一个细节是在考虑蓄电池退化成本的情况下算法不会让蓄电池频繁深度充放电而是倾向于在一天内几次充放电中平衡收益和设备损耗。这说明目标函数里各成本项的权重配比对最终的调度策略有决定性影响。从成本结构看购电成本往往占大头燃料成本次之运维成本和蓄电池退化成本相对较小。如果仿真结果显示某个成本项的占比显著异常比如蓄电池每天的充放电循环次数过多就要检查是不是退化成本的系数设得太低了。6. 常见报错与调试经验实录6.1 运行时最常见的三类问题维度不匹配问题。这是初学者最容易遇到的错误。决策变量设计的维度是 120但目标函数里拆解变量时数组长度对不上或者数据表里 PV 出力数组是 23 个小时的数据而不是 24 个小时都会导致维度错误。这类问题排查起来也不难Matlab 会在报错信息里告诉你哪一行哪个变量维度不对对着检查就行了。我自己的经验是在目标函数入口处加一行断言assert检查所有输入数组的长度是否等于 24提前暴露问题。SOC 计算发散的问题。蓄电池 SOC 是一个递推变量如果充放电效率系数设置有误比如大于 1或者初始 SOC 设置不合理SOC 序列在优化过程中可能越界甚至发散。问题比较隐蔽因为算法不一定会报错只是最终调度结果里的 SOC 曲线看起来很奇怪。排查方法是单独写一个函数给定一组充放电功率画出 SOC 的变化曲线看是否符合物理规律。罚函数系数过小导致的不平衡解问题。罚函数系数 λ 取太小比如 10时不可行解的惩罚力度不够DE 算法可能返回一个不满足功率平衡的最优解。表现为功率平衡图里各时段的总发电量和总负荷存在明显差距。解决办法是把 λ 调大几个量级或者对功率不平衡量做平方惩罚。6.2 代码调试的排查技巧Matlab 的断点调试功能在 DE 算法调试中非常有用。我常用的一个技巧是在 selection 操作后设置条件断点当目标函数值出现异常变化比如突然增大时停下分析看是变异越界导致的还是目标函数本身数值计算出了问题。另外建议在目标函数内部加上 fprintf 输出关键中间变量的选项通过一个 debug 标志控制开关。这样在正式运行时关闭输出避免刷屏在调试时打开输出就能看到每个时段的功率平衡情况排查效率会高很多。还有一个很实用的思路先用极小的种群规模和迭代次数比如 NP10、MaxGen20把整个流程跑通确认没有任何报错、所有函数的输入输出逻辑正确再加大规模跑正式实验。这样可以大大减少正式实验中的意外中断。6.3 Matlab版本兼容性与代码优化建议Matlab 的版本跨越比较大时部分函数的行为可能不同。早期版本对数组索引、隐式扩展的支持不如新版本代码里如果用了 R2016b 之前不支持的自动隐式扩展比如把一个列向量和行向量直接做点乘老版本会报错。跨版本使用代码时建议把这类操作改成显式使用 repmat 或 bsxfun保证兼容性。在性能优化方面DE 算法最耗时的部分就是目标函数的反复调用。一次运行要计算 NP × MaxGen 次目标函数如果目标函数内部有循环或者重复计算整体耗时会上来。我常用的优化手段是向量化计算目标函数里尽量避免 for 循环改用数组运算。预分配变量所有数组在使用前用 zeros 或 ones 预分配内存。减少重复计算目标函数里有些中间量比如柴油机的燃料成本系数在迭代中不变化可以在优化前提前算好放到 data 结构体里避免每次调用都重新计算。7. 后续扩展方向与个人体会微电网调度研究的方向和扩展点很多我这里结合自己的经验提几个值得探索的方向。关于不确定性处理目前这个实现里光伏和风电出力是确定性的预测值实际场景中它们的预测误差不能忽略。可以考虑引入场景法或鲁棒优化的思路在目标函数里加入对预测误差的考量让调度方案在实际运行中更稳健。关于多目标优化纯经济调度只考虑了成本实际微电网运行还关心碳排放、电压质量等指标。把 DE 扩展成多目标版本比如 NSGA-II 或 MOEA/D决策者就可以在成本和环保之间做权衡这也是学术界很热门的方向。关于实时调度日前调度是离线优化实际运行时还需要滚动修正。可以在这个 Matlab 实现的基础上加入模型预测控制MPC的滚动优化逻辑实现日前计划加日内修正的两层调度框架。最后再分享一个小技巧在跑大规模参数实验时可以把不同参数组合的实验结果用表格记录下来包括最优成本、收敛代数、运行时间用 Matlab 自带的 publish 功能生成报告方便后期分析参数敏感性也方便写论文时引用数据。这个小习惯帮我省了很多重复实验的时间值得推荐。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价