☰
电力系统状态估计:WLS、WLAV与神经网络方法对比与Matlab实现
2026/10/18 11:32:17 网站建设 项目流程

简介:一份面向电力系统状态估计的毕业设计/课设完整项目,集成了WLS、WLAV两种经典估计算法和前馈神经网络、LSTM两种深度学习方法,且同时给出MATLAB与Python实现,能覆盖电气、自动化、计算机相关专业学生在状态估计方向的建模、仿真与答辩演示需求。压缩包内含50个文件(约93.55MB),主要包括.m脚本、.py源码、.xls/.xlsx负荷数据、.pkl训练模型及多份README说明,其中内置IEEE14、IEEE118节点系统和train/test数据集,可直接运行对照。读者可按照README步骤复现传统最小二乘、最小绝对值和神经网络状态估计结果,比较不同方法在坏数据场景下的抗差性能;同时也能参考数据读取、模型训练与评估环节的代码组织方式,用于毕设、课设、竞赛或初期项目演示。目前已有86人学习下载,适合希望快速获取可运行源码和完整实验流程的高年级本科生、研究生及入门开发者,代码经过测试,可放心作为基础进行二次修改。

1. 为什么电力系统状态估计是毕业设计里的“硬骨头”

做电力系统方向的毕业设计或课程设计,状态估计几乎是绕不开的一道坎。很多同学搭完潮流计算、短路计算,觉得系统分析也不过如此,结果一碰状态估计就懵了:明明有 SCADA 量测数据,为什么算出来的母线电压和相角总是不对?量测里有坏数据,为什么残差检测半天查不出来?最头疼的是,不同的估计方法算出来结果还不一样,到底该信哪个?

标题里这套包把三条路线放在了一起:**WLS(加权最小二乘)**是工业界几十年的主力,收敛快、理论成熟,但扛不住坏数据;**WLAV(加权最小绝对值和)**用 L1 范数换鲁棒性,对野值天生免疫;神经网络模型则跳出迭代框架,直接学量测到状态量的映射关系。一个做课设的同学如果把这三者从原理推到代码实现,再对比分析各自的适用场景,这工作量已经能撑起一篇不错的毕业论文了。这篇文章就沿着这条路线,从算法原理讲到 Matlab 实现,再讲参数调优和踩坑记录,保证你拿着就能动手。

2. WLS(加权最小二乘):先把理论基础打到及格线

2.1 从量测方程到目标函数:WLS 到底在优化什么

电力系统状态估计的量测方程可以写成 z = h(x) + e,其中 z 是量测向量(有功、无功、电压幅值),x 是状态向量(母线电压幅值和相角),h(x) 是量测函数,e 是量测误差。这里的核心逻辑是:状态量是未知的,量测量是已知的(从 SCADA / 数据采集与监控系统来),我们要反推状态量。

WLS 的目标函数是 min J(x) = [z - h(x)]^T · W · [z - h(x)]。注意这个加权矩阵 W,它通常取量测误差方差的倒数,也就是精度高的量测权重高,精度低的权重低。在实际系统中,有功量测的误差一般在 0.5%~1%,电压幅值在 0.2%~0.5%,这些先验信息就体现在 W 的对角元里。

目标函数是二次型,但 h(x) 是 x 的非线性函数(潮流方程本身就是非线性的),所以不能直接求解析解,要用 Gauss-Newton 迭代。迭代公式是:

x^(k+1) = x^(k) + [H^T W H]^(-1) · H^T W · [z - h(x^(k))]

其中 H = ∂h/∂x 是雅可比矩阵。很多人第一眼看到这个公式觉得复杂,但拆开看就是三个东西:增益矩阵 G = H^T W H,残差 r = z - h(x^(k)),然后解一个线性方程组 G · Δx = H^T W r。

2.2 Matlab 手写 WLS:30 行代码跑通 IEEE 14 节点

既然做毕业设计,我不建议上来就调现成的工具箱,自己手写一遍才能真正理解迭代过程。下面这是一个最简版本的 WLS 核心迭代代码,基于直角坐标形式的状态量简化处理。

