news 2026/10/2 10:11:41

计及需求响应的区域综合能源系统双层优化调度复现指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计及需求响应的区域综合能源系统双层优化调度复现指南

近几个月我一直在做综合能源方向的论文复现工作,前前后后把几篇核心期刊上“计及需求响应的区域综合能源系统双层优化调度策略”类的文章用Matlab重新实现了一遍。这个方向的论文非常典型:区域综合能源系统(RIES)做双层优化,上层配置设备容量,下层做日内运行调度,同时把需求响应(DR)作为灵活性资源塞进模型里。听起来很清晰,但真正动手复现的时候,从数学建模到代码实现,再到结果对账,每一步都有不少坑。

如果你正在做电力系统、综合能源、优化调度相关的研究或课题,想把这类论文从PDF变成能跑的Matlab程序,这篇文章应该对你有用。我会把复现这类文献的完整思路、模型拆解方式、求解链路搭建过程,以及我自己踩过的关键坑都整理出来。

1. 这篇论文到底在优化什么:双层框架与需求响应的立足点

复现任何一篇论文,第一步不是看代码,而是把论文的“骨架”抽出来。这类区域综合能源系统双层优化调度的论文,骨架其实高度相似,理解了它,后面所有工作都是往里填细节。

1.1 区域综合能源系统的物理架构与调度难题

区域综合能源系统,简单说就是在一个区域内把电、气、热(有时候还有冷)多种能源形式放在一张网里统一调度。它的物理架构通常包含这样几类设备:

  • 供能侧:从上级电网购电、从天然气网购气,加上区域内的风力发电和光伏发电。
  • 转换侧:燃气轮机或内燃机组成的热电联产机组(CHP),一边发电一边产热;燃气锅炉补热;电锅炉把电转热;有冷负荷需求时还有吸收式制冷机和电制冷机。
  • 存储侧:蓄电系统(ESS)和蓄热系统(TSS),起到“削峰填谷”的缓冲作用。
  • 负荷侧:电负荷、热负荷(部分论文还扩展到气负荷和冷负荷)。

这个系统的调度难题在于:多种能源存在强耦合,CHP发多少电,往往就伴随产生多少热,电和热的决策不能分开做;储能设备有充电、放电、待机多种状态,涉及0-1整数变量;再叠加电网分时电价和气价的波动,使得整个问题变成一个大规模混合整数优化问题。如果直接用一个单层大模型把所有设备容量和逐时出力都塞进去,模型规模大、决策变量种类杂,而且规划尺度和运行尺度的目标会拧在一起,很难求解,也很难向审稿人讲清楚逻辑。

1.2 双层优化到底“双”在哪里

双层优化本质上是一种主从递阶决策结构。在这类论文里:

  • 上层是规划层。它做的是“长期决策”,决定区域内要装多大容量的风电、光伏、CHP、储能等设备。目标函数通常是年综合成本最小,包括设备的等年值投资成本、年运行维护成本,再加上下层返回来的年运行成本(典型日运行成本乘以天数折算)。
  • 下层是运行层。它做的是“短期决策”,在给定上层设备容量的前提下,以日运行成本最小为目标,决定每个时段各台机组的出力、储能的充放电功率、与外网购电买气的流量,以及需求响应的调节量。

上下层之间的交互逻辑是:上层把“我能给你多少设备容量”作为参数传给下层,下层在这个容量约束下做最优运行,算出日运行成本后返回给上层。上层根据这个成本去评估当前容量方案好不好,再调整容量方案,循环往复直到收敛。可以这样理解:上层是“设计院”,决定建多大的电厂;下层是“调度中心”,在给定电厂规模下决定怎么开机组最省钱。设计院要考虑调度中心的运行结果来倒推最优建设方案。

1.3 需求响应为什么是核心变量

传统调度里,负荷是不可调节的硬约束,所谓“源随荷动”。但需求响应把这个逻辑反过来了——让负荷侧也参与调节,用价格信号或激励手段引导用户改变用能行为。

在这类论文中,需求响应一般按能源类型分开建模:电负荷需求响应最常见,包括基于电价的需求响应(用户根据分时电价调整用电时段)和基于激励的需求响应(用户承诺在高峰时段削减一定比例的负荷并获得补偿);热负荷需求响应则利用热负荷的柔性区间(人体对温度感知不敏感,供热可以在一定范围内波动);也有论文把需求响应扩展到气负荷和冷负荷。

