☰
基于分布式优化的多产消者非合作博弈能量共享仿真
2026/10/16 7:24:30 网站建设 项目流程

做小区级能量共享仿真的时候,很多人看到“基于分布式优化的多产消者非合作博弈能量共享研究”这个题目都会发懵:分布式优化、多产消者、非合作博弈、能量共享,这几个词放在一起,怎么看都像把三个方向硬拼成了一个论文标题。但你只要真正跑过一段仿真就会明白,这几个词描述的是同一个问题的三个层次:底层是每个产消者各自的用电决策,中间是邻居之间的交易耦合,顶层是一套能收敛的分布式求解算法。本文就围绕这条主线,把我复现这类论文时摸索出来的模型设计、算法推导、Matlab代码组织方式,以及那些论文里不会写出来的调参坑,完整过一遍。适合刚入门微电网能量管理的研究生、需要复现博弈类论文的开发者,以及想做分布式算法落地试验的工程师。

1. 产消者的账单博弈:能量共享模型里到底在优化什么

1.1 为什么共享场景天然是一个非合作博弈

所谓产消者,简单说就是“家里既有光伏、又有负荷、还可能装了一块储能”的用户,白天发电多了想卖给别人,晚上发电不够了又想从别人那里买,平时还能跟主网做买卖。很多人一听到“共享”两个字,第一反应是合作调度,觉得大家应该听一个总调度员的安排,谁缺电谁用电、谁多余谁卖电。但实际场景里没有哪个总调度员能命令所有用户降低用电、调整储能,每一户的电费账单都是自己掏钱,目标都是最大化自己的利益,这就是典型的非合作博弈。

这个性质刚开始容易被人忽略。我在跑第一个版本的时候,直接用了集中式社会成本最小化模型,让一个中央控制器分配各户的充放电和交易电量,结果代码跑出来的“最优方案”里,某些产消者明明是净买方,账单却比不参与共享时还高,我一度以为是储能参数写错了。后来才意识到,问题不在参数,而在模型假设:你让中央统筹,本质上是假设所有参与者都愿意牺牲个人利益换取全局最优,但这不是产消者的真实行为模式。它们会单方面偏离对自己不利的方案,直到谁都改不动为止,这个“改不动”的状态才是纳什均衡。

还有个更现实的问题:隐私。产消者并不愿意把自己的光伏出力曲线、负荷曲线、储能SOC全部告诉一个中心节点,尤其当这个中心节点可能是竞争对手或者第三方运营商时。分布式优化的价值就在这里——每个产消者只需要跟自己邻居交换共享功率或者共享价格这类少量信息,就能通过迭代逼近均衡解。这也是为什么这个方向的研究几乎必然绑定分布式算法,而不是直接堆一个集中式KKT系统。

1.2 产消者的数学模型:购售电、储能与功率平衡

要把博弈写成可计算的模型,首先得定义每个产消者的决策变量和约束。我常用的一个基准模型是这样的:每个产消者i在时段t需要决定四类变量——从主网购电功率、向主网售电功率、储能充电功率、储能放电功率,还有一个共享市场里的净买入功率。目标函数就是一天的运行成本,由主网购电费用减去主网售电收益,再加减共享市场里的交易费用组成。

储能约束是最容易被忽略的部分。很多入门代码把SOC当成连续变量扔在0到1之间就完了,但实际上充电效率、放电效率、自放电率这些小参数会影响整个均衡结果。第t时段末的SOC必须写成上一时段SOC加上充电电量乘效率、再减去放电电量除以效率,还要加上自放电损耗。这些关系看似琐碎,却直接决定了储能在晚间电价高时的放电能力是否够用。假如忽略自放电率,在96时段仿真里SOC误差会积累得很明显,迭代收敛后得到的储能调度方案偏向乐观,实际跑起来却打不出那个功率。

功率平衡约束同样关键。每个产消者每个时段必须满足:光伏出力加主网购电加储能放电加共享净买入,等于负荷加储能充电加共享净卖出加主网售电。注意这里共享市场并不允许凭空产生能量,所有产消者的共享净买入之和必须等于零,这个约束是后面引出广义纳什均衡的根源。我一开始做单母线模型时,这个约束写的是“所有共享功率之和等于零”,非常简单,但已经足够让各产消者的可行域互相依赖了。后面扩展到多节点配电网,这个约束会变成节点注入功率平衡加上线路容量约束,本质结构是一样的。

