news 2026/10/8 15:26:37

风光不确定性下的微电网优化:场景法与鲁棒优化实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
风光不确定性下的微电网优化:场景法与鲁棒优化实战解析

搞微电网调度优化的人,迟早都会撞上“风光不确定性”这堵墙。我印象特别深的是第一次拿真实气象数据跑模型:预测曲线明明是一条挺光滑的光伏功率曲线,结果按误差分布抽样出来的几十个场景一摊开,满屏都是上下乱跳的数值。这还没完,把场景送进优化模型之后,原来“稳妥”的日前调度方案直接被推翻,储能动作频繁、柴油机启停变多,算出来的成本也比预期高不少。后来我才明白,这不是模型写错了,而是风光出力的随机性本身就是微电网优化的核心矛盾。这篇博文我就基于“探索考虑风光不确定性的微电网优化”这个方向,完整拆一遍我的建模思路、求解流程和踩坑记录。适合正在做微电网调度、综合能源系统研究,或者刚开始接触随机优化的工程师和研究生参考,内容会兼顾原理和实操,尽量让你看完就能在自己的算例里跑起来。

1. 问题拆解:风光不确定性的三副“面孔”,先把痛点讲透

1.1 随机性、间歇性、波动性:为什么光伏和风机“不听话”

很多新手会把“不确定性”笼统理解成“预测不准”,但真正建模时,至少要区分三层属性:随机性、间歇性和波动性。随机性是指某个时刻的出力在概率上不是一个确定值,比如明天下午两点的光伏出力,可能是40 kW,也可能是60 kW,只能用一个分布去描述。间歇性更麻烦,它说的是出力在时间上断断续续,光伏晚上归零,风机可能持续几小时小出力甚至停机。波动性则是指出力的变化率很大,云层飘过光伏阵列,一分钟内出力掉一半,这在确定性模型里几乎不会体现。

这三层属性对优化模型的影响完全不同。随机性影响决策的风险,间歇性决定备用容量的需求,波动性则考验储能和柴油机的爬坡能力。我见过不少人只给随机变量加了一个“误差带”,结果模型求解正常,但一接入真实数据就频繁触发越限告警,原因就是间歇性和波动性根本没进约束。生活里类比一下,这就好比天气预报说“明天有雨”,你带了伞,但你没考虑“可能下暴雨,也可能只是毛毛雨”的区间差异,也没考虑“下午突然转晴”的切换场景。微电网调度面对的不是一个“平均的明天”,而是一堆可能发生的明天,这个差异是所有不确定性优化的出发点。

1.2 忽略不确定性的调度方案,在真实场景下会出哪些问题

先讲一个我实际遇到的案例。某个园区孤岛微电网,配置了100 kW光伏、50 kW风电、200 kWh储能和一台200 kW柴油发电机,日负荷峰值大约150 kW。我用确定性模型做日前调度,把光伏预测曲线当作真实出力,计算结果很“漂亮”:全天柴油机只运行两个小时,储能SOC曲线平滑,总成本控制在3400元左右。可一旦把真实的历史出力序列回放进去,问题立刻暴露:

  • 光伏在午后因为云层遮挡骤降40 kW,而确定性方案此时没有预留足够的上调备用,结果储能强制放电到SOC下限,系统频率出现明显波动。
  • 风机夜间出现一次短时大风,出力从5 kW跳到45 kW,柴油机来不及降出力,只能紧急弃风,弃风率一下冲到7%。
  • 储能因为频繁的深度充放,一天的等效循环次数明显增加,按衰减模型估算,寿命损耗比设计值高出近20%。

这些问题的根源都是同一个:确定性优化把不确定量当成一个确定的点,天然认为预测值一定会发生,所以没有主动为“偏差”留余地。功率平衡一旦失配,系统就只能靠储能硬扛,扛不住就切负荷或者弃风弃光。而备用容量是否充足、储能是否应该提前预留空间,这些恰恰需要通过不确定性建模来回答。

1.3 决策链条上哪些环节最怕不确定性

微电网优化并不是一个单一问题,按时间尺度可以拆成日前调度、日内滚动优化和实时控制三层。不确定性在这三层中的影响程度差别很大。日前调度要提前决定柴油机启停状态、储能充放电计划、可中断负荷的削减量,所依据的风光预测往往提前24小时给出,误差通常达到15%-30%。这个环节不确定性影响最大,因为你一旦定了开机组合,日内很难大幅度调整,柴油机启动需要时间,储能容量也有限。