% wls_estimation.m - 加权最小二乘状态估计核心迭代 % 输入: z(量测向量), bus(母线数据), branch(支路数据), W(权重矩阵) % 输出: x_est(估计的状态向量) function x_est = wls_estimation(z, bus, branch, W) % 初始化: 平启动,电压幅值取1.0,相角取0 n_bus = size(bus, 1); x = [ones(n_bus, 1); zeros(n_bus, 1)]; % 前n_bus个是电压幅值,后n_bus个是相角 max_iter = 100; % 最大迭代次数 tol = 1e-6; % 收敛阈值,按Δx的无穷范数判断 alpha = 1.0; % 步长系数,必要时缩小防止发散 for iter = 1:max_iter % 计算量测函数 h(x) 和雅可比矩阵 H [h, H] = calc_h_and_H(x, bus, branch); % 残差向量 r = z - h; % 增益矩阵 G = H' * W * H G = H' * W * H; % 右端项 g = H' * W * r g = H' * W * r; % 解线性方程求修正量 dx = G \ g; % 更新状态量 x = x + alpha * dx; % 收敛判断: 修正量足够小则停止 if max(abs(dx)) < tol break; end end x_est = x; end

这段代码的逻辑很清晰:calc_h_and_H负责每次迭代计算当前状态下的量测估计值和雅可比矩阵,这是整个程序里最耗时也最容易出错的部分。G \ g在 Matlab 里走的是 LU 分解,对小规模系统(14~118 节点)完全够用。初始化用平启动是经验做法——电压幅值全取 1.0 pu,相角全取 0,对于没有重载情况的系统通常 3~5 次迭代就能收敛。

几个关键参数要注意:tol取 1e-6 是行业里比较常见的默认值,如果你做的是 IEEE 14 节点这种小算例,1e-5 也能收敛得很好,调小反而可能让迭代在不动点附近来回抖动;步长alpha默认取 1.0,但如果迭代过程出现残差振荡增大,可以把它缩到 0.5 甚至 0.25,这比修改收敛阈值更有效。

2.3 WLS 的三大前提:为什么坏数据一来它就翻车

WLS 的理论基础建立在三个假设之上。第一,量测误差服从零均值的高斯分布,这在实际系统中基本成立,但异常量测(坏数据)明显偏离这个分布;第二,量测函数 h(x) 在运行点附近是光滑可微的,这个没问题;第三,增益矩阵 G 可逆,这要求系统满足可观性条件,量测冗余度要足够。

问题就出在第一个假设上。当某个量测突然跳变(比如电流互感器饱和、通信干扰),它的残差会被放大,但由于 WLS 用的是平方项,一个坏数据点的影响会像滚雪球一样扩散到相邻母线的估计结果上。典型现象是:某条支路的有功量测坏了,结果周围 3~4 条母线的电压幅值估计全部偏离真实值 10% 以上。

这就是为什么工业界在做 WLS 之后还要加一个残差检测模块:先跑一遍 WLS,计算标准化残差 r_N = |r_i| / sqrt(σ_i),超过阈值(比如 3.0)的判为可疑,剔除后重新估计。但这个后验方案在坏数据比例超过 20% 时就失效了,因为残差污染太严重,正常的量测反而看起来像坏数据。

3. WLAV(加权最小绝对值和):用 L1 范数换鲁棒性

3.1 从二次规划到线性规划:WLAV 为什么天然抗野值

WLAV 的出发点很简单:把目标函数从平方和改成绝对值求和。min J(x) = Σ w_i |z_i - h_i(x)|。这个改动看起来不起眼,但数学性质完全变了。

平方项让大残差的影响力是平方级别的,而绝对值项是线性级别的。换句话说,WLS 会给坏数据分配极大的惩罚权重,导致解被拉偏;WLAV 则对所有残差一视同仁,坏数据对目标函数的贡献不会因为它的偏差大而被放大。这是从数学本质上抗坏数据,不是靠后验检测。

但麻烦随之而来:绝对值函数在零点不可导,Gauss-Newton 那一套直接失效。业界标准的做法是把这个非光滑优化问题转化为线性规划来求解。引入两个非负松弛变量 u_i 和 v_i,让 |z_i - h_i(x)| = u_i + v_i,同时满足 z_i - h_i(x) = u_i - v_i,然后对 h(x) 做一阶泰勒展开,就得到标准的线性规划形式:

min Σ w_i (u_i + v_i) 满足: H·Δx + u_i - v_i = z_i - h_i(x^(k)), u_i, v_i ≥ 0

这里 H 仍然是雅可比矩阵。目标函数是线性的,约束是线性的,直接用linprog就能求,迭代步骤和 WLS 一样,只是每步的子问题从解线性方程组变成了解线性规划。