到这里已经能看出来,博弈的核心不是设备模型本身,而是设备模型之间的耦合方式。每个产消者的目标和约束看似独立,共享功率却把它们绑在一起。如果你只做“各自优化”,问题不复杂;一旦加入共享交易,各户的优化问题之间就产生了相互影响。接下来要搞清楚的是这个共享市场怎么结算,因为结算方式决定了博弈的结构到底是简单纳什均衡还是广义纳什均衡。

2. 从非合作博弈到广义纳什均衡:耦合约束是怎么缠上来的

2.1 两种共享结算机制:统一出清价与策略性报价

共享市场的结算方式决定了产消者是价格接受者还是价格制定者,这是模型建模的第一个分岔口。第一种做法是平台统一出清价:每个产消者把自己想买卖的共享电量上报给平台,平台根据总供需生成一个统一的内部结算电价,产消者拿到这个价格后调整自己的策略,下一轮再上报。这种机制下,单个产消者面对的是一个外生给定的价格,只能通过买卖电量来影响自己的成本,收敛后的结果接近完全竞争市场均衡。

第二种做法是策略性报价,每个产消者可以提交一个报价曲线或者直接交换共享电价,报价本身也是策略变量。这种情况下产消者之间会互相试探、互相影响,模型更贴近真实的非合作交易,求解难度也更高。我那段时间复现的多数论文,标题里只要写着“非合作博弈”,最终采用的机制往往是第二种的变体:平台先广播一个初始共享价格,各产消者根据当前价格优化自己的共享功率,再反馈给平台,平台按照供需差额调整价格,如此循环直到价格不再变化。

我比较推荐先做第二种,因为它跟分布式算法的配合更自然。每个产消者在给定共享价格下做的子问题几乎就是个凸优化问题,Matlab里用quadprog就能解;而价格更新部分独立成一个模块,改起来非常方便。等你把整个流程跑通,再回头对比第一种机制,反而更容易看出两种出清方式在均衡点上的差异。

2.2 耦合约束如何把纳什均衡变成广义纳什均衡

经典的纳什博弈里,每个参与者的策略空间只受自己的约束限制,比如你的储能容量、你的光伏上限,别人怎么决策不会改变你能做什么。但共享问题里有个硬约束:所有产消者的共享功率之和必须为零,或者共享功率不能超过公共联络线容量。这意味着我能不能买入共享电力,取决于其他产消者愿意卖出多少;你的可行域里包含我的决策,我的可行域里也包含你的决策。这种策略空间互相依赖的博弈就是广义纳什均衡问题。

广义纳什均衡的现实意义在于,它对目标函数和耦合约束的凸性要求更高,收敛性证明也更绕。很多初学者第一次看到“广义纳什均衡”这个词被吓住,其实不需要怕,因为落地到计算本质上就是遍历所有产消者的一阶最优性条件,再结合耦合约束的KKT条件,最终形成一个变分不等式或者互补问题。Matlab里不会直接让你解变分不等式,通常还是通过分布式迭代来逼近,只不过你在写论文、写报告时需要解释清楚均衡的存在性和唯一性,这就要交代清楚目标函数的凸性、可行域的紧性,以及耦合约束满足什么约束规范。

从代码角度,最简单的处理方式是把全局共享功率之和为零的约束拆成两层:每个产消者子问题里不直接写这个全局约束,只在目标函数中加入一个基于共享价格的线性项或者共享功率的二次惩罚项。价格由上层统一更新,子问题各自求解。这样做的结果是,单个子问题还是标准的凸优化,全局收敛性靠价格迭代保证。我在做第一版时曾经试过把全局约束直接塞进每个子问题,结果每个子问题的约束矩阵必须实时依赖其他产消者的决策,quadprog根本没法组织成固定形式,调试成本直接翻倍。

3. 分布式优化的落地方案:为什么ADMM是调试成本最低的路线

3.1 集中式KKT系统为什么不适合多主体场景