日内滚动优化一般提前4小时或者1小时更新一次,预测误差缩小到5%-10%左右,这时主要做的是修正,比如调整储能出力、微调柴油机功率、切换可中断负荷。实时控制则更多依靠本地控制器和储能逆变器的快速响应,解决的是秒级到分钟级的功率波动,不确定性建模的作用从“优化决策”转变为“评估可行性”。我做这个方向时有个很深的体会:不要试图在一个模型里同时处理所有时间尺度的不确定性,否则问题规模会迅速爆炸。比较务实的做法是日前层引入较完整的不确定性模型,日内层用滚动修正加备用约束来兜底。

2. 不确定性建模:把“明天风多大”翻译成数学模型

2.1 场景法:用一堆“如果”替代一个“预测”

场景法的核心思想很直白:既然未来有无数种可能,那就抽样生成一批有代表性的场景,每个场景对应一组风光出力序列,然后优化目标变成一个“期望意义下的最优决策”。数学上可以写成目标函数包含所有场景的加权和,即每个场景乘上它的概率,再把成本累加起来。

我自己的做法一般是这样的:先获取光伏出力和风速的历史预测误差分布,而不是直接用出力分布。预测误差分布更有统计规律,也更容易和数值天气预报结合起来。然后通过蒙特卡洛抽样生成大量候选场景,每个场景包含24小时的光伏、风电出力序列。这里有个关键点,不是各时段独立抽样,那样会丢失时间相关性。比如中午光伏误差大,晚上误差几乎为零,白天相邻时段之间有强相关性,直接独立抽会生成一堆“不真实”的场景。更好的做法是采用拉丁超立方抽样或基于历史场景的采样方法,再把不同时段的误差叠加到预测曲线上。

场景生成之后必须做削减,否则优化模型会变成“场景炸弹”。我常用的是K-means聚类或者后向缩减算法,把2000个原始场景缩减到10到20个典型场景,让每个场景代表一类天气形态。实测下来,场景数量从50降到10,求解时间可能从十几分钟降到几秒,而目标函数值的偏差通常只有不到3%。这就是场景法的最大优势:你可以在精度和计算效率之间自由调节。

2.2 鲁棒优化:不赌概率,只保最坏情况底线

场景法是“概率视角”,默认你相信这些场景的分布基本准确。但工程上经常遇到另一种情况:历史数据不足,或者现场环境变化太快,我们根本说不清误差是正态分布还是别的什么分布。这时候我倾向于用鲁棒优化,它的思路是:我不赌预测误差的概率,我只要求无论不确定性取到给定集合内的哪个值,系统都能安全运行。

求解放到模型里就成了典型的min-max结构:外层决策变量想办法优化,内层“自然”选择一个使系统约束最难满足的不确定性取值。工程中常用盒式不确定集合,也就是给每个预测误差设定一个上下界,比如光伏预测值50 kW,误差±20%,那实际出力可能在40到60 kW之间取任意值。更精细一点可以引入预算约束,限制同一时刻最多有多少个不确定量同时取到极端值,避免结果过于保守。

我自己用鲁棒优化的体会是:当数据量不足以支撑概率建模时,这是一个非常稳的选择。代价是目标函数值往往比场景法更高,因为它在为“最坏情况”买单。但很多实际项目领导真正关心的不是“期望成本最低”,而是“不管天气怎么变都不能停电”。这种情况下鲁棒优化反而更容易被接受。

2.3 区间与模糊建模的选择边界

除了场景法和鲁棒优化,还有区间优化和模糊规划两种思路。区间优化更简单,它把每个不确定量当作一个区间,目标是在区间范围内寻找可行解,好处是计算量小,坏处是容易过于保守,而且无法体现区间内不同取值的概率差异。模糊规划用隶属度函数描述“大约是多少”的概念,处理语义化、主观化的不确定性更合适,但工程落地时隶属度函数的设定比较主观。