为什么需求响应能成为这类论文的核心卖点?因为加了需求响应之后,系统运行策略多了一个调节维度。高峰时电价高,需求响应把一部分可削减负荷砍掉,系统就不用高价购电,也不用频繁启动成本高的机组;低谷时电价低,需求响应引导负荷转移,储能也可以趁机充电,整体经济性得到改善。在仿真结果里,通常能看到加DR之后总成本下降、峰谷差缩小、新能源消纳率提升这几个指标变化,这也是论文结论的主要支撑。

2. 模型从文字到方程:双层约束与需求响应的数学表达

很多新手拿到论文,最痛苦的就是把叙述性文字转成标准数学表达式。这一节我会把这个过程完整走一遍。

2.1 上层规划模型:容量配置决策

上层模型通常包含以下核心要素:

目标函数:综合年化成本最小化,一般写作:

[ \min C^{inv} + C^{ope} + C^{main} ]

其中 (C^{inv}) 是设备投资成本的等年值折算,用资金回收系数把总建设成本摊到每一年,公式为:

[ C^{inv} = \sum_{i \in \Omega} \frac{r(1+r)^n}{(1+r)^n-1} c_i^{inv} E_i^{cap} ]

这里 (r) 是折现率,(n) 是设备寿命,(c_i^{inv}) 是单位容量投资成本,(E_i^{cap}) 是待优化的设备安装容量。(C^{ope}) 是从下层模型反馈回来的年运行成本,一般用“典型日运行成本 × 该典型日代表的天数”来折算;(C^{main}) 是运行维护成本,通常按投资成本的比例系数估算。

决策变量:各类设备的安装容量,如风电容量、光伏容量、CHP容量、电锅炉容量、储能容量等。

约束条件:设备容量上下限约束,以及区域内可用资源限制(比如光伏受屋顶面积限制、风电受安装场地限制)。这些约束比较简单,但注意一定要用论文里的量纲。我曾经看过一篇论文把光伏容量上限写成“3000”,实际是kW,结果我按MW读,整个优化结果偏了一个量级。

2.2 下层运行模型:日内调度决策

下层模型做典型日内的逐时调度,时间尺度一般是24个时段(1小时一个时段),有时候也用15分钟一个时段做96点调度,看论文设定。它的目标函数是日运行成本最小化:

[ \min C^{buy}_e + C^{buy}_g + C^{om} + C^{DR} - C^{sell} ]

逐项拆开解释:(C^{buy}_e) 是从电网购电的费用,等于分时电价乘以各时段购电量;(C^{buy}_g) 是购气费用,等于天然气价格乘以各时段购气量;(C^{om}) 是设备运行维护成本,通常和机组出力成正比;(C^{DR}) 是需求响应补偿成本,比如对可削减负荷按削减量和补偿单价结算;(C^{sell}) 是有分布式电源时的余电上网收益,部分论文考虑,部分不考虑,复现时要看清楚。

决策变量包括:

  • 各时段CHP的电出力 (P_{chp}(t)) 和热出力 (H_{chp}(t)),两者通过热电比约束关联;
  • 燃气锅炉热出力 (H_{gb}(t)),电锅炉热出力 (H_{eb}(t));
  • 储能各时段的充放电功率和充放电状态,蓄热系统的蓄放热功率;
  • 各时段购电量 (P_{buy}(t))、购气量 (G_{buy}(t));
  • 需求响应变量,包括可转移负荷的转移量、可削减负荷的削减量。

约束条件按类型分几组:

一是功率平衡约束,电功率平衡要有光伏、风电出力加上购电、CHP发电、储能放电,等于电负荷减去DR削减量再加上电锅炉耗电和储能充电。热功率平衡则是CHP供热加上燃气锅炉和电锅炉供热,等于热负荷减去热DR削减量。平衡等式是模型正确性的核心,任何一类负荷漏掉都会出现结果“看似最优实则错误”的情况。

二是设备出力约束,每台设备都有出力上下限,CHP还有爬坡速率约束,储能荷电状态(SOC)按递推公式逐时更新,且SOC要求保持在上下限范围之内,比如0.1到0.9之间,同时储能充放电状态用0-1变量约束,避免同时充放。

三是由上层传递过来的容量限制约束,即各设备运行时段的出力不能超过上层给定的安装容量。

2.3 需求响应的三种常见建模方式

需求响应建模方式直接决定模型里是增加连续变量还是整数变量,这一步很关键。