3.2 linprog 求解 WLAV:参数传递与迭代控制

% wlav_estimation.m - 加权最小绝对值和状态估计(线性规划迭代) % 用 linprog 求解内点法线性规划,迭代外层与 WLS 类似 % 输出: x_est(状态量估计), iter_num(迭代次数) function [x_est, iter_num] = wlav_estimation(z, bus, branch, W) n_bus = size(bus, 1); x = [ones(n_bus, 1); zeros(n_bus, 1)]; % linprog 需要明确的上下界,状态量修正幅值给较大边界即可 lb = -1.0 * ones(2*n_bus, 1); ub = 1.0 * ones(2*n_bus, 1); max_iter = 30; % 线性规划迭代相对慢,收敛次数比WLS多一些但更稳 tol = 1e-5; % WLAV 收敛精度要求可以略放松,因为鲁棒性是主诉求 for iter = 1:max_iter [h, H] = calc_h_and_H(x, bus, branch); % 构造线性规划标准形式:min f'*y, Aeq*y = beq, y >= 0 % y = [dx; u; v],dx对应状态量修正,u/v对应正负残差 n_z = length(z); n_dx = 2 * n_bus; % 目标函数系数:状态量修正不参与目标,u和v按权重加权 f = [zeros(n_dx, 1); W; W]; % 等式约束: [H, I, -I] * [dx; u; v] = z - h Aeq = [H, eye(n_z), -eye(n_z)]; beq = z - h; % 变量下界(linprog默认变量可为负,但松弛变量必须非负) lb_y = [-inf(n_dx, 1); zeros(2*n_z, 1)]; ub_y = [inf(n_dx, 1); inf(2*n_z, 1)]; % 调用 linprog,关闭迭代输出避免刷屏 options = optimoptions('linprog', 'Display', 'off', 'Algorithm', 'dual-simplex'); y = linprog(f, [], [], Aeq, beq, lb_y, ub_y, options); % 从 y 中取出修正量并更新 dx = y(1:n_dx); x = x + dx; % 判断收敛:主要看状态修正量和残差的最大绝对值 if max(abs(dx)) < tol break; end end x_est = x; iter_num = iter; end

这个实现的关键点在于等式约束 Aeq 的拼装。H 是 m×n 的雅可比矩阵,eye(n_z) 对应 u 变量,-eye(n_z) 对应 v 变量,这样约束才严格等于量测残差。dual-simplex算法比内点法在线性规划规模小时更快,而且对病态问题更稳。

实际跑的时候你会发现,WLAV 的迭代次数通常比 WLS 多,但每次迭代几乎不会发散。这是因为线性规划求解器本身有严谨的收敛性保证,不像解线性方程组那样可能遇到 G 矩阵条件数过大的问题。在 IEEE 30 节点下,WLS 通常 4 次迭代就收敛,WLAV 可能要 8~12 次,但整个耗时仍然是秒级,对课设来说完全不是瓶颈。

3.3 坏数据场景下的对比:什么时候你会庆幸自己写了 WLAV

做个简单实验就能看出两者的差距:在 IEEE 14 节点系统里,随机挑 5 个量测点,把它们的值改成正常值的 3 倍,然后分别跑 WLS 和 WLAV,比较估计结果与真值的偏差。WLS 的电压幅值平均偏差可能到 3%~5%,而 WLAV 能控制在 0.5% 以内。

为什么?因为 WLAV 对坏数据的处理方式是“忽略”,它会把坏数据的残差推给松弛变量 u_i 或 v_i,而状态量修正不受影响。从线性规划的角度看,这等价于自动识别并剔除了那些与量测方程不一致的约束。这省掉了一整套残差检测流程,代码更简单,行为更可靠。

但 WLAV 也不是万能的。它的缺陷在于:当坏数据比例非常高(超过 30%)时,可行域里可能出现多个局部最优解,最终的收敛点取决于初始值。另外,WLAV 对正常量测的估计精度略低于 WLS,因为 L1 范数的最优解天然会把一些小的正常误差也“压”到松弛变量里去,导致有效冗余度下降。所以我在做课设的时候,最终对比章节里会明确写:正常工况用 WLS 拿精度,异常工况用 WLAV 保鲁棒性,两者不是替代关系,是互补关系。

4. 神经网络模型:把状态估计变成端到端的回归任务