我在实际项目中的取舍很明确:如果是设备选型和规划类问题,不确定性数据本身就不精确,用区间鲁棒足够;如果是运行调度类问题,有历史预测数据,场景法最实用;如果只是做一个很粗的可行性评估,模糊规划偶尔能派上用场,但它很难直接和调度约束结合,我一般不推荐新手入坑。记住一个原则:模型复杂度应该匹配数据质量,不要为了“高级”而选择数据撑不起来的建模方法。

2.4 数据源与抽样参数设置的个人经验

不确定性建模再漂亮,数据基础不牢全白搭。用天气数据生成场景时,最关键的是预测误差分布要与预测超前时间匹配。24小时前的预测误差标准差通常设定为实际值的20%-25%,4小时前可以缩到10%左右,越接近实时,分布越窄。你不能拿实时预测的误差分布去生成日前场景,否则就过于乐观了。

另外一个常被忽略的点是相关性。光伏和风电在时间维度上存在相关性,甚至在某些地区风光之间也有互补性。做多维抽样时,我会用Copula函数或者历史场景重采样来保持这种相关结构。如果简单粗暴地分别独立抽样,生成的场景会出现“风电大出力同时光伏也大出力”这种现实中很少发生的组合,导致优化结果偏于保守。数据准备这一块我给的建议是:宁可用真实历史出力做重采样,也不要在小样本下强行拟合复杂分布。

3. 微电网优化模型搭建:目标、约束与求解链路

3.1 目标函数怎么设:经济性优先,还是安全性优先

微电网优化的目标函数看起来很简单,就是成本最小,但仔细拆开能分成好几类:柴油机燃料成本、启停成本、储能充放电损耗成本、弃风弃光惩罚、负荷失电惩罚。不同目标的权重直接决定了调度策略的性格:如果燃料成本权重过高,系统会尽量多用风光少用柴油,但备用可能不足;如果负荷失电惩罚很高,系统又会变得过度保守,柴油机一直开着,弃风弃光量很小,但经济性差。

我在工程里一般会把目标函数写成:

  • 燃料成本:分段线性的柴油机油耗函数,或者用二次函数近似;
  • 启停成本:每次开机或停机固定费;
  • 储能损耗:按充放电功率折算成等效成本,能显著抑制储能的频繁深度充放;
  • 弃风弃光惩罚:取上网电价或者边际价值,让模型尽量消纳;
  • 失负荷惩罚:设定一个很高的值,比如断电损失的10倍,确保模型优先保证供电。

一个坑是惩罚系数不能拍脑袋乱设。我见过有人把弃风惩罚设成10000元/MWh,结果模型把所有风险都转嫁到柴油机上,方案看起来风光消纳率很高,但实际运行成本完全失控。正确的做法是做敏感性分析,给关键惩罚系数跑几组不同取值,观察目标函数组成的变化,你会很清楚看到“甜点区间”在哪里。

3.2 核心约束逐条拆解:功率平衡、储能SOC、机组爬坡

功率平衡约束是微电网优化的骨架,它要求任意时刻所有发电、储能、负荷和弃电量之和相等:

P光伏 + P风电 + P柴油机 + P储能放电 = P负荷 + P储能充电 + P弃电

每条母线和线路的容量也要进约束,孤岛运行时还要保证频率在允许范围,不过这在稳态优化里通常通过备用容量间接保证。

储能约束比较繁琐,也是新手最常写错的地方。SOC的递推公式要特别小心充放电效率的方向:充电时能量乘以充电效率加进SOC,放电时SOC扣掉放电倍率下的放电量。SOC本身有上下限约束,一般是10%到90%,不要设得太满,否则寿命下降快。最关键的是周期约束,也就是优化周期结束时SOC要回到初始值,这代表储能“日清日结”。如果省掉这个约束,模型会把储能当成一个免费的能量库,最后一天疯狂放电,方案看起来便宜,实际根本不可行。

柴油机约束中包含爬坡约束、最小启停时间约束和出力上下限。爬坡约束是最容易被忽略的:柴油机从20 kW升到80 kW需要时间,必须限制相邻时段的出力变化量。最小启停时间是很多论文里简化掉的约束,现场却非常重要,频繁启停对柴油机的机械损耗很大。加上这些约束之后,模型从纯线性规划变成混合整数线性规划,求解难度上升一个档次,但这是必须付出的代价。