如果你只想验证理论,集中式求解是最省事的:把全部产消者的变量、约束和目标函数合并成一个大优化问题,直接调一个求解器解出全局最优,然后拿这个最优解当作博弈均衡的参照。但这么做有两个无法绕开的障碍。第一是信息集中化,每个产消者要把自己的光伏曲线、负荷曲线、储能参数甚至私有成本系数全部交出去,这在仿真里无所谓,在工程上几乎不可接受;第二是问题规模,当产消者数量上百、时段拉长到96甚至288时,集中式问题的变量和约束数量会膨胀得非常快,矩阵稀疏结构稍微处理不好,求解时间就会拖到无法接受。

分布式优化的核心思路恰恰是“不把所有东西放到一起”。每个产消者只负责求解自己的子问题,对外交换一小部分边界信息,比如共享功率的初步结果或者共享价格的更新量。符合这个要求的算法有好几种,分布式次梯度、分布式交替方向乘子法、原始对偶分解都有论文在用。我自己的经验是,对于非合作博弈背景下的多产消者能量共享问题,ADMM是综合调试成本最低的选择,原因有两点:一是它对步长参数的敏感区间比较宽,不像次梯度法那么容易振荡发散;二是它自带一个天然的收敛判据——原始残差和对偶残差,你可以拿这个指标判断算法是不是真的跑到了均衡附近,而不是凭感觉。

3.2 ADMM的迭代更新方程与残差判定

把ADMM套进这个博弈的思路可以这样理解:每个产消者先独立求一个“自己想要的共享电量”,然后所有产消者把结果放到一起取平均值,得到一个公共参考值,再让每个产消者根据自己跟平均值之间的偏差修正决策,并且把这个偏差用拉格朗日乘子记录下来,进入下一轮。数学上写出来就是三个步骤:

第一步是产消者子问题更新:给定参考共享值z和乘子y,每个产消者求解自己的优化问题,目标函数里除了原本的电费项,还会多出一个线性项加上一个二次惩罚项。第二步是参考值更新:把本轮所有产消者的最新共享电量取平均,得到新的z。第三步是乘子更新:把每户的共享电量与参考值的偏差放大rho倍,叠加到上一轮的乘子上,推动下一轮相互靠近。

收敛判定也有一个标准套路。原始残差看的是所有产消者的共享电量与公共参考值的最大偏差,这个偏差越大说明大家越不一致;对偶残差看的是公共参考值本身的变化幅度,用来判断乘子更新是否已经稳定。当这两个残差都小于一定阈值,比如1e-4,就可以认为算法收敛。注意千万不要只盯着目标函数看,我见过有人在代码里打印总成本曲线,看到成本不怎么变了就以为收敛了,其实残差还在缓慢爬升,这说明个别产消者还在通过调整共享策略占别人便宜,只是总成本看起来稳定而已。

这里还有一个很实际的选择:ADMM的公共参考值到底取什么变量。最容易理解的是把每户的共享净买入功率作为一致性变量,让所有人朝一个均衡参考值收敛;但如果你把共享价格本身也纳入迭代框架,把价格更新嵌进ADMM的乘子更新步骤,求解会更顺滑。我的做法是保留价格和外层循环,内层用ADMM做一轮均衡搜索,等内层收敛了再做一次价格更新,两层交替推进。这样虽然迭代总次数多了一点,但每一层的收敛行为都很好诊断。

4. Matlab代码的分层实现:从quadprog子问题到主迭代循环

4.1 代码结构:把模型拆成参数层、模型层和迭代层

Matlab代码最忌讳一上来就写成一个巨长的脚本,尤其这种多产消者迭代算法,里面既有储能约束又有博弈更新,不拆分的话,改一个参数可能要翻三页代码。我建议按四个层面来组织:参数层、数据层、模型层、迭代层。参数层集中定义产消者数量、时段数、储能容量、充放电效率、购售电价、共享价格初值、ADMM的rho值;数据层准备光伏出力和负荷曲线,没数据的时候可以用正弦函数叠加噪声生成模拟曲线,但记得注释标注这是测试数据;模型层把每个产消者的子问题封装成一个函数,输入当前价格、参考值和乘子,输出最优决策;迭代层负责主循环、残差计算、收敛判断和结果输出。