第一种是基于价格弹性矩阵的电价型DR。这是最经典的做法,用弹性系数把电价变化映射为负荷变化。计算公式为:

[ \Delta L_i / L_i = \sum_j E_{ij} \cdot \Delta p_j / p_j ]

其中 (E_{ij}) 是需求弹性系数,(i=j) 时是自弹性(通常为负,电价上升导致用电下降),(i \neq j) 时是交叉弹性(通常为正,其他时段电价上升促进本时段用电)。通过这个公式可以计算出DR调节后的等效负荷曲线。这种建模的好处是全连续变量、线性约束,求解快,缺点是弹性系数取值比较主观,论文里给的值往往来自参考范围(自弹性取值一般在-0.2到-0.5之间,交叉弹性在0.01到0.3之间),复现的时候要有心理准备。

第二种是基于激励的可削减负荷DR。设定每个时段可削减负荷不能超过该时段总负荷的一定比例,比如15%或20%,削减后按补偿单价结算。这类模型增加的是连续变量,约束也是线性的,比较好处理。

第三种是基于可转移负荷的DR。比如电动汽车充电、洗衣机等负荷可以从高峰时段平移到低谷时段,用0-1变量表示某类负荷是否在某个时段启动,并约束全天启动的总时长等于固定值。这种建模最真实,但引入了整数变量,会让模型求解时间成倍增加。复现时如果论文写得含糊,先用前两种模型跑通,再考虑是否加入可转移负荷。

3. Matlab复现主线路:Yalmip建模加CPLEX求解的关键代码思路

模型写清楚之后,就到了动手写代码的阶段。这类双层优化问题在Matlab里的主流实现方式,我建议走“Yalmip建模 + CPLEX/Gurobi求解”这条路线。

3.1 为什么选Yalmip而不是手写矩阵或自己实现优化算法

有些初学复现的人喜欢自己写粒子群或者遗传算法去硬解,这两个算法在这种问题里确实能出结果,但有个致命问题:标准粒子群和遗传算法跑这类多约束混合整数问题很容易陷入局部最优,且每次运行结果有随机性,论文里的数字很难对上。而Yalmip这套建模工具,可以把优化问题用接近数学语言的表达方式直接写出来,底层调用商业求解器CPLEX或Gurobi,搜索能力强、结果稳定、可复现性高。

Yalmip建模的核心逻辑非常直白:先用 sdpvar 定义连续变量、binvar 定义0-1变量,然后用“变量+约束条件+目标函数”三行核心代码组成优化模型,最后用 optimize 求解。对于熟悉Matlab的人来说,上手成本很低。

3.2 双层问题的两种求解思路

双层优化不能直接丢给求解器,要先想清楚怎么处理上下层关系。我复现过的文章里,主流求解思路有两种,各有适用场景。

思路一:KKT条件转换法。把下层运行优化问题用它的KKT最优性条件代替,嵌套到上层模型里,双层问题就变成单层“带互补约束的数学规划问题”(MPEC)。但这里的互补松弛条件是非线性的(原变量乘以对偶乘子等于0),需要引入0-1辅助变量和大M法做线性化,才能交给求解器处理。这个思路的问题在于:大M取值的选取直接决定求解效果,M太小会错误地截断最优解,M太大则可能导致数值病态,需要仔细调参。如果下层模型是完整的线性规划且约束数量不大,这种方法效率很高;但一旦下层有大量整数变量(比如储能状态变量),KKT转换就不好用了,因为整数规划没有连续意义上的KKT条件。

思路二:迭代启发式算法。上层用粒子群算法或遗传算法负责搜索设备容量方案,下层每轮调用Yalmip加CPLEX精确求解一次日运行优化,把运行成本返回给上层作为适应度值。我复现的绝大多数核心期刊论文都采用这种框架,原因很现实:写起来结构清晰,代码容错率高,即使上层算法搜索性能一般,下层精确求解也能保证运行成本计算的可信度。缺点也很明显,上层需要设置种群规模和迭代次数,收敛性需要靠实验确定跑多少代结果才稳定。

如果你只是想把论文结果跑出来,我推荐思路二;如果你要研究双层求解方法的创新性,思路一才是深入的方向。

3.3 关键代码片段的写法

这里给一个简化版的上下层迭代求解框架,方便理解整体代码脉络:

%% 上层:粒子群算法配置 % 决策变量:光伏容量、风电容量、CHP容量、储能容量、电锅炉容量 % 粒子维度 dim = 5 % 上层目标:年综合成本 = 年化投资 + 运行维护 + 下层返回的年运行成本 for iter = 1:maxIter for particle = 1:popSize % 解析当前粒子的容量配置方案 cap_PV = particles(particle, 1); cap_WT = particles(particle, 2); cap_CHP = particles(particle, 3); cap_ESS = particles(particle, 4); cap_EB = particles(particle, 5); % 调用下层函数求解日运行成本 dailyCost = solveLowerLevel(cap_PV, cap_WT, cap_CHP, cap_ESS, cap_EB, loadData, priceData); % 计算上层目标值 annualCost = annualizedInvestment(cap_*) + annualMaintain(cap_*) + dailyCost * repDays; fitness(particle) = annualCost; end % 更新粒子速度和位置,记录全局最优 end

下层函数的内部结构是这样的:

function dailyCost = solveLowerLevel(cap_PV, cap_WT, cap_CHP, cap_ESS, cap_EB, loadData, priceData) %% 定义变量 t = 24; P_chp = sdpvar(t, 1); % CHP电出力 H_chp = sdpvar(t, 1); % CHP热出力 P_gb = sdpvar(t, 1); % 燃气锅炉热出力 P_eb = sdpvar(t, 1); % 电锅炉热出力 P_buy = sdpvar(t, 1); % 购电量 G_buy = sdpvar(t, 1); % 购气量 P_dis = sdpvar(t, 1); % 储能放电 P_ch = sdpvar(t, 1); % 储能充电 u_ch = binvar(t, 1); % 充电状态标志 u_dis = binvar(t, 1); % 放电状态标志 L_cut = sdpvar(t, 1); % 可削减电负荷 SOC = sdpvar(t, 1); % 储能荷电状态 %% 目标函数 Objective = sum(price_elec .* P_buy) + sum(price_gas .* G_buy) ... + sum(c_chp .* P_chp) + sum(c_ess .* (P_dis + P_ch)) ... + sum(c_dr .* L_cut); %% 约束条件 Constraints = []; % 储能约束:状态切换、SOC递推、容量限制 Constraints = [Constraints, SOC(1) == SOC0]; for k = 1:t-1 Constraints = [Constraints, SOC(k+1) == SOC(k) + P_ch(k)*eta_ch - P_dis(k)/eta_dis]; end Constraints = [Constraints, 0 <= SOC <= SOC_max]; Constraints = [Constraints, u_ch + u_dis <= 1]; Constraints = [Constraints, 0 <= P_ch <= cap_ESS * u_ch]; Constraints = [Constraints, 0 <= P_dis <= cap_ESS * u_dis]; % 电功率平衡 Constraints = [Constraints, P_pv + P_wt + P_chp + P_buy + P_dis == ...]; % 热功率平衡 Constraints = [Constraints, H_chp + H_gb + H_eb == H_load - H_cut]; %% 求解 ops = sdpsettings('solver', 'cplex', 'verbose', 2); optimize(Constraints, Objective, ops); dailyCost = value(Objective); end

代码结构本身不复杂,但有几个细节值得特别注意。一是储能的充放电状态,虽然理论上一充一放不会同时发生,但线性规划求解过程中有可能得到“边充边放”的结果,所以必须加 (u_ch + u_dis \le 1) 的约束。二是SOC的初值处理,论文里经常是“一个调度周期始末SOC相等”,这个约束会让储能真正起到日间移峰作用,不加的话储能可能把所有电都放到最后一个时段,结果非常假。三是所有乘号都用点乘或者循环内逐个相乘,避免矩阵维度不匹配。

4. 复现中的坑与排查:参数标定、场景削减与结果核验

代码能跑起来只是开始,复现的核心难题在于“跑出来的结果和论文不一致”,这时候排查就成了主要工作。

4.1 参数标定是最大的隐形坑

论文里的核心参数一般会给出,比如设备单位投资成本、效率、价格曲线,但总有相当一部分参数是缺失的。负荷曲线最典型,论文里往往只给一张归一化曲线图,没有数据表;分时电价也经常只写“峰平谷电价分别为1.1元/kWh、0.68元/kWh、0.38元/kWh”而没有具体时段划分。这些都要自己通过读图工具或者WebPlotDigitizer这类软件从论文图片里提取数据,或者参照同类文献的典型数据补齐。

我复现时吃过一个大亏:论文用的是15分钟一个时段共96点数据,我只按24点读了图,结果算出来的日购电成本比论文差了近两倍,折腾了两天才发现是时段粒度的问题。建议拿到论文后第一步就把它的时间尺度、单位、价格基准全部列成一张参数表,逐项核对完再动手。