3.3 求解器选择与求解细节:从YALMIP到Pyomo

工具链选择上,我见过三种主流方案:

  • MATLAB + YALMIP + CPLEX/Gurobi:教学和原型验证最方便,YALMIP语法接近数学表达式,适合快速搭建。
  • Python + Pyomo + Gurobi/CPLEX:工程化和数据处理更顺,数据清洗、场景生成和结果可视化都可以在同一个环境里完成。
  • Python + scipy.optimize 或遗传算法:仅适合极小规模的演示,处理MILP基本不可行,别指望它做不确定性优化。

如果你的问题规模不大,比如10个场景、24个时段,MATLAB+YALMIP完全够用。但当你需要做2000个场景的聚类削减、多组敏感性分析,我强烈建议用Python。Pyomo的建模灵活度和可维护性远好于YALMIP,尤其是要跟机器学习库衔接的时候,全Python链路能省掉大量数据搬家的时间。

求解器调参也有讲究。MILP模型首先会被求解器做线性松弛,然后通过分支定界搜索整数解。如果出现求解时间爆炸,不要急着换求解器,先做三件事:减少大M约束的数量、设置合理的MIP gap(比如1%)、加上时间限制。Gurobi的MIPFocus参数在模型特别复杂时也值得调整。我习惯把gap设成0.5%,既保证精度又不拖时间。

4. 算例实战:同一套数据下,确定性模型和不确定性模型的决策差在哪

4.1 测试系统与基础数据准备

为了把问题讲清楚,我给一个可以自己复现的简化算例。微电网配置如下:光伏100 kW、风电50 kW、储能200 kWh(最大充放电功率50 kW)、柴油发电机200 kW。系统负荷分为基础负荷和可中断负荷,总日负荷峰值150 kW。风电、光伏的日前预测曲线和负荷曲线我就不详列了,核心是光伏预测值午间最高达到85 kW,风电夜间有一个峰值。预测误差设定为:光伏服从均值为预测值、标准差为预测值20%的正态分布,风电同样取20%,各时段之间相关系数设为0.6。

我生成500个原始场景,用K-means聚类削减到10个典型场景。对照实验是两组:第一组用预测值直接做确定性优化;第二组把10个场景放进随机优化模型,目标函数取所有场景成本的加权期望,同时加一条失负荷风险约束,允许失负荷概率不超过3%。

4.2 结果对比:光伏高估10%会怎样

先从总成本看。确定性模型算出来的日前调度成本是3362元,随机优化模型是3518元,大约高出4.6%。乍一看,不确定性优化“更贵”,很多刚接触这个方向的人会在这里困惑:为什么多花钱?

把两组方案放到真实误差场景里跑一遍,答案立刻清晰:确定性方案在光伏实际出力比预测低10%的场景中,午后出现约2小时电力短缺,导致负荷削减量累计达到86 kWh,按失负荷惩罚折算后总成本飙升到3920元;随机优化方案因为提前让柴油机多开了一个时段,且储能SOC在午前保留更多电量,实际运行中几乎没有出现失负荷,总成本反而只有3580元。同时,随机优化方案的弃风弃光率只有1.8%,远低于确定性方案的5.6%。

换句话说,这4.6%的额外成本不是浪费,本质上是在买“保险”。光伏高估10%只是普通偏差,风速误差叠加起来可能有更大的缺口,不确定性优化做的事就是主动为这种可能的偏差安排弹性资源。

4.3 为什么不确定性优化“看起来更保守”反而是对的

很多人会有一个直觉:光伏预测85 kW,那就按85 kW用,系统应该能省不少燃料。这个直觉在确定性世界成立,但在真实世界不成立,因为实际出力可能只有75 kW甚至更低。一旦缺电,储能如果已经放光了,柴油机启机也要时间,这段时间的供电缺口只能通过切负荷来填补。随机优化恰恰是把“储能不放光”“柴油机提前热备”这种策略内化到了最优解里。

从风险控制角度看,还可以引入CVaR(条件风险价值)约束来更精细地管理尾部风险:不是平均情况不越限,而是最差的那5%场景里的失负荷量也要受控。用CVaR的时候,目标函数里会多一项对极端场景的加权惩罚,优化器会在场景概率和极端损失之间寻找平衡。我在实际项目里发现,加了CVaR约束之后,方案的鲁棒性明显提升,但求解时间也会变长,初学者可以先用普通的期望目标函数,跑通了再慢慢叠加。