4.1 为什么神经网络能用于状态估计:从物理方程到纯数据映射

当系统规模变大、拓扑频繁变化时,传统的模型驱动方法会碰到两个瓶颈:一是雅可比矩阵的计算和因子分解每次都要重做,实时性跟不上;二是模型参数(线路参数、变压器变比)不准时,估计精度会大打折扣。神经网络模型换了一条路:把量测向量 z 当作输入,状态向量 x 当作输出,用一个深度网络直接学映射 f(z) → x。

这个思路的可行性建立在两个事实上。第一,潮流方程是可逆的——在正常运行范围内,量测向量和状态向量是一一对应的映射;第二,历史数据(或离线仿真数据)可以轻松生成大量训练样本,给足“输入-输出对”。所以本质上这是一个回归问题,损失函数取均方误差 E = ||x_pred - x_true||^2。

对于毕业设计来说,用神经网络做状态估计最大的优势是省去了复杂的状态估计理论推导,只要你造出训练集、搭一个前馈网络、调好超参数,就能出结果。但代价是失去了可解释性——你不知道网络内部学到了什么规则,只能在测试集上验证它的精度。

4.2 训练数据生成与网络结构:一个可复现的 Matlab + Deep Learning Toolbox 方案

数据生成是最容易翻车的一步。很多人直接只用一批固定的潮流数据,结果训练集和测试集高度相关,测试精度虚高。正确做法是:在负荷的合理波动范围内随机抽样,每个样本就是一组稍有不同的运行方式。

% generate_training_data.m - 生成神经网络状态估计的训练数据集 % 思路: 在负荷波动范围内随机抽样,做潮流计算得到量测和状态真值 % 输出: TrainData.mat, 包含 Z(量测) 和 X(状态) load case14; % IEEE 14节点系统数据,来自Matpower n_samples = 5000; % 样本数 base_load = bus(:, 3) + bus(:, 4); % 各母线基态负荷有功+无功 Z = zeros(n_samples, 41); % 量测数量按实际可测支路和注入定义 X = zeros(n_samples, 28); % 14节点电压幅值 + 14节点相角 for i = 1:n_samples % 在基态负荷的70%到130%之间随机扰动 load_scale = 0.7 + 0.6 * rand(size(base_load)); mpopt = mpoption('out.all', 0, 'verbose', 0); % 修改负荷后跑潮流 mpc = loadcase('case14'); mpc.bus(:, 3) = base_load .* load_scale; r = runpf(mpc, mpopt); % 如果潮流不收敛,跳过样本,收敛是进训练集的必要条件 if r.success ~= 1 continue; end % 构造量测向量: 取部分母线注入功率+支路潮流+少量电压幅值 % 这里简化处理,直接取所有母线有功/无功注入和支路潮流 [V, theta] = r.bus(:, 8), r.bus(:, 9) * pi/180; X(i, :) = [V; theta]; % 计算量测: 无需加噪声,训练完成后可另外构造带噪数据做测试 Z(i, :) = build_measurement_vec(r, mpc); % 自定义函数,按实际量测配置求值 end % 保存(去掉未收敛的运行) train_idx = any(X ~= 0, 2); save('TrainData.mat', 'Z', 'X');

这段代码里最关键的是load_scale = 0.7 + 0.6 * rand这个随机扰动范围。70%~130% 的波动算是比较温和的,如果希望模型泛化性更强可以放宽到 50%~150%,但要注意的是,波动范围过大时有些样本会接近电压稳定极限,潮流不收敛的比例会上升。另一个细节是训练集里不应该加量测噪声——让网络先学到确定性映射,测试时再加噪声才有对比意义。

网络结构方面,我一般建议用隐藏层 2 层、每层 64 个神经元的配置,输入层 41(量测维度),输出层 28(状态维度)。再深的网络对这个小规模问题没有明显收益,反而增加过拟合风险和训练时间。激活函数选 ReLU 就行,输出层不要加激活——回归问题最后一层必须是线性输出。

