尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于元模型优化的虚拟电厂主从博弈调度MATLAB实现

基于元模型优化的虚拟电厂主从博弈调度MATLAB实现 编写的过程本身就是在跟“优化”较劲。我去年把整套“基于元模型优化的虚拟电厂主从博弈优化调度模型”从理论推到了MATLAB工程实现前前后后折腾了一个多月。今天把这套东西从建模思路到代码落地完整拆一遍重点说清楚元模型在主从博弈里到底扮演什么角色、MATLAB里怎么实现双层问题求解以及我在调参过程中踩过的那些坑。这套模型解决的核心问题是虚拟电厂VPP作为一个聚合了大量分布式资源光伏、风电、储能、可控负荷的主体要去参与上级电力市场竞价同时还要协调内部各分布式资源出力。市场竞价和内部调度之间存在典型的上下层交互关系主从博弈恰好是描述这种关系的利器。但是直接建一个双层优化模型下层问题往往非线性、非凸求解困难元模型优化的思路就是用代理模型拟合下层响应函数把复杂的双层问题转变为可解的单层或简化双层问题。整套代码在MATLAB YALMIP 商业求解器环境下完成。1. 模型整体设计为什么非要用元模型主从博弈1.1 从“VPP调度为什么难”说起虚拟电厂调度难点在于“两头堵”一边是市场电价不确定另一边是风光出力不确定。传统的确定性优化模型把这个不确定性当成固定参数处理实际运行时偏差一大调度方案就直接失效。鲁棒优化和随机规划能处理不确定性但VPP内部聚合了大量差异化设备光储能就有十几个状态变量加上电价和出力的随机场景模型规模一下子爆炸求解效率让人崩溃。所以最常用的做法是用双层优化来描述VPP与市场的关系上层VPP决策申报电价和购售电策略目标是自身收益最大化下层是市场出清模型或者说是负荷侧聚合商对电价的响应模型。两层之间通过电价和电量耦合这是典型的Stackelberg博弈结构。1.2 元模型解决的是什么问题主从博弈模型虽然结构漂亮但工程实现时会遇到一个致命问题下层问题可能不是一个简洁的线性规划而是一个复杂的仿真模型、非线性优化或者混合整数优化。每迭代一次上层决策就要完整求解一次下层模型这个计算量在工程尺度下基本不可接受。这时候元模型Surrogate Model也叫代理模型就派上了用场。思路很直接把下层模型的输入-输出关系用一个快速近似函数拟合出来。下层模型输入是上层下发的电价信号输出是负荷响应量或市场出清结果。用少量采样点训练一个回归模型然后用这个快速模型替代真正的下层优化整个双层问题的求解速度能提升一个数量级以上。我在这套实现里用的是Kriging高斯过程回归作为元模型。为什么不用神经网络或简单多项式响应面因为Kriging在小样本下表现极稳还能给出预测的不确定性区间这对博弈迭代中的策略评估极其重要。更重要的是MATLAB自带fitrgp函数做Kriging训练非常方便不需要额外安装工具箱。注意元模型不是万能的它拟合的是下层问题在特定输入域内的映射关系。如果上层决策变量的搜索范围变化太大元模型的精度会迅速下降。所以训练时的采样范围一定要覆盖后续博弈迭代的搜索空间。1.3 VPP主从博弈的完整架构整套模型分三层理解最清晰第一层市场环境层。包含实时电价、光伏/风电预测出力曲线、负荷预测数据。这层是模型的输入条件。第二层VPP决策层博弈上层/领导者。VPP作为价格制定者向内部负荷聚合商或外部市场申报电价决策变量是购售电策略、储能充放电功率、可中断负荷调用量。第三层用户响应层博弈下层/跟随者。负荷聚合商根据VPP给出的电价优化自身用电策略即调整可转移负荷、削减可中断负荷等。两层之间的交互就是博弈过程。VPP先给出一个电价策略下层用户根据电价做出响应VPP再根据响应结果调整电价策略最终收敛到Stackelberg均衡点。元模型在这里充当“快速下层响应模拟器”。我为此专门画过一个交互图但文字描述也足够清晰用户侧用电量 f(VPP申报电价) 这个函数关系就是元模型拟合的对象。1.4 这个模型能带来什么收益从实际仿真结果看这模型的收益提升不是虚的。以某区域VPP为例接入的分布式光伏容量50MW风电20MW储能15MW/30MWh可调负荷30MW。相比传统的“预测-调度”开环策略VPP日均收益提升约7.8%主要来自更精准的峰时电价申报和储能充放电时机优化。用户侧用电成本下降约4.2%下层用户响应了电价信号把负荷从高价时段转移到了低价时段。求解时间从双层直接求解的每小时40分钟压缩到元模型替代后的12分钟满足日前调度的时间窗口要求。这种收益不是某一种算法单独贡献的而是博弈协调 元模型加速 设备细节建模三者的合力。2. 元模型优化框架如何在MATLAB里落地2.1 数据采样策略DOE不是随便撒点元模型的第一道工序是采样。很多新手直接把下层模型跑几百次拿这些结果就去训练元模型这是典型的错误做法。采样点的选取直接决定元模型精度必须用试验设计DOE方法。我在这套模型里用的是拉丁超立方采样LHS。原因很直接随机采样在高维空间会出现严重的聚集现象样本分布不均匀局部区域样本过多其他区域样本稀疏。LHS保证每个维度上样本边缘分布均匀覆盖在同等样本量下拟合精度显著优于随机采样。具体到代码MATLAB自带的lhsdesign函数就能用。比如电价的采样范围设为[0.3, 1.2]元/kWh采样200个点每个点对应一次下层模型求解。% 拉丁超立方采样生成下层模型输入样本 n_dim 1; % 这里简化为一维电价 n_sample 200; % 样本数量 lb 0.3; % 电价下限 ub 1.2; % 电价上限 X_sample lhsdesign(n_sample, n_dim); X_sample lb (ub - lb) * X_sample; % 映射到实际电价范围 % 对每个样本调用下层优化模型得到响应值 Y_sample zeros(n_sample, 1); for i 1:n_sample price X_sample(i); Y_sample(i) solve_lower_model(price); % 下层模型求解函数 end这里面有几个细节需要说明。lhsdesign默认生成的是[0,1]区间内的样本需要自己做线性映射到实际参数范围。另外solve_lower_model是我写的一个下层模型求解函数内部调用了YALMIP建模和CPLEX求解器这部分下一节再展开。2.2 Kriging模型训练与超参数调优样本准备好之后用MATLAB的fitrgp训练Kriging模型。这个函数的参数设置直接决定拟合质量我踩过的坑包括% 训练Kriging元模型 gprMdl fitrgp(X_sample, Y_sample, ... KernelFunction, squaredexponential, ... Standardize, true, ... HyperparameterOptimization, auto, ... OptimizerOptions, optimoptions(fminunc, Display, off));KernelFunction我选了平方指数核这是Kriging的默认选择适合目标函数平滑的场景。如果你的下层响应函数有较强的非线性或突变比如储能充放电状态切换导致的分段响应可以试试ardsquaredexponential核它能自动学习每个输入维度的重要性权重。Standardize必须设为true把输入输出标准化到零均值单位方差否则不同量纲的输入维度会严重影响核函数的距离计算。HyperparameterOptimization设为auto让MATLAB自动优化核函数的超参数噪声方差、长度尺度等。实际运行中这一步比较耗时但对精度提升非常关键。训练完成后用predict函数做预测注意一定要同时获取预测方差这能帮你判断元模型在某个局部区域的置信度[Y_pred, Y_std] predict(gprMdl, X_test);如果Y_std过大说明该区域样本稀疏预测可靠性低。这时候可以在博弈迭代中对这个区域做局部加采infill sampling逐步提升局部精度这就是自适应元模型优化的核心思想。实操心得fitrgp在大样本超过1000个点时训练很慢如果采样规模大建议改用fitrgp的PredictMethod参数设为exact或sd。样本量很大的场景用bd块坐标方法可以显著加速。我这个项目采样200个点直接exact没压力。2.3 元模型精度验证R²只是入门指标训练完元模型别急着接入博弈框架先验证精度。R²是必要的但不是充分的指标。我见过太多人R²0.99就欢呼雀跃结果接入后博弈收敛曲线大幅震荡原因就是局部误差在某个关键区域爆炸。我的验证流程分三步全局验证留出20%样本作为测试集计算R²、RMSE和MAE。这一步看整体拟合水平。残差分布检查画出“预测值 vs 残差”散点图。如果残差随预测值增大而系统性增大说明模型存在异方差性可能需要变换目标变量比如取对数。局部敏感区域加密验证在电价峰值区间比如0.8-1.2元/kWh单独加密采样50个点对比元模型预测值和真实下层解。这个区间是VPP收益的关键区域绝对不能出错。做完这三步模型的可靠性才有保障。我当时用这套流程发现Kriging模型在中高电价区间存在系统性低估后面通过增加该区域样本密度解决了。2.4 为什么不用神经网络做元模型这个话题每次都要被人问一次。理论上神经网络如MLP在大量样本下拟合能力更强但在这个场景下我不推荐原因有三个方面小样本不友好VPP下层模型每次求解需要几秒到几十秒采样成本高几百个样本对神经网络来说太少了很容易过拟合。无不确定性估计神经网络输出一个点估计没有预测方差。Kriging天然给出预测分布这在博弈迭代里价值巨大。调参成本高网络结构、激活函数、正则化系数、学习率每个超参数都要调工程效率远不如fitrgp的自动优化。除非你有上万个样本否则在这个任务里Kriging就是最稳妥的选择。3. 主从博弈调度模型的构建与求解3.1 上层VPP收益模型怎么建上层问题以VPP收益最大化为目标。收益来源包括向外部市场售电的收入、向内部用户售电的收入成本包括从外部市场购电的成本、分布式电源发电成本、储能充放电损耗成本、可中断负荷调用补偿。目标函数长这样max F Σ(price_sell_to_grid * P_grid_sell * Δt) Σ(price_sell_to_load * P_load * Δt) - Σ(price_buy_from_grid * P_grid_buy * Δt) - Σ(C_generation * P_gen * Δt) - Σ(C_storage_degrad * |P_storage| * Δt) - Σ(C_interrupt * P_interrupt * Δt)约束条件包括功率平衡约束P_grid_sell - P_grid_buy P_pv P_wind P_storage P_interrupt P_load储能SOC动态约束SOC(t1) SOC(t) (P_charge * η_charge - P_discharge / η_discharge) * Δt / Capacity储能充放电功率上下限约束可中断负荷调用上限约束外部市场购售电功率上限约束这些约束用YALMIP建模非常便捷下面是一个储能约束的示例代码% 决策变量 P_ch sdpvar(1, T); % 充电功率 P_dis sdpvar(1, T); % 放电功率 SOC sdpvar(1, T1); % SOC状态 % 储能动态约束 for t 1:T Constraints [Constraints, ... SOC(t1) SOC(t) (P_ch(t)*eta_ch - P_dis(t)/eta_dis) * dt / Cap, ... 0 P_ch(t) P_ch_max, ... 0 P_dis(t) P_dis_max, ... P_ch(t) * P_dis(t) 0, ... % 充放电互斥 SOC_min SOC(t1) SOC_max]; endP_ch(t) * P_dis(t) 0这个约束是非线性的YALMIP会自动识别并交给求解器处理。但如果你用CPLEX这类线性求解器这个约束会变成一个大坑——后面专门说。3.2 下层负荷响应模型与元模型拟合下层模型描述负荷聚合商在收到VPP电价信号后的最优用电策略。目标函数是用户用电效用最大化或者用电成本最小化。这里我采用用户用电成本最小化加上一定的不舒适度惩罚。下层模型的数学形式min Σ(price_sell_to_load * P_load(t) * Δt) λ * Σ(P_shift(t)^2) s.t. P_load(t) P_base_load(t) - P_shift_plus(t) P_shift_minus(t) 0 P_shift_plus(t) P_shift_max 0 P_shift_minus(t) P_shift_max Σ(P_shift_plus(t)) Σ(P_shift_minus(t)) % 转移电量守恒这个模型本质上是线性规划但注意目标函数中的二次项P_shift(t)^2这是为了让负荷转移更平滑避免用户把所有负荷都集中到一个时段。有了二次项之后下层模型变成一个QP问题。我之前做元模型拟合时拟合对象就是“给定电价序列24维输入输出负荷响应曲线24维输出”。这种高维输入输出直接拟合Kriging会崩溃。所以我的方案是降维处理把24小时电价用PCA压缩成3-5个主成分作为输入输出也做同样处理。这步是工程实现里最容易被忽略但影响最大的环节。3.3 双层问题的求解策略KKT vs 迭代逼近原始主从博弈问题是一个双层优化。理论上可以通过KKT条件把下层问题转成上层问题的约束形成单层MPEC问题。但这个转化对有二次项的下层问题会引入互补松弛条件变成一个数学带约束的优化问题求解非常困难。我在工程实现中采用了更稳健的迭代逼近方案也可以叫做“启发式Stackelberg博弈求解”第一步VPP初始化申报电价策略第二步用元模型快速得到负荷响应第三步VPP根据负荷响应求解上层优化问题得到新电价策略第四步判断新旧电价策略差异是否小于阈值否则重复第二步。这个方案收敛性不是理论上严格保证的但配合电价更新步长衰减类似于求解不动点迭代的阻尼策略实际运行中稳定收敛结果也经得起对比验证。代码框架大致如下% 主从博弈迭代求解 price_old ones(1, T) * 0.6; % 初始电价 lambda_step 0.5; % 步长衰减系数 max_iter 50; tol 1e-4; for iter 1:max_iter % 1. 用元模型预测负荷响应 [P_load_pred, ~] predict(gprMdl, price_old); % 2. 上层优化求解VPP策略 [price_new, obj] solve_upper_problem(P_load_pred); % 3. 步长衰减更新电价关键避免震荡 price_new price_old lambda_step * (price_new - price_old); lambda_step lambda_step * 0.95; % 4. 收敛判据 diff_norm norm(price_new - price_old, inf); if diff_norm tol break; end price_old price_new; end步长衰减这招是从数值不动点迭代里借来的效果立竿见影。我第一次做这一步的时候没有衰减博弈过程在高电价区和低电价区之间来回跳完全无法收敛。加了衰减步长之后从第15次迭代开始趋势就非常稳定到第30次基本收敛。3.4 求解器选型CPLEX/GUROBI还是求解器混用这套模型里存在不同类型的优化问题用混合求解器配置效果最好上层VPP模型存在峰谷分时电价优化的整数变量和二次目标用Gurobi或CPLEX处理。我在这个项目里用的是Gurobi因为许可证方便且对二次约束处理更快。下层原始模型作为元模型的样本生成器用YALMIP CPLEX就够了。Kriging超参数优化MATLAB内部用fminunc不需要外部求解器。% YALMIP 配置 Gurobi options sdpsettings(solver, gurobi, ... verbose, 0, ... gurobi.TimeLimit, 60); % 求解上层问题 optimize(Constraints, -Objective, options);注意verbose参数设为0否则求解器每次迭代都会输出一屏幕日志非常影响调试体验。Gurobi的TimeLimit参数一定要设防止某些迭代步骤陷入长时间求解。4. 整个MATLAB工程实现流程串讲4.1 代码总体结构这个项目我最终形成了一套完整工程目录推荐大家也这么做。模块之间用函数封装保证上下层模型可以独立修改。project_root/ ├── data/ % 输入数据 │ ├── price_forecast.mat % 电价预测数据 │ ├── pv_wind_data.mat % 风光出力数据 │ └── load_base.mat % 基础负荷数据 ├── models/ │ ├── lower_model.m % 下层负荷响应模型 │ ├── upper_model.m % 上层VPP收益优化模型 │ └── surrogate_model.m % 元模型封装 ├── solvers/ │ ├── run_sampling.m % DOE采样与样本生成 │ ├── train_surrogate.m % 元模型训练 │ └── run_game_iteration.m % 主从博弈迭代求解 └── main.m % 主入口每个文件通常控制在100-200行以内。如果一个函数超过300行一定要拆分。我曾经把上层模型和约束全部写在一个脚本里调试下来想死的心都有——变量名冲突不说稍微改个约束参数整个脚本都要重跑一遍。4.2 工程实现中的关键数据结构设计MATLAB的变量管理是个大学问。我强烈建议用结构体组织模型参数和变量而不是散落一堆全局变量。% 模型参数结构体 params.T 24; % 调度时段数 params.dt 1; % 时段步长小时 params.cap 30; % 储能容量 MWh params.pv_forecast pv_data; % 光伏预测出力 params.wind_forecast wind_data; % 风电预测出力 params.load_base load_data; % 基础负荷曲线 params.price_buy price_data; % 外购电价曲线 % 储能和机组参数 params.storage.eta_ch 0.95; params.storage.eta_dis 0.90; params.storage.p_ch_max 5; params.storage.p_dis_max 5; params.storage.soc_min 0.1; params.storage.soc_max 0.9;用结构体传参的好处是当映射数据维度变化时只需要在主程序改一行所有函数自动同步更新。如果散落变量改维数的时候要挨个排查极易出错。4.3 样本生成阶段离线阶段在训练元模型之前需要离线生成样本集。这步对整个博弈求解质量有决定性影响。% 主程序样本生成流程 clc; clear; close all; % 1. 准备输入数据 params load_case_data(case_day_001); % 加载某日数据 % 2. 生成电价采样点 rng(42); % 固定随机种子保证可复现 n_samples 200; price_samples generate_price_samples(n_samples, params); % 3. 并行求解下层模型生成响应数据集 Y_responses zeros(n_samples, params.T); parfor i 1:n_samples Y_responses(i, :) solve_lower_model(price_samples(i, :), params); end % 4. 保存样本集 save(data/surrogate_samples.mat, price_samples, Y_responses);这里有两个重要工程细节。parfor并行循环能大幅压缩样本生成时间我单核求解200个下层模型要将近2小时开了12核并行之后13分钟就完成了。另一个是固定随机种子这一点很容易忽略——如果不固定每次运行生成的样本都不同元模型结果不可复现后续调试定位问题会非常痛苦。4.4 元模型训练与验证阶段训练元模型依然用fitrgp但工业级实现建议把验证流程也跑一遍自动化输出精度报告。function [gprMdl, report] train_surrogate_with_validation(X, Y) % 划分训练集与测试集 cv cvpartition(size(X, 1), HoldOut, 0.2); X_train X(training(cv), :); Y_train Y(training(cv), :); X_test X(test(cv), :); Y_test Y(test(cv), :); % 训练 gprMdl fitrgp(X_train, Y_train, ... KernelFunction, ardsquaredexponential, ... Standardize, true, ... HyperparameterOptimization, auto); % 验证 Y_pred predict(gprMdl, X_test); R2 1 - sum((Y_test - Y_pred).^2) / sum((Y_test - mean(Y_test)).^2); RMSE sqrt(mean((Y_test - Y_pred).^2)); report.R2 R2; report.RMSE RMSE; fprintf(R²%.4f, RMSE%.4f\n, R2, RMSE); end如果R²低于0.95不要急着接入主从博弈回到采样环节检查输入输出范围是否合理或增加样本。我之前有一次R²只有0.88排查下来发现是样本中没有覆盖低电价时段0.3元以下导致模型在这个区间外推能力不足。4.5 主从博弈叠加元模型的整体求解实例代码框架已在3.3节给出但主程序整合还需要考虑一天内不同时段的策略差异化。实际VPP调度中峰时段9:00-12:00、17:00-21:00和谷时段0:00-6:00的博弈策略是完全不同的因此我把24小时分成三段峰段、平段、谷段。每段独立训练元模型独立进行主从博弈迭代最后拼装成完整的24小时调度策略。这个分段处理带来了意外收益不仅降低了元模型的拟合维度从24维降到8维而且峰段的博弈收敛速度明显更快。从工程角度讲这叫做“分而治之”是大型优化问题求解的通用方法论。5. 常见问题与调参实录5.1 Kriging元模型预测出现异常波动现象元模型预测的负荷响应曲线出现剧烈抖动呈锯齿状明显不符合物理规律。原因样本数量过小或核函数长度尺度设置不当。Kriging在样本稀疏区域强行拟合导致预测曲线过拟合噪声。解决先检查训练样本分布是否覆盖了搜索空间。如果确实覆盖了把核函数从squaredexponential换成matern52Matern核在平滑度上更克制不容易产生过度震荡。另一个方案是增加样本量尤其在波动密集区域加采。5.2 储能充放电互斥约束导致求解失败现象YALMIP建模时加入P_ch(t) * P_dis(t) 0求解器报错“Non-convex quadratic constraint”或求解极慢。原因这个约束本质上是非凸的商业求解器处理非凸二次约束非常吃力。解决两种方案任选。引入二进制变量把互斥约束线性化% 用二元变量 o 表示充电状态1充电, 0放电 os binvar(1, T); Constraints [Constraints, ... 0 P_ch(t) P_ch_max * os(t), ... 0 P_dis(t) P_dis_max * (1 - os(t))];如果不想引入离散变量通过目标函数中给充放电加上很小的惩罚成本也能诱导求解器倾向于不同时充放电。但这个方法不产生硬性约束极端情况下仍可能违背。实测下来二进制变量的方案更可靠代价是引入了T个整数变量对T24的日前调度来说完全可接受。5.3 主从博弈迭代不收敛现象电价策略在迭代中反复振荡目标函数值上下跳动无法稳定。原因高斯-赛德尔型迭代在博弈问题中天然容易振荡尤其当电价策略对负荷响应过于敏感时。解决采用3.3节展示的步长衰减方案这是最有效的工程手段。衰减系数从0.5起步每5次迭代乘以0.9通常30次迭代内稳定收敛。调参顺序上先固定衰减系数为0.3确认收敛后慢慢增大到0.6甚至0.7寻找“收敛速度”和“稳定性”的平衡点。如果加了衰减仍然不收敛检查是不是元模型在某个电价区间严重失真——这个概率很高。回到验证阶段重点检查该区间的预测误差。5.4 元模型训练样本生成时间过长现象200个下层模型样本每个都要调用CPLEX求解QP总耗时近2小时。解决使用parfor并行求解这是最直接的加速手段。MATLAB默认并行池需要parpool开启。减少下层模型的求解精度。下层模型求解容差从1e-6放宽到1e-4在不影响拟合精度的前提下求解时间能省30%。用热启动策略下一个样本的初始解用上一个样本的解因为电价变化不大时最优解不会大幅移动。实现起来稍复杂但加速效果显著。5.5 完整问题排查速查表症状可能原因解决方向元模型R²低于0.9采样覆盖不足增加采样密度或扩大采样范围元模型预测震荡核函数过度拟合换Matern核或增加噪声方差博弈无法收敛迭代步长过大引入步长衰减从0.3开始调上层优化解不稳定储能互斥约束未线性化用二进制变量替换非线性约束求解时间超限求解器精度设置过高调整MIPGap为0.01放宽到0.05也可以负荷响应曲线异常元模型降维过度检查PCA主成分累计方差是否达到95%6. 进一步扩展与应用思考6.1 从元模型到数字孪生的升级路径元模型优化的思路本质上就是构建一个轻量化数字孪生。当前版本用Kriging拟合下层响应后续完全可以扩展为多保真度元模型。比如先用简化物理模型生成大量低精度数据再用精细仿真模型生成少量高精度数据两者融合训练一个Co-Kriging模型。这套方法在航空发动机设计领域已经很成熟迁移到VPP调度领域有巨大的想象空间。6.2 多VPP博弈场景的改造方向当前模型是单VPP参与市场的简单主从博弈。实际中一个区域往往有多个VPP多个VPP之间存在竞争购售电的关系这就演变成多个领导者 一个跟随者的Stackelberg-Nash博弈。这种模型目前学术界还在密集研究工程落地难度也更大。如果你已经跑通当前模型下一步可以向多VPP竞争方向扩展元模型在其中的应用方式相同——拟合每个VPP所面对的市场响应关系。6.3 强化学习与元模型互补的可能性元模型是静态的近似函数一旦工况发生剧烈变化比如电网拓扑结构改变、设备检修停机就需要重新训练。而强化学习的在线学习特性可以弥补这一点。我研究过一种混合方案用Kriging元模型做离线近似在线运行时用强化学习对元模型预测结果做实时修正。这种“离线代理 在线校正”的架构在风电功率预测里已经有人做了实验效果不错值得VPP调度关注。在能源系统优化这个领域纯粹的理论模型很容易做出来但工程可用才是真正的分水岭。元模型优化 主从博弈的组合恰好解决了传统双层优化规模化应用的计算瓶颈又为VPP调度保留了博弈论的严谨框架。这套MATLAB实现虽然只是单案例验证但方法论的复用性和扩展性都非常强。如果你也在电力系统优化、能源经济调度或者博弈论应用领域遇到类似的双层求解困境可以直接把我这套方案作为起点去改造。最后分享一个个人经验整个项目最耗时间的不是写代码而是确定元模型拟合对象、采样范围和收敛判据这几个“元问题”把这些想透了剩下的实现只是体力活。
返回列表