5. 踩坑实录:优化模型写出bug后我如何逐条排查

5.1 场景数量一多,求解时间爆炸

第一次用500个完整场景做MILP,我等了两个小时还没出结果,这个体验相信很多人都经历过。问题不在求解器,而在场景数量本身。500个场景意味着每个时间断面的约束和变量都被放大500倍,分支定界的搜索空间会膨胀到难以接受。

解法就是场景削减。用K-means聚类把500个场景减到10个,求解时间从几分钟降到十几秒,结果变化很小。后来我又尝试了概率距离削减法,效果更好一点,但实现复杂度高一些。我的建议是:优先用聚类,快速见效;如果追求更科学的削减,再去研究后向缩减算法。另外还有一个思路是可以做“两阶段分解”,把混合整数问题解耦成主问题和子问题,用Benders分解或者列约束生成(C&CG)方式迭代求解。这个方法的代码量陡增,但遇到超大规模问题时几乎是唯一出路。

5.2 储能SOC周期约束导致求解失败

给模型加上SOC在优化周期末必须回到初值的约束后,求解器直接报不可行。检查发现原因是充放电效率不一样,导致循环内有能量损耗:同样的充电量和放电量,SOC无法回到原位。比如充进10 kWh,实际存下9.5 kWh,再放出来可能只有9 kWh,所以你不可能在净放电量大于零的同时让SOC回到初始值。

这个问题的标准解法有几种:一是把周期约束改成柔性的,比如允许末尾SOC偏离初值不超过某个小范围,并在目标函数中加惩罚;二是引入一个松弛变量,让SOC可以在周期末不等于初值,但每个单位的偏差都计入成本;三是在物理上要求储能不能“凭空产生能量”,这本来就是正确约束,但你需要给优化器留出消耗少量电能的余地。我自己的做法是第二种,松弛变量设成kWh为单位,惩罚系数取燃料成本的1.5倍左右,实测效果最稳定。

5.3 目标函数数值尺度差异引发的求解异常

储能SOC数值一般只有0.1到1,柴油机功率是几十到几百kW,燃料成本则是几万元量级。这些量级差特别大的变量放在一起,求解器的数值灵敏度很容易出问题,表现就是迭代很慢、解不稳定,甚至不收敛。

排查方法很简单:把目标函数各项和约束的数值范围打出来看看。解决办法有两个方向:一种是把成本和电量都归一化,比如燃料成本除以基准值,让目标函数量级控制在10以内;另一种是对约束中涉及的变量做缩放,比如SOC用百分比表示而不是0到1的小数。调完之后,同样的模型Gurobi求解时间能缩短一半以上。这个坑在论文复现时尤其常见,大家看到的是别人调好的代码,但不知道求解器内部经过了多少数值预处理。

5.4 数据时间戳不齐,模型“看似可行实则失真”

有一次我发现优化结果里光伏出力序列和负荷曲线在时间上总有半小时的错位,导致储能频繁切换充放模式。查了半天才发现,气象数据是15分钟粒度,负荷数据是30分钟粒度,代码合并时直接按索引对齐,没有先重采样到统一时间戳。这种时间对齐问题在不确定性优化里特别隐蔽,因为误差会被随机性“掩盖”,结果输出看起来正常,实际调度指令却是错的。

我的经验是所有外部数据进入模型之前,必须先做好数据校验:统一时区、统一时间戳粒度、统一单位,然后画出原始曲线和模型输入曲线的对比图,用眼睛确认对齐关系。在工程现场,这个步骤花费的时间往往比建模还多,但绝对值得。

6. 从算例到现场:不确定性优化的演进与个人体会

6.1 数据驱动与滚动优化的结合

做完了基础的不确定性优化,下一步我最推荐的方向是“预测-场景-滚动”闭环。先用机器学习模型(LSTM、Transformer、LightGBM等)做风光功率预测,把预测残差作为误差分布数据,再用场景法或者核密度估计生成下一时段的场景。这样形成的优化系统能随环境变化不断更新场景分布,比固定误差参数更贴近实际。

