资讯详情 综合能源系统双目标优化:P2G与碳捕集建模及epsilon约束法实现
📅 2026/10/16 4:10:03
1. 项目整体设计与思路拆解1.1 核心需求解析第一次看到这个题目的时候我脑子里直接蹦出三个关键词综合能源系统、P2G、碳捕集。这几年碳达峰碳中和的背景下综合能源系统Integrated Energy System, IES相关的论文数量井喷式增长但真正把P2G电转气和碳捕集设备Carbon Capture, CC放在一起建模还同时考虑热电联供CHP的机组组合问题做双目标优化的确实不多。这个选题位置很精准——既紧扣低碳转型的研究热点又在模型层面做了适度深化。先说项目要解决的到底是什么问题一个园区或者区域型的综合能源系统里面包含热电联产机组、燃气锅炉、P2G设备、碳捕集装置还可能配套风电光伏这类可再生能源。系统需要同时满足用户的电负荷和热负荷需求同时要决定每一台设备在每一个调度时段出多少力、买多少电、卖多少电、捕集多少二氧化碳。而优化目标不是单一的成本最小而是两个相互冲突的目标——系统运维成本最小化和碳排放成本最小化。为什么这两个目标会冲突很简单想少花钱就容易多用便宜但高碳的能源想少排碳就得增加碳捕集设备的运行功率、提升P2G的消纳能力、让CHP机组降低出力和爬坡这些都会带来额外的运维成本。矛盾就在这里。单目标优化只能给你一个折中解而双目标优化要生成一整条Pareto前沿让决策者根据实际偏好挑选方案——这才是这个题目的核心价值所在。1.2 方案选型背后的考量这个项目选用了epsilon约束算法来处理双目标问题而不是常见的加权求和法。这一点很关键我从实际跑结果的角度帮你分析一下为什么。加权求和法确实简单把两个目标函数乘上权重系数加在一起一个目标直接变成单目标问题求解速度快、实现也不难。但它有一个致命的毛病当Pareto前沿呈非凸形状时加权法会丢掉一部分Pareto点你算出来的所谓最优解根本覆盖不了整个前沿。这是方法论层面的硬伤。epsilon约束法不一样。它的思路是把其中一个目标比如碳排放成本转成约束条件强制要求它不超过某个阈值epsilon然后只对另一个目标比如运维成本做最小化。每次取一个不同的epsilon值就得到一个Pareto点。通过逐步扫描epsilon的取值范围可以稳定地生成完整、均匀的Pareto前沿且不依赖目标空间的凸性假设。这是它在理论上优于加权法的根本原因也是论文选择它的理由。另外变量层面采用了设备启停状态、出力水平等离散加连续的混合整数线性规划模型MILP并用Matlab调用商业求解器求解。整套方案实现了模型构建、双目标处理、求解、可视化的一站式流程特别适合作为论文复现的代码框架。1.3 复现这篇论文前你应该想清楚的事我把代码复现的整个过程走了一遍之后有一个很深的体会拿到一篇论文的代码最忌讳的事情就是一上来直奔主程序打开就跑。结果大概率是报错、警告、结果对不上来回折腾一整天。正确的打开方式应该是先花一两个小时把论文的数学模型完整读透搞清楚三个问题。第一模型里有多少个变量哪些是连续变量、哪些是0-1变量第二有多少条约束每条约束是在限制什么物理过程第三目标函数里每一项量纲是什么系数从哪来你只有把这三个问题回答清楚才能真正理解代码里那些看起来莫名其妙的矩阵运算和系数设置。我复现这个项目的时候就是先自己手写了数学模型的白箱推导再一一对应到代码的行文结构里去效率反而比直接调试代码高得多。2. 系统架构与设备建模核心细节2.1 综合能源系统整体结构这个项目构建的是一个典型的热电联供综合能源系统核心设备包括CHP机组热电联产、燃气锅炉GB、P2G设备、碳捕集设备CCS以及外网交互环节购电/售电。系统同时耦合了电力、天然气、热力、碳流四种能量流。模型的边界条件一般包括一个典型日的预测负荷曲线、可再生能源出力曲线、分时电价、天然气价格等。系统的潮流逻辑可以简单理解为电力侧可再生能源和CHP出力优先满足电负荷剩余电量可供给P2G制气也可以卖给电网热力侧CHP的余热和燃气锅炉的出力共同满足热负荷碳流侧CHP和燃气锅炉燃烧产生的二氧化碳一部分排入大气、一部分被碳捕集设备捕获被捕集的二氧化碳作为原料进入P2G环节合成天然气。这样就形成了一个电-气-热-碳四维耦合的闭环框架。这个结构有个隐藏的好处P2G和碳捕集在物理上不是孤立的两个设备而是存在物料耦合关系的。碳捕集捕集的CO2可以直接作为P2G的碳源从而形成一个减碳闭环。这种耦合关系恰恰是论文模型中最值得复现的亮点之一也是代码里约束条件比普通IES模型多出一大截的原因。2.2 CHP机组建模细节CHP机组是整个系统中的核心供能设备也是最容易在建模环节出错的部分。它的数学模型核心特征是热电耦合特性——发电量和产热量不是独立可调的而是受到热电比和运行可行域的限制。常规的建模方式有两种一种是固定热电比模型发电多少、产热多少成固定比例简单但不够灵活另一种是可变热电比模型即通常所说的可行运行区间法Feasible Operating Region。这个项目采用的是后者。CHP机组的运行区间在电出力和热出力平面上是一个四边形的凸多边形。四条边界分别对应最小凝汽工况、最大进汽工况、最小出力限制、最大出力限制。写进约束条件里就是一组关于电出力和热出力的线性不等式。我复现的时候一开始用的是简化的固定热电比模型结果发现一个严重问题当电负荷高峰和热负荷高峰错峰出现时固定热电比模型要么导致系统无法满足负荷需求要么产生大量弃风弃光。换成了区间法建模之后CHP机组能够灵活调整热电比整个系统的运行经济性和可调度性都明显提升。一点体会这个四边形区域的系数千万不要拍脑袋写一定得从前处理的数据文件里核对清楚。2.3 P2G设备建模P2G设备的原理是电解水制氢再把氢气和二氧化碳通过甲烷化反应合成天然气整个过程的净效应是用电制气。P2G的数学模型核心参数有两个电能转氢能的效率、氢能转天然气的效率。两个效率相乘得到总转换效率通常在45%到65%之间。P2G模型的约束条件包括输入电功率上下限、爬坡约束、输出气压约束、反应温度约束等。更精细的模型还会考虑启停时间和运行成本系数。在优化模型里P2G的出力一般被表示为一个连续变量配合效率系数出现在能量平衡方程中。这个项目中对P2G建模的关键地方在于P2G消耗的电能来自哪里如果设定P2G只能消耗可再生能源的富余电量那么等式约束就需要耦合可再生能源出力、电负荷和CHP出力如果允许P2G从电网购电则运行成本会增加但调度灵活性也随之增大。我强烈建议复现时把这两种场景分别跑一遍对比你会发现Pareto前沿的位置有非常显著的差异——这也正是论文里灵敏度分析常用的思路。2.4 碳捕集设备建模碳捕集设备的建模是很多人容易敷衍了事的地方但这个项目的关键创新恰恰就在这里。碳捕集的原理是燃烧后捕集烟气中的CO2主要技术路线包括化学吸收法、膜分离法、深冷分离法等。捕集的CO2一部分封存利用一部分可以输送给P2G设备作为甲烷化的原料。在数学模型中需要引入两个关键参数捕集效率和捕集能耗率。捕集效率指捕集到的CO2量占系统总排放量的比例通常取值在85%到95%之间。捕集能耗率指捕集单位CO2需要消耗的电能这个数值直接影响系统的运行成本——因为它意味着碳捕集设备本身是一个不小的耗电设备运行它虽然减少了碳排放但增加了电负荷和运维成本。约束条件的构建要注意耦合碳捕集设备的捕集量不得超过系统碳排放总量捕集能耗要和电力平衡约束联动。更深入的建模还会考虑储碳装置——因为P2G的用碳量和碳捕集的产碳量在时间尺度上很可能不一致。引入储碳罐之后碳流的时间转移成为可能系统调度的灵活性又提升了一个档次。这也是论文中经常设置的扩展场景。2.5 双目标函数的具体展开双目标优化的问题公式在这里需要做一个完整展开。第一个目标是系统运维成本最小化它由以下几个部分构成CHP机组的燃料成本天然气消耗量乘以气价燃气锅炉的燃料成本从电网购电的成本P2G设备和碳捕集设备的运维成本与出力成正比设备启停成本如果有的话第二个目标是碳排放成本最小化它实际上包括系统实际排放量对应的碳排放费用碳交易或碳税成本碳捕集设备的运行本身不产生碳排放但它的能耗会通过购电间接产生碳排放——这一项视系统边界而定如果在全生命周期口径下考虑则应当计入如果存在碳交易机制还需要与免费碳排放配额相关联两个目标的量纲不同一个是经济成本单位是元或万元一个是碳成本单位是吨或碳交易金额epsilon约束法的处理方式可以把二者统一协调。实际操作中我建议把碳排放目标先换算成碳交易金额这样两个目标量纲一致epsilon取值的物理意义也更清晰。3. epsilon约束算法的原理与实现思路3.1 双目标问题的标准形式双目标优化问题的标准形式可以写成这样min f1(x)运维成本 min f2(x)碳排放成本 s.t. x属于可行域Xx是所有决策变量的向量包括CHP电出力、热出力、燃气锅炉出力、P2G输入电功率、碳捕集率、购电功率、弃风弃光量、0-1启停变量等。可行域X是上述所有等式约束和不等式约束构成的空间。epsilon约束法的核心操作是把其中一个目标函数转移为约束条件保留另一个作为目标函数。以这个项目为例把碳排放成本的约束上限设置为epsilon然后最小化运维成本。min f1(x) s.t. f2(x) epsilon x属于可行域X3.2 epsilon约束法的完整计算流程step 1分别独立求解两个单目标问题得到两个锚点解。先完全忽略碳排放目标只最小化运维成本得到最优运维成本f1_min和此时对应的碳排放值f2_max再只最小化碳排放成本得到最低碳排放f2_min和此时对应的运维值f1_max。这两个解给出了Pareto前沿的边界。step 2确定epsilon的扫描范围。将f2从f2_min到f2_max区间均匀分为N段一般取20到50段epsilon依次取值。step 3对每一个epsilon值求解对应的单目标优化问题记录目标函数值和决策变量值。step 4将所有点绘制在f1, f2平面上描出Pareto前沿。这里有一个非常容易踩的坑直接用f2_max作为epsilon的初始值在第一次迭代里会得到与单目标优化f1时相同的解这个点是Pareto前沿的端点没有问题。但有些节点上约束f2(x) epsilon过紧可能导致子问题无解。此时需要跳过或收缩epsilon范围。3.3 为什么选epsilon而非加权法我在给很多人讲这个项目的时候他们都会问同一个问题既然最后都是画出一条Pareto前沿加权法不是更简单吗这个问题值得展开说一下。加权法的问题不只是非凸Pareto前沿下的覆盖缺失。还有一个实际问题——权重的物理意义不容易解读。比如权重设为0.7和0.3你很难向非专业的人解释这意味着什么。而epsilon约束法中约束上限碳排放不超过多少吨是一个非常直观的工程语言监管要求你减排到什么程度优化器就会给你一个对应的最优经济方案。而且在实际求解时epsilon约束法生成的点更均匀、更稳定画出来的Pareto前沿曲线更平滑、更具说服力。论文里审稿人对Pareto前沿的质量有很高的敏感度一条完整、分布均匀的前沿曲线本身就是加分项。所以我个人非常推荐做双目标或者多目标优化复现时优先考虑epsilon约束法。3.4 工程实现小技巧在Matlab中实现epsilon约束法的框架不算复杂核心逻辑是两层循环的嵌套。外层循环负责epsilon的取值内层调用求解器求解单目标优化。一个实用的小技巧是不要每次都从零开始构造模型对象而是将模型结构定义为由函数生成buildModel参数对外开放这样每次调用时只需更新epsilon对应的约束值模型构建的开销就能显著降低。另外建议对每个epsilon子问题保存详细的运行结果数据包括目标函数值、各设备出力、碳捕集率、弃风量等用于后续一次性的结果汇总和可视化。如果只是把每个解的目标值记录下来后续想做设备层面分析时还需要重新求解会白费大量时间。4. Matlab代码实现全流程解析4.1 代码整体架构整个Matlab代码实现遵循数据输入 - 模型构建 - 求解设置 - 结果后处理四段式结构。数据输入部分用一个结构体data打包所有参数包括负荷曲线、可再生能源出力曲线、电价、气价、设备参数、碳排放配额、epsilon取值范围等。模型构建部分的核心是一个构建优化模型的函数它把目标函数、约束条件、变量定义统一封装。求解设置部分调用求解器接口完成求解。结果后处理部分将求解结果整理成表格、曲线图和Pareto前沿图。基本文件结构如下main_optimization.m % 主程序epsilon循环入口 build_ies_model.m % 构建IES优化模型 solve_single_subproblem.m % 求解单个epsilon子问题 plot_pareto_front.m % 绘制Pareto前沿 plot_device_output.m % 绘制各设备出力曲线 data_input.m % 参数设定我拿到论文复现代码时第一件事就是理清各文件间的调用关系。主程序是一个大循环循环体内每次更新约束值并求解。如果读者想在论文复现基础上扩展算法比如改成NSGA-II或其他多目标进化算法只需要把主程序的循环逻辑换掉即可模型构建部分可以直接复用。4.2 变量定义与目标函数实现为了保持模型可读性变量的命名建议带上设备前缀和时段下标。比如P_chp是CHP电出力H_chp是CHP热出力P_gb是燃气锅炉出力P_p2g是P2G输入电功率P_ccs是碳捕集设备耗电P_buy是购电功率。在Matlab中定义优化变量时可以用optimvar语法% 变量定义N表示调度时段数本例取24 P_chp optimvar(P_chp, N, LowerBound, 0); % CHP电出力 H_chp optimvar(H_chp, N, LowerBound, 0); % CHP热出力 P_p2g optimvar(P_p2g, N, LowerBound, 0); % P2G输入电功率 P_ccs optimvar(P_ccs, N, LowerBound, 0); % 碳捕集设备耗电 M_co2_capture optimvar(M_capture, N, LowerBound, 0); % 捕集CO2量 P_buy optimvar(P_buy, N, LowerBound, 0); % 电网购电 P_sell optimvar(P_sell, N, LowerBound, 0); % 电网售电 u_chp optimvar(u_chp, N, Type, integer, LowerBound, 0, UpperBound, 1); % 启停状态目标函数是两个部分的线性组合。由于epsilon约束法把碳排放目标放到了约束里目标函数只需要写运维成本的最小化形式% 运维成本目标函数 total_cost ... sum(gas_price * (P_chp .* heat_rate_chp P_gb .* heat_rate_gb) * delta_t) ... % 燃料成本 sum(elec_buy_price .* P_buy * delta_t) ... % 购电成本 sum(om_chp * P_chp * delta_t) ... % CHP运行维护 sum(om_p2g * P_p2g * delta_t) ... % P2G运维 sum(om_ccs * M_co2_capture * delta_t); % 碳捕集运维 prob.Objective total_cost;这里有一个特别容易忽视的细节delta_t是单个调度时段的时长通常取1小时但如果你把系统调度间隔改成15分钟或者30分钟所有涉及功率乘以时间的累计项都要同步调整。我建议将delta_t作为参数放在data_input.m里这样改调度间隔时只需要改一个数就好。4.3 约束条件实现约束条件是实现中最难调试、也最能体现模型内核的部分。我根据这个项目的物理结构把约束分为四组逐一说明。电力平衡约束系统所有电源的出力和消耗要时刻相等。% 电力平衡CHP 购电 可再生 电负荷 P2G耗电 碳捕集耗电 售电 prob.Constraints.power_balance ... P_chp P_buy P_res - P_p2g - P_ccs - P_sell P_load;特别注意P_res是风光出力在这个模型中一般按预测值给定也就是不可调变量如果想考虑弃风弃光可以设置一个弃风变量等式约束改成不等于号约束或者加入一个松弛变量。我在调试中发现不考虑弃风的模型在某些场景下会无解这是因为夜间热负荷较高而电负荷低的时候CHP为了保证供热出力发电量超过了电负荷消耗能力。此时必须允许弃电或售电否则模型不可行。热力平衡约束% 热力平衡CHP余热 燃气锅炉产热 热负荷 prob.Constraints.heat_balance ... H_chp H_gb H_load;CHP热电耦合约束% CHP可行运行区间四边形区域简化为线性不等式 prob.Constraints.chp_region_1 H_chp h_min_coeff * P_chp b1 * u_chp; prob.Constraints.chp_region_2 H_chp h_max_coeff * P_chp b2 * u_chp;P2G物料平衡约束和碳排放约束是这个模型的特色% P2G天然气产出与电耗的关系 prob.Constraints.p2g_gas ... V_gas_p2g eta_p2g * P_p2g * delta_t; % 碳捕集量约束不能超过系统燃煤/燃气总排放量 prob.Constraints.carbon_capture_limit ... M_co2_capture emission_coeff * (P_chp .* u_chp P_gb) * delta_t; % 碳捕集量与其耗电的关系 prob.Constraints.ccs_power ... P_ccs power_intensity_capture * M_co2_capture; % 捕集CO2与P2G甲烷化的物料平衡 prob.Constraints.p2g_carbon ... M_co2_used_p2g carbon_stoich_coeff * V_gas_p2g;EPSILON约束的实现是把碳排放目标放在约束里% epsilon约束碳排放量不超过给定上限 total_emission ... emission_coeff * (P_chp .* u_chp P_gb) * delta_t - M_co2_capture ... emission_coeff_grid * P_buy * delta_t; prob.Constraints.epsilon_carbon total_emission epsilon_value;再强调一遍这里用的是小于等于约束不是等式约束。如果误写成等式约束优化器会强制碳排放量精确等于epsilon值则Pareto前沿的形状会发生扭曲很多本应位于前沿内部的点会丢失。4.4 求解器设置与epsilon循环求解器的选择上由于模型是混合整数线性规划Matlab自带的intlinprog或调用外部求解器均可推荐调用性能更强的商业求解器如Gurobi。Matlab代码里设置接口的方式很简单options optimoptions(intlinprog, Display, off);但如果希望使用商业求解器可以直接配置环境变量路径用gurobi指令生成模型文件% 调用Gurobi求解MILP需要已经安装并配置好Gurobi的Matlab接口 probSolver prob2struct(prob, Objective, Objective); % 设置Gurobi参数 params.outputflag 1; params.mipgap 1e-4; result gurobi(probSolver, params);主程序中的epsilon循环是这个项目最核心的算法骨架% 主循环epsilon从eps_min到eps_max均匀取N个点 eps_list linspace(eps_min, eps_max, N_eps); pareto_f1 zeros(N_eps, 1); pareto_f2 zeros(N_eps, 1); for k 1:N_eps epsilon_value eps_list(k); [f1_opt, f2_opt, x_opt] solve_single_subproblem(data, epsilon_value); pareto_f1(k) f1_opt; pareto_f2(k) f2_opt; % 保存完整解用于后续设备出力分析 save(sprintf(result_eps_%02d.mat, k), x_opt, f1_opt, f2_opt); end实际运行中epsilon范围的两端很可能是无解区域所以在循环内部一定要加一个无解的处理分支防止程序中断。4.5 结果可视化结果可视化的质量直接影响复现成果的展示效果。我强烈建议输出以下几张图第一张是Pareto前沿图。横轴为运维成本纵轴为碳排放成本或碳排放量。把每一个epsilon取值对应的解描点连线形成光滑的前沿曲线。如果曲线出现明显的折线或凹陷说明epsilon取值范围或步长设置有问题需要调整。第二张是典型工况下的设备出力曲线。这里可以选一个中间epsilon值对应的解比如Pareto前沿的膝盖点画出24小时的CHP电出力、热出力、燃气锅炉出力、P2G消耗功率、碳捕集功率和购电功率曲线。第三张是碳排放结构柱状图展示总碳排放中有多少被碳捕集设备捕获、多少被P2G利用、多少最终净排放。这一张图特别直观能够立刻看出模型引入碳捕集和P2G之后的减碳效果。figure; plot(pareto_f1, pareto_f2/1000, o-, LineWidth, 1.5, MarkerSize, 6); xlabel(运维成本元); ylabel(碳排放成本元); title(Pareto前沿运维成本 vs 碳排放成本); grid on;5. 复现过程中的常见问题与排查技巧5.1 模型不可行怎么办复现这类IES优化模型时遇到频率最高的问题就是模型无解。我第一次跑通时也被这个坑卡了两天后来总结了三个最可能的原因。第一个是负荷平衡约束过紧。当系统中所有设备都在区间内运行也无法同时满足电热负荷时模型就会无解。解决方法是先把负载约束单独摘出来调试手动计算一下各时刻的功率平衡缺口确认系统总供给能力是否大于峰值负荷。必要时加一个失负荷变量作为软约束先让模型有解再逐步收紧。第二个是CHP热电耦合区间与实际设备参数不匹配。特别是那些来自论文表里的四边形顶点坐标如果打字时抄错了其中一行的系数极容易出现某时段CHP无法在合理热电区间运行的情况。检查手段也很直接打印出约束矩阵的完整内容对着论文里的不等式逐条核对。第三个是epsilon取值超出可行范围。当epsilon取得低于理论最低碳排放值时模型一定无解。这也是为什么需要预先运行两次单目标优化来确定epsilon的上下界。5.2 P2G与碳捕集循环的物料平衡问题这个项目的耦合关系比较复杂P2G需要的CO2来自碳捕集设备碳捕集设备消耗的电能又来自系统。这种循环耦合容易出现物料不平衡。具体表现是P2G用碳量大于碳捕集产碳量或者碳捕集设备满负荷运行但依然无法满足P2G的用碳需求导致模型无法在物料平衡约束下找到可行解。解决思路有两种一种是增加储碳装置允许系统在不同时刻之间转移CO2模型灵活度大幅提升另一种是把P2G用碳量小于等于捕集CO2量外购CO2量写成不等式约束允许系统外购碳源。两种方案各有优劣前者更符合实际物理过程但增加变量后者实现简单但物理意义弱一点。我建议复现论文基准场景时采用前者作为扩展场景时试试后者对比一下对结果的影响。5.3 数值尺度问题做Matlab求解时还有一个隐藏较深的坑是量纲尺度不一致。比如目标函数里运维成本是10的4次方量级碳排放量可能只有10的2次方量级部分约束的系数也可能差异较大。求解器在计算时对数值尺度非常敏感尺度差异太大会导致数值精度下降甚至求解错误。排查方法是检查约束矩阵中非零元素的最大值和最小值之比如果超过1e6就要考虑对参数做单位换算或者标准化处理。一个很实用的处理手段是把碳排放量统一折算成碳排放成本乘以碳价不仅解决了量纲问题还让epsilon的物理意义更明确。5.4 求解器参数配置心得实际运行中发现求解器的MIPGap参数对Pareto前沿的平滑程度影响很大。MIPGap设置太大比如默认的1e-4某些子问题的解不够精确会在Pareto前沿上产生肉眼可见的抖动。建议设置成1e-4甚至1e-5虽然计算时间会稍微增加但对整个前沿的质量提升非常明显。另一个参数是求解时限。epsilon约束法需要跑几十个子问题每个子问题都是MILP如果每个都等它完全收敛总耗时可能相当可观。我的一般做法是设置单个子问题的求解时限为30到60秒取在该时限内找到的最优可行解以换取整体计算效率。当然如果你做的是严格需要全局最优的学术场景这个策略要谨慎使用。6. 实操总结与个人经验这个项目整体跑下来我的体会是这个题目看起来论文篇幅不长但其代码复现难度属于中等偏上对建模能力和调试耐心的要求比较高。入手时不要太急于求成按我上面说的流程先对照论文理解模型再搭建约束再调试求解器最后做结果分析。每一步都走得稳一些后面反而省时间。我个人还有一个习惯就是在完成官方代码复现之后主动增加至少一种扩展场景来验证模型的鲁棒性。比如把P2G效率从默认值调低10个百分点或者把碳捕集能耗率调高15%再跑一遍。这种敏感性分析不仅是论文审稿人喜欢看到的而且能帮你更深刻地理解模型的各个参数对不同目标的影响路径。最后分享一个复盘时特别好用的做法把Pareto前沿的膝盖点即为曲线上曲率变化最剧烈的位置单独拿出来分析这个所谓折中解对应的最优设备出力方案。你会发现这个点往往代表了一种最佳平衡——碳排放在一个可接受范围内运维成本不至于过高。把这个点作为推荐运行策略来讨论逻辑上是最完整的。如果后续要在这个项目上做扩展可以考虑加入需求响应、储能系统协同或者把确定性优化改成两阶段鲁棒优化。框架都是现成的核心模型不用推倒重建只需要在约束组里增加对应模块即可。这也是这样一个模块化模型代码最大的价值所在。