这个结构最大的好处是便于排查问题。比如收敛失败,你可以先单独调用某一个产消者的子问题函数,看看给定一组合法输入时输出是否合理;如果子问题正常,再检查迭代层的乘子更新公式有没有写错。分布式算法的问题链路往往很长,不拆分层级,出了问题只能从头到尾盯一遍代码,效率非常低。

4.2 quadprog子问题的封装与数据组织

每个产消者的子问题在固定了共享价格和ADMM惩罚项之后,是一个标准的二次规划问题,可以直接用quadprog求解。使用前需要把所有变量排成一个列向量,比如把购电功率、售电功率、储能充电、储能放电、共享净买入按时段依次拼接。目标矩阵H里,除了共享功率的二次惩罚项外,基于共享价格的线性项要放到f向量里,与主网购售电价一起构成目标函数的线性部分。约束矩阵A和b需要把储能SOC递推写成不等式形式,把功率平衡写成等式形式,同时给购电、售电、储能充放、共享功率全部设置上下限。

这里有一个经常踩的坑:功率平衡等式约束里,售电和购电可能同时在最优解中为正。在没有市场规则限制时,quadprog解出来的结果可能既从主网购电、又向主网售电,这是物理上不合理的行为。解决方式有几种:一是设置一个合理的购售电价差,让同时买卖无利可图,大多数情况下就自然避开了;二是把购电和售电处理成互补约束,但这会让问题变成非线性,quadprog用不了,我一般先采取第一种。共享功率这边同理,净买入和净卖出同时为正也不合理,我已经在变量定义里只用一个有符号的净买入变量来控制,这种“少用变量、用好符号”的思路可以帮助大幅降低约束复杂度。

4.3 主循环、收敛判定与可视化

迭代层是整套代码里最需要细心的地方。主循环的伪结构大概是:先初始化参考值和乘子为零向量,然后进入循环,每次循环里依次调用所有产消者的子问题函数,收集各自的最优共享电量;汇总后计算平均值作为新的参考值,接着更新乘子;最后计算原始残差和对偶残差,判断是否收敛。参考下面的示意代码:

for k = 1:max_iter % 每个产消者求解子问题 for i = 1:N x{i} = solve_prosumer(i, z_k, y{i}, rho, data); end % 参考值更新 x_all = [x{:}]; z_new = mean(x_all, 2); % 乘子更新 for i = 1:N y{i} = y{i} + rho * (x{i} - z_new); end % 残差计算 prim_res = max(vecnorm(x_all - z_new)); dual_res = rho * norm(z_new - z_k); if prim_res < tol && dual_res < tol break; end end

残差可视化方面,我会画三条曲线:原始残差随迭代次数的变化、对偶残差随迭代次数的变化、共享价格随迭代次数的变化。残差曲线用对数坐标看最清楚,很多“看起来收敛”的情况取了对数才发现其实只是下降变慢,离真正的收敛阈值还有好几个数量级之差。共享价格曲线能帮你判断博弈是否真的稳定下来,如果价格在两条水平线之间来回振荡,说明迭代步长或者rho没调好,这时候不要急着继续增加迭代次数,而是先回参数层调整。

5. 收敛调参时的真实坑位:残差降不下来、振荡和假收敛

5.1 惩罚参数rho和步长怎么试

ADMM的参数敏感性是一个永远绕不开的话题。rho太小,原始残差的下降会非常慢,每个子问题都觉得自己可以离参考值远一点,迭代几百轮还在慢慢磨;rho太大,一次修正的幅度过大,乘子更新容易过冲,残差曲线出现锯齿状振荡,甚至发散。经验上我会先按共享功率基准值的量级来估算,比如共享功率的典型范围是0到5千瓦,那我先从rho等于0.01试,再看残差曲线形状调整,一般多试几个量级就能找到合适区间。

如果你在ADMM外层还叠加了共享价格更新,那么价格更新的步长是另一个敏感参数。步长太大,价格在相邻两轮之间跳来跳去,各产消者面对的价格反复横跳,整个博弈很难稳定;步长太小,又需要非常多轮迭代才能让价格收敛到均衡。我的经验是,价格步长跟共享功率的量级强相关,一般从1e-3到1e-2试起,搭配残差曲线观察。一个实用的技巧是:先用固定步长跑通流程,再考虑用递减步长加速后期收敛,递减系数设成0.995到0.99之间效果不错。

5.2 初值、SOC设置与“假收敛”的识别