更高级的做法是模型预测控制(MPC),每15分钟或1小时滚动重算一次,把最新的实测数据反馈进模型,同时保留日前计划的一部分作为参考轨迹。我在一个示范项目上试过,光伏波动剧烈时,滚动策略的失负荷控制效果比单次日前优化好很多,而且对求解时间的要求也没那么苛刻,每一步只需要在当前窗口内求解一个小规模的优化问题即可。

6.2 多微电网协同和博弈方向

不确定性优化还可以从单个微电网扩展到多个微电网互联的场景。几个微电网之间通过联络线进行功率交换,每个主体的风光预测误差不同,谁有余电、谁缺电,在不同场景下变化很大。这个问题的建模复杂度会高很多,因为不仅要处理每个微电网的不确定性,还要处理市场主体之间的互动。

常见的框架有两种:一种是把多微电网当作一个整体做集中式优化,用分布鲁棒优化处理各主体不确定性的联合分布;另一种是用纳什博弈或者交替方向乘子法(ADMM)做分布式求解,每个微电网独立优化、交换边界功率信息,迭代收敛到均衡点。这个方向工程价值很高,适合已经有单微电网优化基础的朋友继续深入。

6.3 我对不确定性优化的一点实操体会

踩过这么多坑之后,我的体会其实很朴素:不确定性优化不是把模型做得越复杂越好,而是要让模型复杂度匹配现场的数据条件和决策需求。如果现场连可靠的历史气象数据都没有,硬上场景法就是空中楼阁;如果只有10组实测数据,用一个稳健的盒式鲁棒约束可能比高级分布鲁棒更实用。我强烈建议新手按这个顺序进阶:先跑通确定性模型,再加入一个简单场景集,然后尝试鲁棒约束,最后再引入CVaR或者分布鲁棒。每走一步都拿基准场景验证一次,你会非常清楚地看到每层“加固”到底付出了多少成本,又换来了多少可靠性收益。这个方向的技术栈会继续迭代,但基本的建模判别力,才是真正值得积累的东西。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 15:26:37

Xsens MTi系列IMU从硬件接线到ROS配置的完整实战指南

玩IMU这几年,前前后后经手过好几家的产品,Xsens算是用得最久的一款。很多人拿到MTi系列的第一反应是插上USB打开MT Manager,看到数据在跳就以为配置完了。但真到了做Lidar-IMU联合标定、跑VINS-Mono、或者给相机IMU做外参标定的时候&#xff…

作者头像 李华
网站建设 2026/10/8 15:25:34

Agent-Reach:为AI Agent打造稳定、高效的中间件工具调用方案

1. Agent-Reach 的定位:当大模型困在"对话框"里时先用一句话说清楚 Agent-Reach 是什么:它是给 AI Agent 用的一层"触达中间件"。整条链路可以理解成——大模型负责思考,Agent-Reach 负责把思考结果翻译成实际动作&#…

作者头像 李华
网站建设 2026/10/8 15:25:20

Matlab中贝叶斯优化LSTM超参数调优实践指南

去年做电力负荷预测项目时,LSTM网络的调参过程让我相当崩溃。隐层神经元设多少?学习率用什么量级?初始学习率衰减周期怎么定?每换一组超参数就要重新训练一轮,GPU上跑一次动辄十几分钟,网格搜索试了三四十组…

作者头像 李华
网站建设 2026/10/8 15:25:16

YashanDB数据质量治理实战:五步方法论搞定脏数据

我第一次被数据质量整到头皮发麻,是在接手一套跑了两年多的YashanDB业务库之后。月末报表怎么都对不上总账,查了一圈才发现资金流水表里混进了几十条金额字段为NULL的记录;订单表里同一个客户ID下存在三条完全一样的下单记录,业务…

作者头像 李华
网站建设 2026/10/8 15:25:14

Checkpoint防火墙核心进程与HA故障排查实战指南

简介:本资源是一份面向网络安全工程师与防火墙运维人员的Checkpoint防火墙系统化培训课件,聚焦NG版本(VPN-1/FireWall-1)的安装部署、管理服务器配置、策略编辑器实操及典型问题解析,有效解决企业级防火墙从零部署到日…

作者头像 李华
网站建设 2026/10/8 15:20:41

Puppeteer MCP 实战:让大模型接管浏览器实现网页自动化全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华