% train_nn_estimator.m - 训练神经网络状态估计模型 % 使用 Deep Learning Toolbox load('TrainData.mat'); Z_data = Z(train_idx, :); X_data = X(train_idx, :); % 数据归一化 - 关键步骤! 电压幅值约1.0,相角约-0.3, % 量测值范围差异大,不归一化会严重影响训练速度 [Zn, Z_settings] = mapminmax(Z_data', -1, 1); [Xn, X_settings] = mapminmax(X_data', -1, 1); % 定义网络结构 layers = [ featureInputLayer(41, 'Normalization', 'none') fullyConnectedLayer(64, 'WeightsInitializer', 'he') reluLayer fullyConnectedLayer(64, 'WeightsInitializer', 'he') reluLayer fullyConnectedLayer(28) regressionLayer ]; % 训练选项: 亚当优化器,100轮,小批量32 options = trainingOptions('adam', ... 'MaxEpochs', 100, ... 'MiniBatchSize', 32, ... 'InitialLearnRate', 1e-3, ... 'Plots', 'training-progress'); % 训练 net = trainNetwork(Zn', Xn', layers, options); % 保存模型和归一化参数 save('nn_model.mat', 'net', 'Z_settings', 'X_settings');

归一化这一块值得单独强调。mapminmax默认把数据缩放到 [-1, 1],如果你的量测里有支路潮流值超过 100 MVA,而电压幅值只有 1.0 左右,比例差距过大,梯度更新会非常不均匀。he初始化配合 ReLU 是标准搭配,换成正态分布初始化的话深层网络训练误差会明显偏大。

4.3 神经网络测不准的边界:拓扑变更和坏数据检测的先天短板

神经网络的精度上限完全取决于训练数据覆盖的范围。如果在训练阶段没有出现过某条线路断开(N-1 故障)的情况,那测试时一旦这条线路真的停运,输入量测向量的分布特性完全变了,模型给出的估计结果会离谱到什么程度都不意外。

这是神经网络方案在工程落地中最大的争议点。传统 WLS/WLAV 用的是物理模型,拓扑变化可以精确建模,改一下节点导纳矩阵就行;神经网络是数据驱动的,它把所有拓扑信息都“焊”在了权重里,没法做针对性修正。

坏数据检测面临同样的问题:网络在训练时输入的都是干净量测,对野值输入的响应是不可控的。也许某个量测坏了以后网络输出的电压估计还是准的,但也可能完全崩掉,这不是一个日志级参数,而是整个方案是否能站得住脚的概念性问题。我的建议是:在论文或课设报告里把这一节的讨论写成“局限性与后续改进方向”,这反而是加分项——证明你真的理解了方法的适用边界。

5. 状态估计避坑手册:从矩阵病态到数据泄露的 6 个血泪教训

5.1 雅可比矩阵拼装错误在数值上不明显,但对结果影响巨大

你知道吗,雅可比矩阵拼错最常见的形式是符号错了——支路潮流的导数项和注入潮流的导数项搞混,导致 H 矩阵某些列的符号取反。这是 WLS 和 WLAV 共用的计算模块,改一处错两处。

现象:迭代能收敛,但估计结果和真值差距在 5% 以上,而且残差检查也查不出来。原因:H 矩阵错误导致增益矩阵 G 和右端项 g 都错得“自洽”,修正量仍然收敛到一个错误点。解决:不要只相信残差大小,要挑几条典型支路手算一遍潮流的偏导数,逐列对比calc_h_and_H的输出。我一般是挑 IEEE 5 节点里一条支路、一条母线注入,手推两个偏导数,和程序对一下就够了。

5.2 WLS 的权重矩阵 W 用错了形式,收敛速度骤降

现象:WLS 迭代 20 次以上才收敛,甚至出现锯齿振荡。原因:量测误差方差和权重是倒数关系 W_i = 1/σ_i²,很多人把 σ 当权重,权重小了两个量级,等效于降低了所有量测的信任度,但相对关系没变,导致步长偏短。解决:检查 W 的对角元数量级。电压幅值量测的 σ 取 0.005 pu 左右,功率量测的 σ 取 0.01 pu(标幺值),那么电压幅值的权重应该在 40000 量级,功率权重在 10000 量级,如果算出来权重只有几十,肯定是单位或方差取错了。

5.3 神经网络训练集和测试集“数据泄露”,测试精度假得离谱

现象:训练集 99% 的准确率,测试集 99% 的准确率,换一个稍微不同的负荷分布立刻掉到 70%。

原因:数据生成时负荷随机抽样的分布范围太窄(比如只在 ±2% 内波动),训练集和测试集几乎重叠,网络本质上是在“记忆”样本而不是“泛化”映射。

