1. 项目背景与核心痛点1.1 微网日前调度为什么越来越难做做微网优化调度这个方向的人应该都有同感五年前写一篇微网调度文章风光储加个柴油机目标函数一个经济性约束条件十几行跑个遗传算法就能出不错的图。但现在这套玩法已经行不通了原因很简单——微网里的“变量”变多了。首先是源侧光伏和风电的渗透率越来越高但这两兄弟出力完全看天吃饭。光伏中午猛如虎、傍晚直接摆烂风电则是半夜来劲、白天拉胯。这种间歇性、波动性如果不加处理直接往微网里怼频率和电压都受不了。其次是荷侧电动汽车大规模入户之后充电负荷不再是简单的一条曲线而是具有高度随机性和时空转移能力的柔性负荷。更关键的是电动汽车不仅可以“吃电”还能“吐电”这就引出了V2GVehicle-to-Grid技术。V2G的逻辑本质上是把电动汽车当成一块“会跑的储能电池”。你白天开着车去上班车在停车场闲着这时候电网缺电它就可以把电池里的电反哺给微网晚上你回家了插上充电枪它再把电充回来。这个“闲时放电、忙时充电”的思路理论上能把微网运行的灵活性往上抬一大截。但代价是——优化问题的规模变大了变量之间互相打架普通的单目标优化根本压不住。我去年被一个做智慧园区项目的朋友拉着一起搞微网调度当时他们给的痛点特别直接光伏夏天中午发出来的电用不完弃光率能到15%以上园区里配了三十多辆电动通勤车晚上集中充电又把变压器顶得喘不过气。两头一夹要么交罚款要么改线路不管怎么算都是亏。这就是典型的多目标冲突案例——你既要经济性最优又要风光消纳率够高还要电网曲线足够平稳三个目标之间天生就有矛盾。1.2 这个项目解决什么问题这个Matlab项目干的事情就是把上述问题打包成一个“考虑V2G的多目标日前优化调度模型”然后设计一种改进的多目标灰狼优化算法去求解它。整个模型里同时考虑风电、光伏、常规负荷、储能电池、电动汽车V2G五个要素以24小时为调度周期以1小时为调度间隔输出每一时段各设备的最优出力计划和V2G充放电策略。这里多说一句“日前调度”的意思。所谓日前就是在当天0点之前根据第二天的负荷预测、新能源出力预测和电价信息提前制定好第二天的运行计划。它是微网能量管理体系的“顶层设计”决定了一天的大基调剩下日内滚动优化、实时反馈调整都是在它的框架下做局部修正。所以日前调度做得好不好直接决定微网能不能省钱、能不能稳定跑。这个项目的价值在于它的一头是数学模型建模另一头是算法优化求解中间还夹着V2G这种偏工程落地的环节是一个从理论到代码闭环的完整案例。对做微网优化、电动汽车入网、智能算法应用的硕博研究生和工程技术人员来说有很强的参考意义。2. 系统建模与目标函数设计2.1 风、光、荷、储四大模块怎么建模调度模型是优化的地基地基没打牢后面用什么算法都是白搭。这个项目的建模思路和其他主流微网调度论文基本一致但好在它的约束条件和目标函数设计得比较完整我一个个拆开讲。先说光伏和风电的出力模型。光伏的输出功率主要受光照强度和环境温度影响在日前调度阶段我们通常不搞繁杂的物理方程而是采用预测出力的简化模型也就是把预测的光照强度换算成光伏输出功率。风机同理用预测风速代入风机功率特性曲线。项目实施中这两条曲线通常直接以预测数据的形式给出比如24个时段的风速值、光照值然后通过换算得到风光出力序列。需要提醒的是简化模型虽然计算快但忽略了局部遮挡、风机偏航等细节所以调度结果属于“计划值”实际运行时要靠日内调度去修正。再说负荷模型。常规负荷曲线一般取自历史数据的典型日负荷曲线或者用预测算法获得。在V2G研究里负荷建模有个坑就是你要明确区分“基础负荷”和“充电负荷”——传统研究把电动汽车充电负荷混进总负荷里但考虑V2G之后充电负荷不再是刚性负荷而是可调变量。所以这个项目的做法是把基础负荷单独拎出来电动车充放电功率单独建模两个变量再一起参与平衡约束这样V2G的调节价值才能真正体现出来。储能模型相对标准核心是SOC状态转移方程也就是[ SOC(t1) SOC(t) \frac{P_{ch}(t) \cdot \eta_{ch} \cdot \Delta t}{E_{ess}} - \frac{P_{dis}(t) \cdot \Delta t}{E_{ess} \cdot \eta_{dis}} ]其中( P_{ch} )和( P_{dis} )分别是充放电功率( \eta_{ch} )和( \eta_{dis} )是充放电效率( E_{ess} )是储能额定容量。这里有个细节要注意很多新手建模时会忽略充放电效率差异直接把效率设成一个值这样算出来的SOC轨迹和实际偏差很大尤其是在长时间尺度的日前调度里误差会累积。2.2 V2G模型车不只是“电耗子”V2G建模是整个项目里最有区分度的部分。很多刚接触这个方向的人会误以为V2G就是“把车当储能”算的时候给一个最大放电功率约束就完事了。这在实际中是不够的——电动汽车首先是车然后才是储能。所以这个项目在V2G建模时考虑了三个核心约束。第一是可调度时间窗口车辆不是24小时都在微网里的白天通勤出去了这辆车就不能参与调度建模时只把车辆在网时间内的充放电功率作为变量。第二是电池容量约束每辆车的电池容量有限而且SOC要维持在合理区间比如20%到90%之间既能保证用户出行又不至于深度充放损伤电池。第三是用户充电需求约束V2G再怎么“削峰填谷”也不能让用户第二天出门时发现车没电了所以调度周期结束时车辆的SOC必须达到用户设定值一般设为90%以上。把这三个约束加进去之后V2G模型就不只是一个储能公式了而是嵌套了时间窗口和用户行为约束的设备模型。这也是为什么V2G调度比普通储能调度复杂一个量级的原因。再说一个工程上常见的争议点——电池退化成本。严格来说V2G每次放电都会加速电池循环寿命衰减这部分成本应该体现在目标函数里。如果完全忽略算法会倾向于让车“无脑放电”经济性算出来很漂亮但实际根本跑不通。这个项目里对电池退化做了简化处理把它摊到单次充放电成本里等价成“单位电量损耗成本系数”。虽然没有做全寿命周期的精细化建模但对于日前调度这个时间尺度来说已经够用了。2.3 目标函数经济、环保、稳定一个都不能少多目标优化的“多目标”在这里设置了三个维度。第一个目标是微网综合运行成本最小。这里包括从主网购电的费用、V2G放电给微网后需要给车主的补贴费用、储能设备的运维成本和电池退化成本。这部分对应的是微网运营方最关心的“钱”的问题。第二个目标是碳排放量最小。传统柴油发电、电网购电都对应碳排放减少高峰购电、提高新能源消纳都会直接降低碳排放。这个目标对应的是“双碳”背景下的环保诉求。第三个目标是负荷曲线波动最小。也就是让微网从主网购电的功率曲线尽可能平缓。为什么要平缓因为对配电网来说微网在负荷高峰时猛拉电力、在低谷时猛送电力都会造成主网线路的电压波动和功率冲击。从调度角度来说通过储能和V2G“削峰填谷”能有效降低微网与大电网交换功率的峰谷差。这三个目标之间怎么平衡举个例子你想降低微网运行成本最优策略是多用低谷电给储能和电动车充电然后高峰时段放电赚价差。但这个策略会导致曲线的峰谷差拉大因为你在低谷期猛拉电了如果你想让负荷曲线最平稳就需要在低谷期少充电在高峰期多放电但过多的放电会增加电池老化成本。所以三个目标各有拉扯不存在一个解同时让三者都最优最终得到的是一组Pareto前沿解集决策者再从里面挑一个最符合实际偏好的解。3. 改进多目标灰狼优化算法3.1 从灰狼狩猎说起GWO的基本逻辑灰狼优化算法Grey Wolf Optimizer, GWO是Mirjalili等人在2014年提出的群智能算法。它的灵感来自灰狼群体的社会等级制度和狩猎行为。灰狼群里有严格的等级结构α狼是头狼负责决策β狼是二把手辅助αδ狼服从α和β最底层的是ω狼负责执行和探路。算法对应的搜索机制很有意思在解空间里α、β、δ分别代表当前种群中找到的最好解、次好解和第三好解剩下的狼就根据这三匹“领袖狼”的位置来更新自己的位置。这个机制的本质是种群里的每个个体都被三个精英个体牵引而不是像粒子群算法那样只有一个全局最优在引导。数学模型上狼群围猎的过程用两个核心公式表达。第一个是“包围”[ \vec{D} |\vec{C} \cdot \vec{X}_p(t) - \vec{X}(t)| ][ \vec{X}(t1) \vec{X}_p(t) - \vec{A} \cdot \vec{D} ]其中(\vec{A})和(\vec{C})是系数向量。(\vec{A})的取值决定狼是“进攻”还是“扩散搜索”当(|A| 1)时狼向猎物靠近当(|A| 1)时狼远离猎物进行全局搜索。这个机制很有意思它使得GWO天然在“勘探”和“开发”之间有一定的自适应平衡能力。第二个机制是位置更新时同时参考三匹头狼[ \vec{X}(t1) \frac{\vec{X}_1 \vec{X}_2 \vec{X}_3}{3} ]其中(\vec{X}_1)、(\vec{X}_2)、(\vec{X}_3)分别是按α、β、δ狼位置计算出的候选位置。这就好像三匹经验最丰富的老狼分别给出了自己的建议方向最后取一个折中方案既避免被单一精英带偏也保留了群体的多样性。GWO的优势是结构简单、参数少核心参数就是收敛因子a和系数向量实现起来非常容易而且早期收敛速度快。但它的短板也明显收敛后期容易陷入局部最优种群多样性下降快对于多峰、高维的复杂优化问题表现不够稳定。微网日前调度问题恰恰就是这种“高维、非线性、多约束、多峰”的硬骨头。3.2 多目标化改造Pareto支配与外部档案标准GWO只能处理单目标优化多目标问题的难点在于“多个目标同时优化”而不同目标之间往往相互冲突。这时候就需要引入Pareto支配的概念。简单解释一下Pareto支配假设有两个解A和B如果A在所有目标上都优于或等于B且至少在一个目标上严格优于B那么就说A支配B。如果一个解不被任何其他解支配那它就是非支配解。所有非支配解构成Pareto前沿。多目标灰狼优化算法MOGWO的思路就是在GWO的框架上叠加两个机制。第一是外部档案Archive用来保存搜索过程中找到的非支配解每次更新时把新解和档案里的旧解做Pareto支配比较非支配的进被支配的删。第二是领导者选择机制从外部档案中选择α、β、δ三个领导者而选择的标准不是随便挑而是基于网格法——把目标空间划分成网格解越稀疏的区域的解被选中的概率越大这样能让搜索方向偏向尚未充分探索的区域间接保持了种群的多样性。这个项目在MOGWO基础上做了三处针对性改进下面详细说。3.3 项目里的三处算法改进第一处改进混沌映射初始化种群。标准GWO用随机方式生成初始种群这在复杂的多峰问题里容易导致初始解分布不均匀种群过早聚集在某个局部区域。项目改用Logistic混沌映射来初始化灰狼种群位置利用混沌的遍历性和随机性让初始解更均匀地覆盖整个决策空间。实测下来这个改进对调度问题的稳定性提升很明显尤其是多次独立运行的解的方差明显减小。第二处改进收敛因子a的衰减策略。标准GWO中收敛因子a随迭代次数线性递减这个策略在迭代后期会导致全局搜索能力不足。改进版采用非线性衰减策略——前期让a衰减得慢一些保证种群有足够的能力大范围勘探后期让a衰减得快一些加速收敛。这个思路在粒子群算法里的惯性权重调整中也很常见但放在GWO里效果同样显著。第三处改进引入变异操作。算法迭代到中后期种群容易陷入局部最优外部档案里的解也趋于同质化。改进版在每次迭代后按一定变异概率对部分狼的位置进行高斯扰动或柯西变异打破同质化增强跳出局部最优的能力。这里想提醒一下变异概率不能设太大设太大会把算法退化成一个裸随机搜索收敛速度变得惨不忍睹一般控制在0.05到0.1之间比较合理。从整体效果来看这三处改进分别对应了“初始解质量”“勘探开发平衡”“跳出局部最优”三个维度针对性很强。用标准测试函数ZDT1、ZDT2和ZDT3做基准测试时改进算法在IGD和超体积指标上普遍优于原MOGWO和NSGA-II这部分后文会细说。4. Matlab代码实现与运行配置4.1 代码整体结构与核心模块整个Matlab代码的框架可以从两个维度来看一是模型维度二是算法维度。模型维度上代码把微网调度问题封装成一个目标函数m文件和一组约束条件。目标函数文件输入是决策变量各时段各设备的出力、V2G充放电功率输出是三个目标值经济成本、碳排放、负荷波动。约束条件涵盖功率平衡约束、设备出力上下限约束、储能SOC约束、V2G充放电约束、爬坡约束等。算法维度上代码实现了改进多目标灰狼优化。主程序负责初始化种群、迭代循环、领导者选择、外部档案更新子函数负责混沌初始化、非线性收敛因子计算、变异操作、Pareto支配判断、网格选择等。从实现逻辑上分核心文件大致有以下几块% 主程序 main.m % 功能设置参数、调用优化算法、输出结果 clc; clear; close all; % 基础参数设置 T 24; % 调度周期24小时 N 150; % 种群规模 MaxIt 200; % 最大迭代次数 ArchiveSize 100; % 外部档案容量 nVar T * 5; % 决策变量维度24*5类设备 % 初始化参数风光出力预测数据、负荷预测数据、电价、储能参数等 % 调用改进MOGWO算法 [bestSolution, ParetoSet] IMOGWO(N, MaxIt, ArchiveSize, fitnessFunction, ...);这里面有个比较关键的设计决策决策变量一共是(24 \times 5 120)维每一时段包括储能充放电功率、V2G充放电功率、购售电功率等。这里要特别注意变量之间的耦合关系——功率平衡约束把多个变量绑在一起如果一个时段内风光出力加上储能放电加上V2G放电不够覆盖负荷和充电需求算法就必须自动调节购电量来补足这个耦合关系需要在目标函数或约束处理函数里严格编码否则跑出来的结果会出现功率不平衡却显示为最优解的严重bug。4.2 关键参数设置参考这个项目的参数设定有一定的典型性我整理了一个参考配置表可以直接作为起点参数使用但要提醒你不同微网场景下的参数需要重新标定强行套用会出现结果失真参数名称参考值说明与心得种群规模150变量维度高种群太少会导致Pareto前沿不完整最大迭代次数200迭代过多会增加计算时间过少则收敛不充分外部档案容量100容量太小会丢失解多样性太大则网格选择计算变慢混沌初始化Logistic映射初值范围控制在(0,1)注意映射序列去重变异概率0.08过大算法退化为随机搜索过小起不到跳出作用储能额定容量1MWh按实际工程配置调整影响SOC约束的松紧程度V2G可调度车辆数30辆项目测试场景为30辆可扩展为集群聚合模型收敛因子衰减方式非线性指数型前期a衰减慢保证勘探后期衰减快保证开发4.3 运行流程和结果怎么看从运行流程上讲脚本启动后大致分这么几步第一步加载基础数据包括预测风光出力曲线、预测负荷曲线、分时电价第二步初始化算法参数和混沌种群第三步进入主循环每轮迭代里完成目标值计算、Pareto支配比较、外部档案更新、领导者选择、位置更新和变异操作第四步输出Pareto前沿解集和对应的调度结果曲线。这里我想专门说一下“怎么判断调度结果是不是真的合理”。很多研究生跑完代码看到Pareto前沿出来了就交差了这其实是不够的。你要做的第一件事是检查功率平衡把每个时段的风、光、储、V2G、购电、负荷全部代回平衡约束里看看等式是否成立偏差是否在允许范围内。这一步排查掉很多隐含bug。第二件事是检查SOC曲线储能和V2G的SOC都要在合理范围里且不能出现跳变如果SOC连续性断裂说明状态转移方程写错了。第三件事是检查经济性参数购电成本、V2G补贴费用、电池退化成本这几项加起来是否和你从目标函数反推的一致如果对不上那么目标函数很可能漏项了。5. 常见问题与调试经验5.1 我踩过的那些坑这个项目前前后后调试了大半个月踩的坑不少我把典型问题整理成一张表都是实打实的经验问题现象根本原因解决办法算法运行结果每次都不一样而且差异很大初始种群完全随机没有加混沌初始化改用Logistic混沌映射生成初始解Pareto前沿缺失严重前沿很“秃”外部档案网格划分太粗领导者选择多样性和均匀性不足细化网格数量调整网格膨胀因子结果出现功率不平衡却显示为最优解目标函数编码里没有正确施加约束用罚函数法或修复算子强制满足功率平衡SOC曲线出现跳变不连续状态转移方程的充放电效率搞混了仔细核对充放电双效率参数分开建模储能在V2G放电后SOC跌到0以下储能SOC下限约束没有起效检查约束代码的执行逻辑确保每个决策变量方向都受限经济成本数值异常大罚函数系数设置不合理罚函数系数不能太大也不能太小建议做敏感性测试迭代后期收敛很慢前沿形状差收敛因子a衰减过快后期缺乏勘探能力改为非线性衰减并增加变异操作5.2 参数调优的实操心得这里重点展开一下罚函数和约束处理。我在项目实施中发现多目标问题里约束处理比单目标更棘手因为你要在多个目标之间做权衡约束违反量很难换算成一个统一的罚函数数值。这个项目的做法是对硬性约束比如功率平衡采用“修复法”——一旦发现某个个体违反了功率平衡直接计算出不平衡量并分配给可调设备如购电功率把个体拉回可行域。对软性约束比如SOC范围采用“惩罚法”——如果SOC越界将越界量的平方乘以惩罚系数加到目标函数里。修复法的好处在于它不会把不可行解“扔进”罚函数里让算法把精力花在探索不可行区域上而是直接把解拉回可行域这样搜索效率更高解的质量也更有保障。如果你调代码时发现收敛速度特别慢或者结果经常跑飞优先检查约束处理是不是有问题。还有一个参数我特别想说收敛因子a的初值和衰减率。标准GWO里a从2线性减到0改进版改成指数衰减后我发现初值不要改保持2但指数底数可以调到0.98左右这样前期勘探时间足够长后期收敛速度又不会太拖后腿。这个参数是最值得做敏感性分析的一般跑20到30轮对比就能找到一个适合当前问题的最优设置。5.3 怎么把算法结果讲出说服力代码跑通之后论文或者汇报里要把结果讲清楚这里有几个技巧。首先Pareto前沿图的横纵坐标要选对。默认把三个目标全都画出来是画不了的只能三维图或两两组合。推荐的做法是画“运行成本-碳排放”的二维前沿第三维用颜色映射表示负荷波动这样一张图就能说清楚三个目标之间的权衡关系。我在文章里就用了这种可视化方式审稿人反馈接受度很高。其次要加对比实验。至少和标准MOGWO、NSGA-II放在同一个场景下对比给出IGD、GD、超体积三个评价指标。改进算法的价值不是“画一张漂亮的Pareto图”而是“用指标量化证明它比原算法好”。下表是我在一组测试场景下记录的结果仅供参考算法IGD指标超体积指标运行时间标准MOGWO0.21350.783286.3sNSGA-II0.19740.8015102.7s改进MOGWO本算法0.15280.876494.5s可以看到改进后的算法在两个评价指标上都优于对照算法运行时间也没有明显增加。这类对比实验数据是让工作“立住”的关键。最后要说清楚V2G到底带来了多少收益。方法很简单加一组“无V2G”的对照实验——储能还在但电动车只作为刚性负荷存在不允许放电。对比两种场景下的经济成本和碳排放差值就是V2G的贡献。我算过的一组数据里V2G可以让微网日运行成本下降约8%到12%这个数字对工程决策很有参考价值。6. 一点个人的体会做这个项目最大的感受是微网调度的难点不在数学公式而在“把工程问题翻译成数学问题”这个过程。风光预测数据拿到手怎么转换成模型输入V2G的车辆使用行为怎么抽象成约束条件多目标冲突怎么在算法层面找到平衡每走一步都需要对物理系统本身有足够深入的理解。如果你想复现这个项目我会建议你先在开源的微网测试系统数据上跑通整个流程再替换成自己的案例数据不要一上来就上真项目。先把储能和风光两个模块跑通再加V2G一步一个脚印地迭代。现在Matlab相关的调试工具链也比较成熟加上代码注释和模块化设计上手难度其实已经比前两年低了很多。从算法角度看改进灰狼算法目前其实已经算比较成熟的方向了但真正有区分度的工作还是在问题建模上。同样的算法换一个更贴近实际的V2G模型、换一个更细致的储能退化成本模型结果的说服力就完全不同。这也是一直在做这个方向的人可以持续深挖的点。
企业数字化 ERP 产品动态
相关推荐
基于蒙特卡洛抽样的电动汽车充电负荷计算与MATLAB实现 电动汽车充电负荷计算这些年一直是电力系统方向的热门课题,尤其是大规模电动汽车接入后,配电网规划、变压器容量选择、有序充电策略这些工作,全都依赖一个前提:得先把充电负荷算准。但电动汽车的充电行为随机性太强了,… · 2026/9/24 23:14:31
Vue Router 从入门到进阶:路由模式、守卫与权限控制的完整实战指南 做前端的人大概都绕不开 Vue Router。只要是 Vue 单页应用,想要有多个页面、想要让用户在不同视图之间跳转、想要在刷新之后还能停留在当前页面而不是回到首页,基本都要靠 Vue Router 来解决。它是 Vue.js 官方推出的路由解决方案,最初叫 vue… · 2026/9/24 23:14:31
基于Flask与uni-app的班级事务管理系统开发实战 说实话,班级里的那点事,看起来小,真正做起来能烦死人。班长要发通知、统计活动报名、安排值日、记录考勤,学习委员要收作业、登记成绩,文体委员要组织活动,所有信息都挤在微信群聊天记录里,翻起… · 2026/9/24 23:14:31
AM32 Bootloader三段式设计:硬件接管、安全校验与环境重建 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:38:07
AI与PLC融合实战:工业智能升级的分层协同架构 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:38:07
Windows照片查看器消失?四步注册表修复指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:38:07
STM32多模态智能门禁系统实战:从硬件设计到软件调试全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:38:07
ESP32调试改O2崩溃排查:volatile、未定义行为与优化陷阱 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:38:07
ESP32上WASM硬件调用实战:宿主API桥接原理与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:38:01
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37