资讯动态

主从博弈在综合能源系统优化调度中的应用:需求响应与电能交互策略解析

发布时间:2026/10/21 6:19:10 来源:尧图企业网站定制
做综合能源系统优化调度很多人在建模时容易忽略一个问题你面对的不是一个孤立的系统而是多个拥有独立决策权的利益主体。光伏、储能、燃气轮机、可控负荷这些资源再叠加需求和电价的不确定性如果还按单一主体求全局最优的思路去做算出来的结果往往在现场根本落不了地。这篇内容围绕“计及需求响应和电能交互的多主体综合能源系统主从博弈优化调度策略”展开完整梳理了从问题建模、主从博弈框架设计、需求响应与电能交互的核心机制到Matlab代码实现和调试经验的全过程。这个方向适合正在做综合能源、微电网、虚拟电厂相关课题的研究生和工程师也适合想从传统单目标优化转入多主体博弈优化的从业者。我会把这套方案背后“为什么这么设计”的逻辑讲透再把能直接复用的代码结构、参数设置和避坑点都摆出来。1. 问题建模先把“多主体博弈”这事想清楚1.1 多主体综合能源系统的边界是什么先明确一个概念多主体综合能源系统不是一个纯技术名词它描述的是一个“多个决策单元在同一物理网络内各自优化、相互影响”的运行场景。典型的例子比如一个园区里有几个微能源网各自拥有光伏、储能、燃气轮机和一定范围内的冷热负荷同时它们通过同一个配电台区互联向同一个能源服务商购电。每个微网既是电力的消费者也可能在光伏大发或储能富余时变成出售者。这里面的关键变量有三类各主体的负荷曲线、设备出力和灵活性资源储能、可调负荷以及它们之间的交互边界联络线容量和交易电价。传统优化模型通常把整个系统看成一个整体目标函数只有一个所有设备统一调度。但现实是不同主体之间不存在绝对统一指挥每个主体都有自己的利益诉求。如果你想设计一套实际可用的调度策略就必须承认这种利益结构的存在然后用博弈论去处理利益冲突。1.2 需求响应和电能交互到底解决什么问题需求响应的本质是让负荷从“刚性”变成“柔性”。没有需求响应时负荷曲线是给定的调度只能靠机组出力和储能去跟踪负荷如果光伏晚间出力不足、负荷又处于高峰系统要么高价从上级电网购电要么被迫削减负荷。加入需求响应后一部分可转移负荷比如工业流水线、充电桩和可削减负荷比如空调、照明可以在电价信号的引导下改变用电时段和用电量相当于给系统增加了“虚拟储能”。电能交互解决的是空间维度的调节问题。分布式资源在各主体之间的分布往往不均衡A微网中午光伏溢出一大截B微网却因为负荷大在峰时段高价购电如果允许A和B通过联络线直接交易可以减少对上级电网的依赖也能把富余清洁能源在本地消纳掉。说白了需求响应是在时间轴上找弹性电能交互是在空间维上找互补。1.3 为什么选主从博弈而不是合作博弈多主体博弈有几类经典框架合作博弈、非合作博弈、Stackelberg主从博弈。合作博弈需要所有主体共享信息并达成有约束力的联盟协议在学术上可以做但实际落地时涉及大量隐私问题——谁都不想把真实成本和用能数据全部摊开。非合作博弈的Nash均衡适合地位对等的多个主体同时决策但现实中往往有一个上层决策者比如能源服务商、虚拟电厂运营商掌握定价权下层多个用能主体再根据价格做最优响应。这种“一个领导者 多个跟随者”的层级结构正是Stackelberg博弈的标准范式。上层先公布电价策略下层在给定价格下各自优化上层再根据下层的响应调整策略直到达到均衡。选择主从博弈不是因为它学术上更“高端”而是因为它更贴合综合能源系统的真实利益结构运营商的角色就是制定价格、引导行为用户主体是在价格约束下追求自身用能成本最小化。2. 数学模型拆解目标函数与约束条件2.1 上层领导者的优化模型上层角色设定为一个能源服务商负责向各微网主体售电和购电同时也要和上级电网做功率交换。它的决策变量包括各时段向主体m售电的价格、从主体m购电的价格以及自身与上级电网的交换功率。价格策略要用区间约束圈住防止市场价格跑飞。运营商的收益包括两匹向用户出售电能的收入加上在上级电网进出的套利空间减去从用户那里回收多余电力的成本。目标函数里要处理的核心难点是用户购售电量并不是常数而是体现了对价格的反应函数形成了双线性项。这个项必须在求解时通过下层KKT条件或迭代方式替换掉不能直接丢给求解器。约束条件包括电价上下限、购售电功率平衡约束以及与上级电网的交互功率限制。实践经验是电价上下限不能只设一层笼统的边界最好按照峰平谷时段单独差异化设置否则算出的价格曲线在均衡点附近容易出现不合理的跳变。2.2 下层跟随者的优化模型每个微网主体m在下层做自己的用能经济调度目标是自身总成本最小化。成本项包括从能源服务商购电的成本、天然气购气成本、储能与各类设备的运维成本以及削减负荷时需支付的补偿成本。如果该主体向其他主体卖出电能售电收入要计入负成本。下层微网内部的设备和约束是模型里最繁琐的部分包括电功率平衡约束燃气轮机和余热回收机组的出力上下限与爬坡约束储能的充放电功率约束、SOC递推和上下限约束电锅炉、热泵等电热转换设备的模型约束很多人在写下层模型时会搞错一件事以为每个主体只优化自己内部的设备就行。实际上博弈框架下主体的策略空间同时包含从上层购买的电量、向交互网络售出的电量以及内部设备出力。如果只写设备约束而忽略交互边界条件下层优化会出现“购买电量无上限、反正成本算在目标里”的问题最终得到违反联络线物理限制的解。下层响应是整个博弈求解的关键。每个主体的优化问题在给定电价下通常是一个线性或混合整数线性规划这也是后面能用KKT条件转化的前提。2.3 需求响应的建模方法需求响应在这类模型里通常用两种方式处理。第一种是价格弹性模型直接用一个弹性系数矩阵把负荷变化量与电价变化量关联起来。这个方式的优势是表达简洁但矩阵参数很难取准尤其多主体场景下每个主体的弹性不同数据的可获取性很差误差容易在双层迭代里被放大。我更推荐第二种就是按负荷类型分开建模的可调度负荷模型。可转移负荷定义为在指定时间段内总用电量不变但可以根据电价信号在各时段间重新分配。用约束来保证转移前后总电量守恒同时限制每个时段的转移上限。可削减负荷则有一个最大削减比例削减动作会产生相应补偿成本。相比弹性模型这种方式每个参数的物理含义都清楚也更容易在Matlab里加约束求解。真正做代码时这条路径的调试成本低很多。2.4 电能交互机制与联络线约束电能交互不是一个简单的买卖信号它涉及到交互的物理载体和价格机制两个层面。物理载体是联络线有交互容量上限交互功率的大小和方向在每个时段都是变量。价格机制则决定了A主体卖给B主体的电怎么定价这条定价链条直接影响下层各主体的决策。在本文的方案里电能交互不引入单独的交互价格变量而是各主体先按上层给定的买卖电价汇总出自己在交互网络里的净注入或净吸收功率再由上层统一结算。这么设计的考虑是避免下层模型里出现双重价格博弈否则模型规模会暴涨迭代也容易振荡。实际执行时每个主体的功率平衡里要加入与其他主体的交互功率项并且对整体系统增加全网功率平衡约束确保所有主体的购售电总量在交互网络上守恒。电网侧约束也不能搭虚架子。联络线传输功率上限要用松弛因子做可行性保护防止外层迭代产生的临时电价导致内层无解。松弛因子会破坏精确的物理可行性但只要设置一个足够小的惩罚系数既能保住求解稳定性又不至于影响最终策略实质。3. 求解方法主从博弈的双层优化实战套路3.1 直接KKT转化与求解器求解将下层每个主体的优化问题写出拉格朗日函数求KKT条件再用强对偶定理或KKT条件替换进上层模型最终形成单层混合整数线性规划问题交给Cplex或Gurobi求解。这是学术论文里最主流、数学上最优雅的路线。好处是求解精度高不依赖启发式参数稳定复现性好。代价在于每个下层主体的优化问题需要额外引入对偶变量、互补松弛变量和大M约束膨胀规模明显。一个含3个主体、24个时段、每个主体几十个约束的下层问题KT转化后的单层问题会新增成百上千的变量和约束求解时间可能从几秒变成几分钟规模更大的话内存也会吃紧。要用好这条路需要掌握一个核心技巧互补松弛条件必须放宽到近似形式直接用精确形式往往被求解器的数值容差卡住导致原本可行的问题被判为不可行。我一般把互补松弛条件放在一个极小容忍度范围内处理对调度策略的影响可以忽略。3.2 迭代逼近法主从交替与粒子群方案不追求一次把双层问题全部写完而是用迭代的方式模拟博弈过程。外层初始化一组电价把电价代入各个下层主体求解每个主体的最优响应再把响应结果返回上层计算上层收益用投鞭子法更新电价重复直到收敛。这种方式的好处是代码逻辑与博弈过程完全对应便于调试和逐层检查。更新电价的策略决定了收敛质量。我试过直接用上一轮最优响应做硬切换结果价格振荡非常剧烈很难稳定。后来在每个时段的电价更新公式中加入阻尼系数让新价格等于旧价格加上较小步长乘以响应偏差修正项收敛性明显改善。实践中步长通常取0.05到0.2具体值需要根据电价上下限范围归一化后微调。粒子群PSO是在迭代逼近框架里更进阶的做法外层用粒子群产生一组电价序列求各主体的最优响应后把上层收益作为适应度回传逐步迭代逼近均衡。PSO对非线性、非凸问题有更强的全局搜索能力但代价是参数敏感、计算量大。粒子数量一般取30到50每个粒子代表一条完整的24小时电价曲线迭代50到100次单次完整实验在普通桌面级机器上跑半个小时到一个小时属于正常量级。3.3 两种方法怎么选一个实用决策表场景特征推荐方法主要理由规模适中数学基础扎实KKT转化 MILP精度高、确定性强、可复现模型规模很大约束复杂主从交替迭代逻辑清晰、内存可控高度非线性多峰特性明显PSO嵌套下层优化全局寻优能力更强需要快速探索不同参数场景主从交替迭代省去大规模矩阵重建的时间3.4 线性化与大M法的具体处理下层模型整理成标准线性规划是最关键的一步需要把两类典型非线性项做线性化。一类是最小最大值操作项比如储能充放电状态与功率的耦合需要用二进制变量拆开。另一类是双线性项比如电价乘以电量这在KKT转化后的上层模型里最棘手通常用强对偶等式替换消去或者用McCormick包络做松弛。大M法处理互补松弛条件时M值的选取会让很多人踩坑。M太小可能把本来可行的解排除掉M太大数值病态问题凸显求解器精度告急。我在这个项目里将M设置为电价上限的两倍并保证大于所有对偶变量的理论极值测试下来不需要漫无边际地调到很大。另外迭代求解时给互补松弛条件单独设置一个容差阈值比强行要求精确互补要高效得多。4. Matlab代码实现从空文件到可跑结果4.1 代码整体框架与模块划分我不建议把几百行模型全部塞进一个脚本后期的改动必然让你抓狂。实际操作时把代码按功能拆成模块每个模块只负责一件事。main.m总入口负责设定系统参数、调用优化与绘图模块data_init.m定义电价上下限、负荷曲线、光伏风电出力序列、储能参数、联络线参数upper_init.m构造上层能源服务商的决策变量和目标函数lower_model.m根据输入电价求解每个下层主体的最优响应kkt_convert.m把下层问题转化为KKT条件并入上层单层问题mcp_solve.m用Yalmip Cplex/Gurobi求解整体模型psosolve.m外层粒子群求解器内含下层优化调用plot_result.m输出电价曲线、负荷曲线、储能SOC和各主体购售电功率main.m里要提供一个全局开关在“KKT单层求解”和“迭代逼近/粒子群”两种模式之间切换。这样你能在同一个项目里直接对比两种方法也给后续扩展留了空间。4.2 核心代码示例下层主体优化Yalmip描述下层主体的优化问题用Yalmip建模非常直观核心代码框架如下function [obj, P_buy, P_sell, P_g, P_es, P_load_shift] lower_model(...) % 决策变量定义 P_buy sdpvar(T, 1); % 从能源服务商购电 P_sell sdpvar(T, 1); % 向能源服务商售电 P_g sdpvar(T, 1); % 燃气轮机出力 P_es sdpvar(T, 1); % 储能充放电正为充负为放 P_load_shift sdpvar(T, 1);% 可转移负荷调整量 % 约束条件集合 C []; % 功率平衡 C [C, P_load0 P_load_shift P_es P_buy P_res P_g ... - P_sell]; % 燃气轮机上下限与爬坡 C [C, P_gmin P_g P_gmax]; C [C, -delta_g P_g(t1) - P_g(t) delta_g]; % 储能约束 C [C, SOC_min SOC_init cumsum(P_es*eta)/Cap SOC_max]; C [C, -P_es_max P_es P_es_max]; % 可转移负荷守恒 C [C, sum(P_load_shift) 0]; % 可转移负荷上下限 C [C, -delta_shift P_load_shift delta_shift]; % 目标函数购电成本 天然气成本 运维成本 - 售电收入 obj sum(price_buy.*P_buy) c_gas.*sum(P_g) ... c_om.*(sum(P_g) sum(abs(P_es))) - sum(price_sell.*P_sell); optimize(C, obj, sdpsettings(solver, cplex)); end几个细节值得说。储能充放电和可转移负荷都引入了辅助变量避免同时出现正负值约束发散。储能SOC用了累加表达式在24时段规模下效率高但如果扩展成8760小时365×24的年度调度需要改用更高效的递推变量写法避免巨大的累加矩阵。4.3 粒子群外层求解的主体结构粒子群嵌套求解的核心逻辑是把每个粒子的位置映射为一个完整的电价序列向量再通过下层优化函数计算响应和适应度。关键代码如下for t 1:T x(i, t) price_min(t) (price_max(t) - price_min(t)) * rand; end for gen 1:maxgen for i 1:npop % 将粒子位置解码为售电价和购电价 price_sell reshape(x(i, 1:T), T, 1); price_buy reshape(x(i, T1:2*T), T, 1); % 计算各个主体在下层的最优响应 for m 1:M [obj_lower(m), P_buy(m,:), ~, ~, ~, ~] ... lower_model(m, price_sell, price_buy, data_m{m}); end % 计算上层收益作为适应度 fitness(gen, i) compute_upper_profit(price_sell, ... price_buy, P_buy, P_sell); end % 更新个体最优和全局最优 % 更新速度与位置 end粒子群外层迭代的瓶颈在下层优化。我建议把各个主体的下层模型并行化Matlab的parfor可以直接把for m 1:M改成并行循环我测试过在4核机器上能省掉将近60%的计算时间。但并行池启动有开销如果你只有2个主体且时段数很少并行反而不划算这个要按规模来定。4.4 参数设置的关键点与方法参数设定对求解质量的影响非常大我按优先级从高到低列出几个必须反复确认的关键项联络线交互容量与实际台区容量匹配。这个参数决定电能交互策略的边界如果设得过大系统会过度依赖主体间交易导致上级电网功率约束形同虚设。储能SOC约束。初始SOC和终点SOC要合理配对典型做法是令终点SOC等于初始值这样可以维持调度策略的周期性避免把储能“榨干”。可转移负荷比例上限。工程上单时段最大可转移比例建议不超过原负荷的15%到20%比例太高会脱离真实用户行为规律。电价上下限的时段差异。峰时段售电价上限可以比平时段高出50%左右谷时段下限可低于平时段30%左右这样需求响应才有足够的激励空间。收敛容差。迭代逼近法和粒子群都要设置合理的终止准则我在代码里取两次电价变化最大差的绝对值小于0.01元/千瓦时作为收敛判据效果比较理想。5. 算例设计与结果解读5.1 多主体场景怎么设定算例至少配置3个微网主体基础设施和负荷特征差异度要拉开。主体A是工业园区大工业负荷为主有燃气轮机和储能但光伏很少峰谷差大主体B是商业园区白天负荷高、光伏有一定规模储能配置比较小主体C是居民社区晚高峰特征明显光伏和储能都有一些富余。调度周期取典型日24小时分辨率1小时联络线参数按实际场景的配电容量的30%到50%设定。上级电网购电价用峰平谷三段式比各主体间交互电价高出一个梯度这样才能凸显电能交互的价值——如果交互电价和上级电网电价没差异各主体没有动力互相交易。5.2 三类核心对比实验第一组是“无需求响应 无电能交互”的基准场景各主体独立运行负荷刚性只能向上级电网购电产生的总成本最高而且峰时段购电压力大。第二组是“仅加入需求响应不允许电能交互”负荷曲线发生了明显的削峰填谷可转移负荷从峰时段转移到谷时段各主体的购电成本下降但富余光伏依然只能在本地消纳。第三组是“需求响应 电能交互 主从博弈定价”的完整方案主体A在晚间向主体C出售富余光伏电力主体B在白天向A出售一部分储能放出的电力。结果显示系统总成本进一步下降各主体的利益分配也更均衡说明电能交互在空间维度的增益和需求响应在时间维度的增益是可以叠加的。5.3 博弈均衡的收敛性与策略特征主从博弈算法的收敛性要从两条线来看。上层收益曲线显示电价策略在迭代5到8轮之后变化幅度就明显收窄20轮左右基本稳定。各主体的购售电量曲线也从初期的震荡逐步逼近稳定值最终满足Stackelberg均衡条件。博弈定价的典型特征是峰时段售电价显著上调引导可转移负荷向平谷时段转移谷时段购电价适当下调让富余储能和光伏有余力的主体愿意多卖电。交互功率曲线呈现明显的“削峰填谷”特征联络线在白天光伏大发时传输功率上升晚间高峰时段反向输送。这些结果不仅能画出来当论文插图对实际运营调度也有直观的指导意义。6. 常见问题排查与避坑实录6.1 典型问题速查表现象可能原因处理方法下层优化返回不可行功率平衡约束中的联络线功率超限检查上限参数加入松弛因子重新求解KKT转化后模型求解时间过长互补松弛条件产生大量整型变量改成迭代逼近法或压缩冗余互补约束固定价格反复震荡不收敛电价更新步长过大将步长调至0.05加入阻尼或动量项大M法求解结果有偏差M值选取不当设为最大可变范围的两倍不要超过一个数量级潮流失衡总购电大于总售电交互节点未加全网功率平衡约束在交互网络内增加总功率平衡等式约束粒子群效果不如预期PSO参数未适配问题维度增大种群规模限制速度范围调整惯性权重衰减策略6.2 关于互补松弛与大M的实操细节KKT转化后处理互补松弛条件直接写精确等式会让求解器陷入数值困境。建议给每个互补条件一个极小的容差阈值比如1e-4并配合大M法把条件线性化。这是一个约束条件与求解精度之间的博弈不要总想着严格数学化实际工程求解器的容差本身就允许这种近似。M值常见的设置陷阱包括没有考虑不同约束的量纲差异没有区分功率变量与价格变量导致M在一个约束里够用、在另一个约束里溢出。我建议按约束类型分开设置M值价格类约束用小M比如100量级功率平衡类约束用大M比如1e5量级这样数值稳定性最好。6.3 博弈不收敛的排查步骤价格始终弹跳先检查是不是电价边界外溢。电价接触边界时上下层会形成一个死循环上层想推高电价用户侧响应却反向压低需求量价格一直被限制在边界上抖动。第二个常见的坑是多个下层主体之间的耦合约束没有被纳入交互功率不守恒也会导致迭代无法达到均衡。第三步就是检查步长过大的步长会让价格更新产生过冲。如果算法基理没问题但收敛仍是龟速可以考虑把外层迭代改成PSO虽然不是最优解但在工程上往往更快逼近均衡。6.4 计算效率提升的几个小技巧能用线性约束表达的就不要引入非线性函数。模型里出现绝对值、最大值这类操作时尽可能引入辅助变量和线性不等式来替代省得求解器上二次规划甚至在MILP里引入非凸约束。对于KKT转化后的MILP尽量让Cplex或Gurobi开启预求解、裁剪与启发式选项我实测能减少10%到30%的求解时间。当参数扫描需要跑大批次算例时把单次求解的MIP节点上限卡低一点以微小精度损失换取大幅时间节约是工程中很划算的做法。7. 后续扩展参考这套主从博弈框架的扩展潜力很大。引入碳交易机制把碳排放配额作为上层策略变量主体响应里增加碳排放成本和碳捕集选项做成“电-碳耦合”的博弈问题是当前双碳背景下的热门方向。把确定性博弈扩展成考虑新能源不确定性的鲁棒博弈或分布鲁棒博弈下层优化用场景法结合条件风险价值处理能应对光伏风电出力的随机性。代码架构上预留了PSO和KKT两条求解链路后续如果要加多leader博弈可以在上层加入多个运营商之间的Nash均衡求解模块如果要扩充到电-热-气多能耦合只需在data_init.m和lower_model.m中加入热力管网和天然气网络的等式约束整体框架无需推翻重构。从我个人经验看这类项目能否顺利落地关键往往不在算法多复杂而是在建模阶段是否真正理解了“谁在决策、决策变量是什么、决策之间怎么影响”这三件事。把这套主从博弈的动态想清楚后面不管换什么规模和场景都能快速搭出可用的调度模型。

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

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

免费获取报价 →
↑