解决:把负荷波动范围分成两段——训练段 70%~115%,测试段 115%~130%,或者按时间序列前 80% 做训练、后 20% 做测试。宁可训练精度低一点点,也要保证测试精度是真实的。

5.4 迭代发散时第一步不是调参数,而是检查初始值

现象:WLS 或 WLAV 第一轮迭代残差巨大,第二轮直接 NaN。

原因:系统重负荷条件下平启动的偏差太大,初次泰勒展开点离真实解太远,导致修正量过大,步长越跨越远。

解决:先用直流潮流(DC Power Flow)算一个初始相角,再启动状态估计迭代,电压幅值沿用平启动 1.0 pu 就好。这个先兆方法对 IEEE 118 节点这类大系统特别有效,相角初值偏差从 30 度以上降到 5 度以内,迭代稳定性立刻不一样。

5.5 量测冗余度不足时,WLAV 比 WLS 更容易产生尖刺估计

现象:在某些母线量测配置非常稀少的区域,WLAV 估计出的电压相角在相邻采样点之间跳变很大。

原因:WLAV 的中位数回归特性在冗余度低的区域会导致解空间有平坦区域,任意一个可行解都可能被选中,看起来就像估计值在“抖动”。

解决:在目标函数里加一个小的二次正则项,比如 λ·(Δx)^T(Δx),λ 取 1e-3 左右。这被称为“弹性网”式的 WLAV-EL 变体,既能保留 L1 的鲁棒性,又能消除解空间的不唯一性。副作用是坏数据抑制能力会稍微减弱,但 λ 足够小的话几乎无感。

5.6 矩阵G \ g报奇异的真前兆,别只盯着量测数量看

现象:G \ g偶尔报“Matrix singular”或条件数警告。

原因:即使量测数量大于状态数量,某些母线附近可能只有注入量测没有支路量测,导致本地可观性不足,G 矩阵接近奇异。

解决:在每次迭代开头加一个条件数检查语句condest(G) < 1e12,如果超了,就输出可疑母线编号。定位方式是看 G 矩阵的小特征值对应的特征向量,最大的几个元素对应的母线就是冗余度不足的地方。这比盲人摸象式地加量测要快得多。

6. 把三种方法放在同一个框架里交叉验证:最后一公里的技巧

如果你已经依次实现了 WLS、WLAV 和神经网络模型,那最后一步不是直接下结论说“神经网络精度最高”,而是要设计一套互相印证的验证流程。这能让你的课设论文从“做了三个方法”上升到“深入理解了三种估计哲学”的高度。

我建议做这三个交叉验证:第一,取同一个坏数据污染场景,同时跑 WLS 和 WLAV,画出各母线电压幅值偏差曲线,你会发现偏差的分布形状完全不一样——WLS 是坏数据附近母线集体偏移,WLAV 是只有坏数据自身孤立,这种可视化直接支撑了鲁棒性对比的结论。第二,把 WLS 的收敛后的状态量当作伪真值,用雅可比矩阵计算量测残差的标准差,和神经网络训练时的输入噪声水平对齐,这样神经网络训练的仿真数据就有了一致性基础。第三,用神经网络在测试集上预测状态量,把它作为 WLS 迭代的初始值而不是平启动,通常能省掉 1~2 次迭代,这算是对三种方法协同性的一种验证。

这个思路背后是要学会不迷信任何一个实验结果。某个方法的表现在单一算例上领先,不代表它在所有工况下都领先。很多答辩中被问倒的同学,正是因为只给了一个负荷水平的对比表格,却没有说明这个负荷水平在训练集、测试集、运行区间的百分位在哪里。你在报告中一次性给出:正常负荷、1.2 倍重负荷、N-1 拓扑变更三个场景下的对比表,答辩的可信度完全不一样。

从实操角度提醒一句:Matlab 里跑完 WLS 和 WLAV 后,要习惯性清理工作区变量再用tic/toc计时,否则 MATLAB 的 JIT 加速会把第二次测试的时间压得异常低,你的运行时间对比就不真实了。我在做这个题目时干过这种“先快后慢”的乌龙,被导师一眼看出来计时逻辑有问题。

这一套组合方案做完,你对状态估计的认知会全面很多。哪怕最终毕业答辩只是挑了其中一个方法做展示,其他两个也完全能作为扩展方向的问答储备。希望这篇笔记帮到你,少走几段弯路,把那点硬骨头啃下来。

本文还有配套的精品资源,点击获取

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

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

立即咨询