新闻详情

新闻详情

首页 / 资讯中心 / 详情

微电网多目标优化调度:NSGA-III算法与Matlab实现

发布时间:2026/9/28 14:05:43来源:尧图网络
微电网多目标优化调度:NSGA-III算法与Matlab实现
做微电网优化调度这几年我最大的感触是很多人一上来就习惯把多目标问题“压扁”成单目标——经济成本乘个权重、碳排放再乘个权重加起来当总目标去优化。结果呢权重系数全靠试今天调出个成本低的方案明天换个权重曲线又完全不一样根本说不清楚哪个解真正满足工程需求。后来我把目光转到NSGA-III算法上用Matlab从零搭了一套微电网多目标优化调度的完整代码这才算把问题看清楚了。这篇文章我就把整个思路和踩过的坑完整梳理一遍。内容包括微电网优化调度的数学模型该怎么建、NSGA-III相比NSGA-II到底强在哪、Matlab代码的核心模块怎么组织、算例结果怎么解读以及我在实践中遇到的几个典型问题和修法。适合正在做微电网动态调度、多目标进化算法应用的研究生和工程师参考也适合刚接触这类问题的同学建立整体认知。1. 微电网调度的数学模型不是越多越好而是约束要闭环1.1 目标函数怎么定经济、环保、运行品质一个都不能少微电网调度本质上是一个“在满足供需平衡和机组运行约束的前提下让多个性能指标同时尽可能好”的优化问题。以典型的风光柴储微电网为例系统包含光伏PV、风电WT、柴油发电机DG、储能电池BESS和与主网的交互联络线。调度周期一般取24小时步长1小时每个时段都要决定柴油机发多少电、储能充还是放、跟电网买电还是卖电。目标函数的选择要贴合实际工程关注点我常用三个第一个是经济性目标涵盖燃料成本、启停成本、运行维护成本、购售电成本和储能损耗成本。柴油机的燃料成本通常用二次函数拟合C_fuel(t) a·P_DG²(t) b·P_DG(t) c运维成本按出力线性比例折算购电成本按分时电价计算售电收入作为负成本计入。把这些逐时段累加就是总运行成本。第二个是环保性目标主要是碳排放量最小化。柴油发电机单位出力对应固定的碳排放系数外购电则根据电网平均排放因子折算E_CO2 Σ [e_DG · P_DG(t) e_grid · P_buy(t)]第三个目标很多人会选“系统运行平稳性”也就是与主网交互功率的波动最小化或者系统净负荷的方差最小。这个指标反映了调度方案对电网的友好程度实际并网项目里经常作为硬性约束但在优化模型里作为目标更有指导意义。这三个目标在数学上是相互冲突的要降低碳排放就得少用柴油机多用储能和购电但分时电价高峰期购电成本又高要削峰填谷就得频繁充放储能这会带来储能寿命损耗和能量损失。这种冲突恰恰是多目标优化的价值所在——不需要人为设定权重而是让算法找出整个Pareto前沿上的解最后由决策者根据场景选择倾向性方案。1.2 约束条件必须闭环少一条都会让调度方案“物理上不可行”目标函数定义好了约束条件才是真正决定模型质量的部分。我总结了一套闭环约束体系缺一不可功率平衡约束是最基本的每个时段都必须满足P_PV(t) P_WT(t) P_DG(t) P_BESS(t) P_buy(t) P_load(t) P_sell(t)这里P_BESS为正表示放电为负表示充电。购电和售电不能同时发生这是通过约束条件保证的互补关系。柴油机约束包括出力上下限和爬坡速率限制P_DG_min ≤ P_DG(t) ≤ P_DG_max-ΔP_DG_down ≤ P_DG(t1) - P_DG(t) ≤ ΔP_DG_up爬坡约束非常关键我见过不少论文模型里省略了它实际调度中柴油机根本无法瞬时从一个出力跳到另一个出力这样算出来的方案拿到现场根本执行不了。储能约束包括充放电功率限制和SOC状态递推关系SOC(t1) SOC(t) - (P_BESS(t)·Δt)/E_ratedSOC_min ≤ SOC(t) ≤ SOC_max-P_BESS_max ≤ P_BESS(t) ≤ P_BESS_max注意充放电效率问题实际模型中充电时SOC增量要考虑效率η_ch放电时SOC减量要考虑1/η_dis。这个细节如果忽略算出来的SOC轨迹和真实系统的偏差会随着调度周期拉长而明显放大。与主网交互约束包括联络线传输功率上限以及购售电功率分别的上下限。最后还有调度周期始末SOC一致的约束——储能一天的起止电量要相等否则第二天无法延续调度这个约束我称之为“日闭环约束”对多日连续优化尤其重要。在Matlab代码里这些约束我采用“罚函数修复算子”组合处理硬性越界如功率超限直接用边界修复平衡约束的偏差量作为罚项叠加到目标函数中。这是NSGA-III这类进化算法处理约束最常用的思路后面代码部分会具体说明。2. NSGA-III的核心优势参考点如何保住解的多样性2.1 为什么NSGA-II在高维目标下会“力不从心”很多接触过NSGA-II的人会有一个直觉既然NSGA-II在多目标问题里表现不错直接拿来跑微电网调度不就行了吗我在早期也确实这么干过。但目标数一旦到3个以上NSGA-II的“拥挤距离”机制就会逐渐失效。拥挤距离是在目标空间里计算某个解周围解的密集程度然后优先保留“周围比较空旷”的解。这个思路在二维目标空间里很直观——两个目标的时候距离计算有明确的几何意义。但目标变成3个、4个之后拥挤距离更多反映的是同一前沿层内的局部密度近似值它无法在全局上引导种群沿着所有目标方向均匀分布。结果就是种群容易在某个目标方向上扎堆其他方向几乎没有解。微电网调度恰恰是典型的三目标问题——经济、环保、平稳性。如果你用NSGA-II跑一遍大概率会看到Pareto前沿上解分布不均匀某些区域缺了一大块而且每一代运行结果波动比较大。这不是调参能解决的是机制层面的缺陷。2.2 参考点机制拆解从“疏远”到“全覆盖”的进化NSGA-III的核心改进是把拥挤距离换成了“参考点引导的选择机制”。思路其实很朴素既然希望解在目标空间里均匀分布那就先在目标空间里撒一批均匀分布的参考点然后让种群中的每个个体去“认领”离自己最近的参考点方向。筛选下一代时每个参考点方向上都尽量保留个体这样种群的分布就和参考点的分布保持一致了。参考点的生成标准做法是Das-Dennis方法在单纯形上生成N等分的网格点。比如3目标问题、每维4等分时参考点数量为C(34-1, 2)15个如果每维10等分就到了C(12,2)66个。参考点的数量直接影响多样性的精细程度也直接决定种群规模该怎么配。具体到选择过程NSGA-III的Environment Selection分这么几步第一步对父代和子代的合并种群做非支配排序得到分层的前沿面F1、F2、F3…如果前几层加起来还没填满下一代种群就全部保留直到某一层Fl加入后会超过种群规模N就从这层里挑选部分个体。第二步对种群个体做目标归一化。因为经济成本的数值可能是几十万量级碳排放可能是几百吨功率波动又是千瓦量级——三个目标量纲差异巨大不归一化就直接算“距离最近参考点”结果一定被量级最大的目标主导。归一化需要先求理想点各目标最小值和极值点再构造超平面最后用截距把目标值映射到[0,1]区间。第三步把每个个体关联到最近的参考线参考点与原点连成的射线记录每个参考点方向上的个体数量“小生境计数”。第四步从Fl层中逐个挑选个体优先选择小生境计数最少的参考点方向上的个体如果某个方向上已经有多个个体被选中说明这个方向饱和换下一个方向。直到填满N个个体。这个过程好比在一片水域里撒了一张均匀的渔网每条鱼都认领一个网眼筛选时保证每个网眼里尽量有鱼而不是让所有鱼都挤在同一个网眼里。这张“渔网”就是参考点分布它就是NSGA-III破解高维目标多样性困境的关键。2.3 主流多目标算法横向对比算法多样性保持机制在3目标问题上的表现微电网场景适用性NSGA-II拥挤距离高维下分布不均可以跑但解分布差MOPSO外部档案网格距离指标选择压力不足收敛快但易早熟SPEA2密度估计K近邻计算量偏大不推荐大种群NSGA-III参考点小生境高维分布性好本文选择稳定可靠这四种算法我都实际跑过微电网调度算例NSGA-III在解的分布均匀性和收敛性平衡上综合表现最好尤其适合三目标及以上问题。如果你的场景只有两个目标比如只看经济性和碳排放NSGA-II也许够用一旦把运行平稳性、新能源消纳率等目标加进来直接上NSGA-III更省心。3. Matlab实现编码设计、算子选择和关键代码段3.1 决策变量编码实数编码一维数组代表完整调度计划先把决策变量想清楚。我的做法是把整个调度周期所有决策变量拼成一个实数向量x [P_DG(1..24), P_BESS(1..24), P_buy(1..24)]长度为723个变量×24时段。P_sell不单独设变量通过功率平衡方程推导出来——当总发电大于负荷时剩余部分就是售电前提是联络线功率约束满足。这样设计的好处是减少了决策变量维度避免购电和售电同时为正造成的变量冗余和约束冲突。种群初始化时对每个个体在变量上下界内生成随机实数。但你直接生成完全的随机个体大概率不满足功率平衡约束。我的经验是先随机生成柴油机出力和储能力然后用功率平衡方程反推出购电/售电功率如果超出联络线上限就回头调整储能力度。这个过程相当于在初始化阶段做一次“物理可行性修正”后续算法的搜索起点质量会高很多。3.2 主循环结构遗传算子和NSGA-III选择机制的配合主循环的骨架如下function [bestPop, bestFront] nsga3_microgrid(params) % 初始化种群 pop initPopulation(params); % 主循环 for gen 1:params.maxGen % 计算目标函数值带约束罚项 fitness evaluateFitness(pop, params); % 父代选择二元锦标赛 parentIdx tournamentSelection(fitness, params.tournamentSize); % 交叉与变异生成子代 offspring geneticOperators(pop(parentIdx, :), params); % 合并父代与子代执行NSGA-III环境选择 combinedPop [pop; offspring]; combinedFitness evaluateFitness(combinedPop, params); pop environmentSelection(combinedPop, combinedFitness, params); end % 返回最终种群和Pareto前沿 end这里有个细节值得提醒每代都重新评估合并种群的目标值而不是缓存上次结果。虽然多算了计算量但在约束罚函数模式下某些个体在不同代之间的适应度可能因为种群结构变化而微调重新计算避免了脏数据问题。3.3 参考点生成与归一化代码只有几行但细节决定成败参考点生成的Matlab代码并不复杂3目标情况下用三重循环即可function refVectors generateReferenceVectors(H, M) % H: 每维等分数M: 目标数本实现针对M3 refVectors []; for i 0:H for j 0:(H - i) k H - i - j; if k 0 refVectors [refVectors; i/H, j/H, k/H]; end end end refVectors refVectors ./ sum(refVectors, 2); % 归一化到单纯形 end调用时H取10得到refVectors是66×3的矩阵。每个参考点代表目标空间中的一个期望分布方向。归一化部分是我踩坑最多的区域先给一个工程上稳定的版本function [normObj, zMin] normalizeObjectives(objVal) % objVal: N×M当前种群的目标函数值 N size(objVal, 1); M size(objVal, 2); zMin min(objVal, [], 1); % 理想点平移 shiftedObj objVal - zMin; % 用最大值为极值点的近似构造归一化分母 zMax max(shiftedObj, [], 1); zMax(zMax 1e-6) 1e-6; % 防止除零 normObj shiftedObj ./ zMax; end严格来说NSGA-III的归一化应该用极值点构造超平面后计算截距而不是直接除以最大值。但在某些目标退化或者前沿形状不规则时超平面构造会失败标准库的实现会fallback到“除以最大值”策略。我在实际代码里干脆先用简化版做稳定兜底等跑通了再换严格的截距归一化——这个坑后面专门讲。3.4 环境选择的核心逻辑分层、关联、小生境保选环境选择是整个NSGA-III的心脏代码逻辑可以浓缩为function newPop environmentSelection(pop, fitness, params) N params.popSize; % 非支配排序 [fronts, ~] nonDominatedSort(fitness); newPop []; lastFrontIdx 0; for i 1:length(fronts) if size(newPop, 1) length(fronts{i}) N newPop [newPop; pop(fronts{i}, :)]; else lastFrontIdx i; break; end end if size(newPop, 1) N return; end % 从临界层挑选个体 lastFrontMembers pop(fronts{lastFrontIdx}, :); lastFrontFitness fitness(fronts{lastFrontIdx}, :); selected nichingSelection(newPop, lastFrontMembers, lastFrontFitness, params, N); newPop [newPop; selected]; endnichingSelection这一步就是前文提到的归一化当前所有候选个体的目标值计算它们与参考点之间的“垂直距离”把个体关联到最近的参考点方向再统计每个参考点方向上的小生境计数优先选择小生境计数为0的方向上的个体。具体实现代码较长核心逻辑是function selected nichingSelection(newPop, candPop, candFit, params, N) % 1. 合并当前被选个体和候选个体做归一化 allFit [fitness(newPop); candFit]; [normFit, zMin] normalizeObjectives(allFit); % 2. 计算每个个体到每条参考线的距离 distances zeros(size(normFit, 1), size(params.refVectors, 1)); for i 1:size(normFit, 1) for j 1:size(params.refVectors, 1) distances(i, j) norm(normFit(i, :) - dot(normFit(i, :), params.refVectors(j, :)) * params.refVectors(j, :)); end end % 3. 每个个体关联到最小距离的参考点 [~, associatedRef] min(distances, [], 2); % 4. 小生境选择优先保留稀疏参考方向上的候选个体 % ...此处省略具体筛选循环 end这里强调一个效率问题两层循环计算距离在种群规模200、参考点66、迭代300代的情况下总计算量级在千万次Matlab跑起来大约一分钟左右还在可接受范围。如果你的目标数达到5个以上、参考点数量上千就必须用矩阵化写法替代循环不然速度会很难看。4. 算例跑起来参数怎么设、结果怎么看、折衷解怎么选4.1 算例数据准备现实数据不完美但要合理我用的是一个典型日场景数据风电和光伏出力曲线来自某微电网示范项目的实测数据负荷曲线参考该地区的典型日负荷分时电价采用峰平谷三段式。数据要归一化好再进入模型但注意目标函数计算时必须还原到实际单位否则成本数量级的物理意义就丢了。时段负荷(kW)光伏(kW)风电(kW)电价(元/kWh)00:00-06:00280-320080-1100.25谷06:00-12:00320-45050-28060-900.55平12:00-18:00400-480220-30070-1000.85峰18:00-24:00350-4200-6080-1050.55平柴油机额定功率200kW下限30kW爬坡限制±50kW/h储能额定容量200kWh最大充放电功率50kWSOC范围0.1~0.9始末SOC都为0.5。联络线功率上限100kW。4.2 参数配置的心得不是越大越好是匹配才好NSGA-III的种群规模和参考点数量要匹配。参考点数量为C(MH-1, H)3目标下H12时参考点为91个种群规模取92或184比较合适——比参考点多一点点保证每个参考点方向理论上都能分到一个个体。我常用的配置如下参数推荐值说明种群规模 N184略大于参考点数量91最大迭代数 maxGen300更复杂模型可加到500每维等分数 H12参考点数量C(14,2)91交叉概率 CR1.0NSGA-III标准SBX全交叉SBX分布指数 eta_c20值大则子代更接近父代变异概率 MR1/nVar每个变量位的变异概率多项式变异指数 eta_m20值小则变异扰动更大迭代数不是越大越好。我对比过500代和1000代的结果Pareto前沿的HV指标提升不到3%但运行时间翻倍。微电网调度模型本身目标函数计算不重300代已经能收敛稳定500代可以留给论文场景作为“充分收敛”的论证。4.3 结果解读Pareto前沿和折衷解跑完之后你会得到一个184×72的种群和对应的184×3目标矩阵。把三目标画成三维散点图能直观看到Pareto前沿的曲面形态。正常情况下前沿在成本-碳排放-波动三个方向上都应该铺开没有明显的“缺角”。从中选折衷解我用的方法是模糊隶属度法对每个解在每个目标上计算隶属度所有目标隶属度的加权平均值最大的解就是折衷解。在第i个解中第j个目标的隶属度定义为μ_ij (f_j_max - f_ij) / (f_j_max - f_j_min)综合隶属度μ_i (1/M) · Σ μ_ij然后选μ最大的解。这个方法的好处是不需要人为设定权重纯粹根据解在Pareto前沿上的相对位置自动选出“各方面都不算太差”的方案工程上很实用。在我这个算例中折衷解的总成本约为1860元碳排放量约为214kg功率波动指标约8.6。对比单目标优化只用经济性目标跑出来的最低成本方案约1700元折衷解多花了约9%的成本换来了碳排降低约16%、波动降低接近30%这就是多目标优化的价值体现告诉决策者每一项性能提升需要付出的代价。4.4 典型调度方案的特征储能“低充高放”、柴油机“避峰出力”看一眼折衷解对应的调度曲线规律非常清晰柴油机在电价低谷时段维持基础出力在电价高峰时段增加出力储能从凌晨低谷时段开始充电白天光伏出力高峰期也充电到晚间电价峰值时段集中放电。整个过程完全符合“低充高放”和“柴油机避峰运行”的工程直觉。这种调度方案不需要人工指定规则纯粹是算法在目标函数和约束条件的驱动下自己找出来的这正是基于优化的调度方法相比规则查找法最核心的优势。5. 我踩过的坑NSGA-III在微电网调度里最容易翻车的四个地方5.1 参考点总数和种群规模不匹配导致“选择压力失衡”第一次跑NSGA-III时我用H15生成参考点3目标下参考点数量为C(17,2)136种群规模打算设80。跑出来的结果前沿分布惨不忍睹——大量解集中在一个角落。原因后来想明白了种群规模远小于参考点数量时每个参考点方向平均分不到一个个体小生境选择机制会极度偏向“多覆盖方向”导致很多方向只保留了一个个体收敛压力大幅下降前沿整体偏散。修法很简单通过C(MH-1, M-1)计算参考点数量然后让种群规模取参考点数量的1~2倍。我做了一个辅助函数根据H自动推荐N避免再次手滑。5.2 归一化退化目标量纲差异过大时的“假收敛”微电网的三个目标量纲差距极大——成本上千、碳排几百、功率波动可能是个位数甚至小数。如果不做归一化直接关联参考点垂直距离会被成本方向的数值主导其他方向几乎不参与选择。更麻烦的是当某个目标在所有个体上取值几乎相同时极值点无法构造有效的超平面严格的截距归一化会直接报错或返回NaN。我的处理策略是双保险主归一化用理想点平移极值点截距法检测到截距为负或接近无限时自动fallback到“除以目标最大值”的简化模式并在运行日志里输出警告。这样保证了任何一代种群都不会因数值问题中断。5.3 储能SOC修复合法的选择罚函数还是强制修正约束SOC上下限时很多人喜欢在目标函数里加罚项让越界个体自动淘汰。但我发现SOC约束如果只用罚函数算法会花费大量搜索预算在“SOC略微越界但目标函数很优秀”的个体上——因为这种个体成本低罚得不重的时候照样能通过后代传递基因导致最终结果中很多解SOC越界。我改成强制修正法交叉变异生成子代后立即检查SOC轨迹若某时段越界则截断越界值并重新计算succeeding时段的SOC保证个体一定满足约束。这等于在遗传算子后面加了一个“结构修复器”从机制上消除了不可行解。代价是个体的搜索自由度变小但换来的是最终所有解都物理可行这对工程报告来说太重要了。5.4 判断收敛不能只看“迭代曲线平稳”经常有同学贴出来一张迭代收敛曲线说“我的算法收敛了”——实际上那个曲线是每一代Pareto前沿的平均目标值它平稳只说明目标均值不再大幅变化不代表前沿还在继续扩展或均匀化。稳妥的做法是计算两个性能指标HVHypervolume超体积指标和IGDInverted Generational Distance反向代际距离。HV越大说明前沿覆盖和收敛综合越好IGD越小说明前沿与真实Pareto前沿的贴合度越高。每周跑完后记录这两个指标随迭代数的变化等HV曲线“平台化”了才说明算法真正收敛。计算真实Pareto前沿如果不知道真值可以用本算例的历史最佳前沿多次独立运行后取所有解的并集再非支配排序近似替代这个做法叫参考前沿近似在工程论文里是可以接受的。6. 从单日调度到更复杂场景扩展思路与实操建议如果你已经跑通了这个基础版本下一步的扩展方向比较灵活我根据自己的经验给三个建议。第一个方向是做“多目标对比实验”。拿NSGA-III的结果和NSGA-II、MOPSO的结果放在一起用HV和IGD做定量对比再配合三维前沿图看分布差异。这是论文里最有说服力的部分也是检验你自己代码实现是否正确的标准——如果NSGA-III在三目标问题上和NSGA-II拉不开差距大概率是选择机制的某一步写错了。第二个方向是引入不确定性。光伏和风电出力的随机性可以通过鲁棒优化场景集来处理。具体做法对每个预测出力场景都做功率平衡校验目标函数里考虑最劣场景下的表现。这个扩展会让计算量大幅上升但对实际工程的意义很大。第三个方向是把调度周期从日扩展到多日。此时“日闭环约束”变成“多日连续SOC跟踪”需要把决策变量周期拉长到72小时甚至更长种群规模需要适当增大参考点数量不用变。多日调度能避免每日边界上的SOC“急刹车”方案更贴近实际运行。我个人的体会是NSGA-III在微电网调度这个问题上很“皮实”核心代码一旦调通扩展目标数、增加约束、改算例数据都是增量工作不需要动算法主体。最后分享一个调试小技巧——我把每一代的环境选择结果都存了一个快照包括前沿层数、小生境计数分布图这些中间变量一旦结果异常可以回放定位是在哪一步出的偏差。这一步在早期调通算法的阶段几乎能帮你省出一半的纠错时间。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