还有一个容易被忽略的坑是初值选择。把参考值和乘子全部设成零向量是最安全的,收敛路径平稳但偏慢;如果你有一个集中式结果或者上一轮迭代的近似解,用它来做初值可以大幅减少迭代次数。不过乘子初值不宜设为非零值,我在一次试验中把拉格朗日乘子初值设成了0.5,结果前几十轮里残差一直在高位徘徊,看起来像发散,调小rho也没有改善,最后才发现是初值的问题。分布式算法的初值会影响迭代路径,但不会影响最终收敛点,前提是问题和参数本身设置合理。

这里专门说一下SOC初始值的处理。储能SOC的初值对产消者的购售电和共享策略影响非常大,尤其是仿真时长只有24小时的时候。如果SOC初值设为1,储能在前几个小时几乎不会充电,全部靠初始电量放电,这会扭曲共享市场的供需曲线,进而扭曲均衡价格。我通常把SOC初值设为0.5,并在目标函数中加一个微小的末尾SOC惩罚,让储能不会在仿真结束时把电量放光。这个末端约束对均衡结果的稳定性帮助很大,强烈建议加上。

识别假收敛的能力也是分布式算法实践者的基本功。前面提到过,光看目标函数或总成本曲线停止变化不算数。还有一个容易骗人的指标是“共享电量不再变化”,但注意这可能只是步长太小导致所有产消者都不敢动弹,离真正的KKT条件还很远。可靠的检验方法是算一下每个子问题的一阶最优性条件残差,也就是把目标函数梯度、约束梯度、对偶变量叠在一起看是否接近零。虽然这一步在Matlab里要额外写不少代码,但对判断“这个结果能不能写进论文”非常关键。我在复现阶段曾经因为跳过这一步,把一组其实还没收敛的结果拿去对比算法优劣,后来的数据全部作废,浪费了不少时间。

6. 从单母线到配电网潮流:模型升级与我的代码复现经验

6.1 从单母线到配电网潮流:模型怎么升级

单母线模型是理解问题和写代码的最佳起点,但它也有一些隐藏假设:所有产消者共享功率都汇聚在同一条母线上,不考虑线路损耗、电压约束和潮流方向,这在真实的台区里并不成立。想把工作做得更深,一个自然的扩展方向是把共享约束从“所有共享功率之和为零”改成节点注入功率平衡加线路容量约束,用线性化潮流或者DistFlow模型建模。这个改动对算法的影响主要在于参考值的更新方式不再是最简单的平均值,需要加入潮流系数矩阵,ADMM的收敛性质也相应需要重新验证。

再往后还能加不确定性。光伏出力和负荷本身就是波动的,确定性模型里把它们当成已知曲线,鲁棒优化或者随机规划场景下,每个产消者的子问题就不只是一个quadprog那么简单,可能需要内嵌场景树或者鲁棒对等变换。不过要提醒一句:扩展时尽量一次只加一个维度。先加网络约束跑通,再加不确定性;两个一起加,出了问题很难定位是潮流模块的锅还是不确定性建模的锅。

6.2 我跑这类代码的真实顺序与心得

如果非要总结一套能直接照做的流程,我目前的习惯是:先写一个最简单的三产消者、24时段、无储能版本,验证博弈迭代能收敛到跟集中式结果一致的纳什均衡;然后加上储能,确认SOC约束不会破坏收敛;再扩大到更多产消者和更长时间尺度;最后才考虑网络约束和扩展场景。每个阶段都保留一个可运行的备用版本,改坏了随时回退。分布式算法的调参本身没什么神奇之处,本质就是反复试rho、试步长、看残差曲线,但如果你把模型复杂度一次性拉满,你根本分不清残差不降是算法问题还是模型问题。

我复现这类论文最大的体会是,最花时间的往往不是算法推导,而是把每个产消者的目标函数、约束和数据结构组织得能塞进quadprog。只要把子问题函数写干净、把残差判据写得严谨,后面换场景、换参数都是水到渠成的事。尤其是“非合作博弈”这个词容易吓人,但落到代码层面,其实就是一堆quadprog套一个迭代循环,外加一层精心设计的收敛判定。把这一层想通了,整个模型就从论文里的数学符号变成你能掌控的仿真工具了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询