量纲问题同样值得警惕。风电光伏出力单位是kW,购电费单位是元,如果设备容量是MW,折算的时候少乘1000,后果是成本整体小3个数量级,而且这种错误在结果里根本不容易发现,因为最优解的形状和曲线走势基本不受影响,变的只是坐标轴数值。

4.2 场景生成与求解时间之间的平衡

如果论文考虑了风电、光伏出力和负荷的不确定性,通常会采用场景法:先生成大量场景,再用场景削减技术留下少数代表性场景。我在复现中常用拉丁超立方采样(LHS)生成初始场景,再用K-means聚类或同步回代消除法把场景数量减到5到10个。这一步的意义在于:场景数从500减到10个,求解时间可以从几小时降到几分钟,而目标值的精度损失通常在2%以内,非常划算。

具体操作可以这样:先用LHS在风速、光照、负荷的概率分布上生成500个等概率场景,对每个场景做24点的时序采样,然后把每个场景看成一个24维向量,用K-means聚成K类,每类中心作为典型场景,权重为该类场景数量除以总场景数。得到典型场景后,下层运行优化的目标函数变成各场景日运行成本按概率加权求和,约束条件对每个场景分别列出。代码上只需要在下层函数里加一重场景循环,其他逻辑不变。

这里要特别强调:随机数种子必须固定,比如在LHS采样前加一行rng(2024),否则每次运行生成不同的场景集合,复现结果时对不上号。我在帮别人排查代码时见过不少次这种情况——模型没写错,但因为随机种子没固定,每次运行总成本差个几百块,怎么调都找不到原因。

4.3 结果不合理时的排查思路

仿真心电图式的排查法,结果出了问题不要立刻怀疑求解器,按照这个顺序检查:

第一,看SOC曲线是不是正常波浪形。储能SOC理想的形态是低谷时段充电上升、高峰时段放电下降,如果SOC曲线出现锯齿状或者最后一天直接冲顶,大概率是SOC约束写错或者初值设置的问题。第二,看DR削减量是不是都堆在电价高峰时段。如果削减量出现在谷时段,说明目标函数符号写反了,补偿成本变成负收入,模型当然会疯狂削减负荷。第三,看购电量曲线和分时电价的关系,正常情况下高价时段少购电,低价时段多购电,如果完全反了就是价格序列排序错误。第四,对照论文的运行结果图逐时段核对趋势,而不是只核对总成本数字。总成本对上了但逐时曲线趋势对不上,说明用的典型日或者负荷数据不是论文那组;总成本差一点但曲线趋势一致,可能只是某个补偿单价的小数点后一位差了一点点。

还有一层需要注意:这类论文的上层迭代优化过程,如果用的是智能算法,论文里通常会给出收敛曲线。复现时看到目标值上下震荡不下降,不一定是代码bug,可能是粒子群参数设置问题,比如学习因子、惯性权重的数值不合理。我的经验是先调大种群规模到100到150,把迭代次数放到200代左右,确认收敛趋势正常后再逐步减小规模,以平衡计算时间。

5. 把复现代码变成自己的研究工具:敏感性分析与模型扩展

复现一篇论文的最终目的,不应该只是把原始结果原样跑出来,而是把这个双层优化框架变成你自己课题里的实验工具。我这里分享两个扩展方向,也是我做完复现之后实际尝试过的路径。

5.1 参数敏感性分析的具体做法

这类双层模型最有价值的实验就是敏感性分析。做一个完整的敏感性分析其实不复杂:把某个关键参数换成一组变化序列,重新跑一次完整的上层迭代,记录最优目标值和最优容量方案的变化,然后画成曲线或表格。我做过DR补偿价格从0.2元/kWh到1.0元/kWh的扫描,一共5个点,每个点跑50代粒子群,因为下层是线性规划求解很快,实验总耗时也就一两个小时。

敏感性分析的结果通常能揭示不少论文里不会直接写的内容:DR补偿价格不断增加时,系统总成本呈现边际递减趋势,说明需求响应带来的效益存在饱和;储能容量增加到某个值之后继续扩容,总成本的下降幅度已经很小,这时新增投资基本是浪费;光伏渗透率提高之后,系统对DR的依赖度会下降,因为新能源出力本身就在压低高峰购电需求。这种规律性结论,写小论文的时候恰恰是加分项,因为它证明了你的模型不仅“能算”,而且“能解释现象”。