YOLO小数据集实战:1531张罐头与鲜奶瓶检测全流程 2026/9/28 14:53:52

YOLO小数据集实战:1531张罐头与鲜奶瓶检测全流程

简介:本资源为面向YOLO系列算法目标检测的罐头与瓶子数据集,包含鲜奶、瓶子等类别,适合从事目标检测模型训练与验证的开发者、学生及研究人员使用。数据集已划分好训练与测试集,并附带data.yaml配置文件,可直接适配yol…

阅读更多 →
YOLO小样本实战:1531张鲜奶罐头瓶子数据集训练与部署避坑指南 2026/9/28 14:53:52

YOLO小样本实战:1531张鲜奶罐头瓶子数据集训练与部署避坑指南

简介:本资源为面向YOLO系列目标检测算法的罐头与瓶子图像数据集,适用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流框架,可直接用于模型训练与验证测试,适合从事食品包装检测、工业质检或相关课题研究的学习者与开发者…

阅读更多 →
夸克文件工具实操:从备份压缩到搜索整理的完整指南 2026/9/28 14:53:52

夸克文件工具实操:从备份压缩到搜索整理的完整指南

1. 夸克文件工具到底解决了什么问题先说个我自己的真实场景。手机里存了两万多张照片,微信文件永远处于"满"的状态,工作资料散落在微信、钉钉、邮件、U盘四个地方。每次要找一份半年前的合同,都得先回忆"当时是哪台电脑发给我…

阅读更多 →
PSCAD仿真220kV空载线路操作过电压与MOA避雷器限压分析 2026/9/28 14:53:51

PSCAD仿真220kV空载线路操作过电压与MOA避雷器限压分析

前阵子接了一个220kV输电线路过电压分析的仿真需求:线路不挂负载,就专看合空线和切空线时的暂态过电压,再评估装避雷器(MOA)后的限压效果。这种工况在电力系统高电压方向很常见,论文里写、设计院里算、设备…

阅读更多 →
RK3576开发板搭载ROS2实战:GLIBCXX缺失与交叉编译工具链完整指南 2026/9/28 14:53:51

RK3576开发板搭载ROS2实战:GLIBCXX缺失与交叉编译工具链完整指南

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

阅读更多 →
四级翻译“建造”主题全解析:赵州桥真题与时态技巧 2026/9/28 14:53:33

四级翻译“建造”主题全解析:赵州桥真题与时态技巧

12月那场四级考完,走出考场还没到宿舍,就有学生跑来问我:“老师,那座桥到底怎么翻啊?我全程都在build,后面又改成construction,感觉哪个都不太对。”当时我就知道,第一套卷那道关于“…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