5.2 从复现代码到课题实验平台

最后再说说模型扩展的方向。

这篇论文里的是确定性双层优化加基础需求响应。你可以沿着四条路线扩展:一是在不确定性处理上,把场景法换成鲁棒优化或分布鲁棒优化,让模型对极端场景更有抵抗力;二是在目标函数上加入碳交易机制,把碳排放配额和碳价纳入成本,研究碳排放约束对容量配置和DR调节策略的影响;三是在DR模型上做文章,从单一价格型DR扩展为价格型加激励型的综合DR,甚至考虑对可转移负荷做更细粒度的建模;四是从单区域走向多区域互联,考虑区域间能量互济,做多主体博弈或合作调度。

每条扩展路径都对应一个可发表的创新点。而底层框架就是你现在复现出来的这段Yalmip代码,换目标函数、加约束集、改参数文件,很快就能搭出新实验。

我自己在复现完这篇论文之后,最大的体会是:这类“核心期刊复现”工作看起来是简单执行,实际上是在逼着你把优化建模、求解器和系统物理过程完整串起来。第一次跑通双层循环、看到收敛曲线稳定下降的时候,你会觉得前面踩过的那些单位错误、场景没固定、SOC跳变的坑,都值了。如果你也正在复现类似文章,卡在哪一步了,欢迎在评论区聊聊具体现象——是结果对不上、求解器报错,还是模型不知道怎么下手,我们对着实际代码和报错信息一起排查,效率会比自己闷头调高很多。

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

TPS薄板样条变换:从物理直觉到图像配准实战

做图像配准、人脸形变或者点云处理的朋友&#xff0c;大概率都撞见过“TPS”这三个字母。更巧的是&#xff0c;如果你同时做性能测试&#xff0c;会发现性能圈子里的TPS是Transactions Per Second&#xff08;每秒事务数&#xff09;&#xff0c;一度让我在查资料时怀疑人生。这…

作者头像 李华
网站建设 2026/10/2 10:09:37

2.1G FDD NR上行质切参数优化:基于无锡试点的门限设置实践

简介&#xff1a;网络优化领域的一份阶段性技术小结&#xff0c;聚焦2.1G FDD NR上行质切试点&#xff0c;面向5G网络优化工程师、移动通信技术支持人员及对无线性能调优感兴趣的学习者&#xff1b;资源为单个docx文档&#xff0c;包体约1.67MB&#xff0c;内容结构完整&#x…

作者头像 李华
网站建设 2026/10/2 10:09:37

执法记录仪采集站对接故障排查:识别、上传、验收全攻略

2. 对接失败的排查思路 2.1 设备识别阶段的常见问题 执法记录仪接入采集工作站&#xff0c;第一关是“被发现”。很多对接问题其实都卡在这一步&#xff0c;但现场人员往往容易忽略。 先说一下设备识别的基本流程&#xff1a;记录仪通过USB口连接到采集站后&#xff0c;采集站…

作者头像 李华
网站建设 2026/10/2 10:09:04

【仓颉语言入门 · 第22课】

【仓颉语言入门 第22课】文件与目录 IO&#xff1a;让程序的数据持久化 前 21 课的数据都活在内存里&#xff0c;程序一关就没了。本课带你掌握 std.fs 文件系统库&#xff1a;读写文本文件、遍历目录、处理路径拼接&#xff0c;最后把第 21 课的订单数据保存到文件&#xff0…

作者头像 李华
网站建设 2026/10/2 10:08:51

AI助教配置实战:从答非所问到精准辅助的三层模型

1. 为什么你的AI助教总是“答非所问”很多人第一次把AI助教接进项目里&#xff0c;满心欢喜地以为终于可以解放双手了&#xff0c;结果用了不到三天就发现&#xff1a;这玩意儿怎么像个刚入职的实习生&#xff0c;问啥啥不知道&#xff0c;让它改个代码能把整个文件删了&#x…

作者头像 李华
网站建设 2026/10/2 10:08:14

Python爬虫反爬虫策略分层解析与Selenium自动化抗检测实战

先说一个我最近接到的真实需求。对方要爬一个中等规模的电商站点&#xff0c;页面结构看似平淡无奇&#xff0c;用requests两三行就能拿到首屏HTML。可等我真正写下去却发现&#xff0c;翻到第二页时接口返回的是一段被加密过的JSON&#xff0c;再往下请求直接出现403&#xff…

作者头像 李华