ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

分布鲁棒优化在含风电机组组合中的应用:线性准则建模与Matlab实现

分布鲁棒优化在含风电机组组合中的应用:线性准则建模与Matlab实现 做机组组合优化的人多多少少都被“风电不确定性”折磨过。天气一变风机出力就跟着“心情”波动预测值和实际值之间的偏差轻则影响经济调度重则引发系统备用不足甚至失负荷。以前大家习惯用确定性模型加旋转备用裕度来“包住”不确定性后来场景法和鲁棒优化也开始流行但前者需要大量场景支撑、计算量感人后者则是“太保守”经常算出来一套很贵的方案实际根本用不上那么多备用。我这次做的这个项目采用的是近几年在电力系统领域热度很高的分布鲁棒优化框架在目标函数里显式刻画风电预测误差的分布不确定性同时引入线性准则线性决策规则把两阶段问题转化成可以交给求解器直接处理的形式最后用MatlabYalmipGurobi完成了整套代码实现。说白了就是想找一个介于“太乐观的场景法”和“太保守的鲁棒法”之间的方案让机组组合结果在经济性和鲁棒性之间取得一个可量化的平衡。这篇文章我就把这套模型的数学思路、代码实现、调试过程和踩坑记录都摊开来讲给准备做这个方向的朋友一份可以直接“抄作业”的参考。1. 为什么机组组合要引入分布鲁棒优化——问题背景与建模思路1.1 风电不确定性对机组组合的核心影响机组组合要解决的根本问题是在未来某个调度时段内哪些机组开机、哪些机组停机、每台机组发多少电才能让系统总成本最低同时满足负荷需求和各种安全约束。传统做法是把风电当作已知的确定值或者用一个简单的预测曲线代替然后安排机组启停。这种做法最大的漏洞在于风电出力本质上是一个随机变量预测曲线只是它可能取值中的一个“均值路径”实际出力偏离预测值的时候系统需要额外调节手段比如备用机组、爬坡能力来兜底。如果你不把这个随机性建模进去优化模型会认为“风电就是预测值那么多”于是少开了很多机组省了开机成本。真到了运行时刻风电掉得厉害了你发现备用不够、爬坡不够只好紧急拉高某些机组的出力——这在实时调度里可能引发连锁问题。运行备用不足的情况下严重时只能切负荷这在很多调度事故里都是最后一根稻草。所以不确定性处理得好不好直接影响机组组合方案的经济性和安全性。1.2 场景法、传统鲁棒优化各有什么尴尬之处学术界和工程界处理风电不确定性主要有几条路线场景法Stochastic Programming用蒙特卡洛或者历史数据生成若干风电出力场景每个场景对应一个调度方案求所有场景下的期望成本最优。这个思路直观但有两个问题一是场景数量少了概率分布的刻画不准确场景数量多了问题规模爆炸求解MILP的时间成倍增长。二是场景法需要预先知道风电出力的真实概率分布而实际上你只能通过历史数据估计这个分布估计本身就有误差场景法对此无能为力。传统鲁棒优化Robust Optimization定义不确定量的取值集合U比如风电出力在某区间内波动求“最坏情况下成本最小的方案”。这个方法保证了方案的可行性但代价是过于保守——它把U里每个点都当作同等可能哪怕有些取值概率极低甚至在物理上几乎不可能出现也会被拉进最坏情况的考虑范围。反映到结果上就是你为了一个几乎不会发生的极端场景多开了很多机组系统运行成本明显偏高调度计划不够经济。分布鲁棒优化的出现就是为了在这两者之间找一个折中我不需要精确知道风电的真实分布但我知道这个分布落在某个模糊集Ambiguity Set里优化目标是“模糊集中最坏可能分布下的期望成本最小”。这样既考虑了分布估计本身的误差又不会像传统鲁棒那样把概率信息完全丢弃。1.3 线性准则在这套模型里扮演什么角色分布鲁棒优化模型写出来容易求解却很棘手。两阶段分布鲁棒问题里第二阶段决策变量比如实际运行时的机组出力调整、备用调用量是风电不确定量的函数。这个函数如果没有任何限制它是一个泛函优化问题从计算角度基本没法直接求解。线性准则做的就是给这个函数加上一个合理的限制假设第二阶段决策变量是不确定量的仿射函数affine function也就是“线性决策规则”。形式上看就是 y(ξ) y₀ Yξ其中ξ表示风电预测误差向量Y是待优化的系数矩阵。这个限制看起来有点强但在大多数电力系统调度场景下有明确的合理性系统调度员的调整策略本质上就是“看误差多大、然后按比例修正”AGC自动发电控制的动作逻辑也接近这种线性映射。更重要的是加上线性准则之后原问题的无穷维决策空间被压缩到有限维可以用数学规划工具直接求解工程实现性和解释性都大幅提升。2. 数学建模目标函数、约束与非线性的线性化处理2.1 机组组合基础模型快速回顾在进入分布鲁棒和线性准则之前先搭好基础模型骨架。考虑一个含N台常规火电机组、W台风电场、调度时段数为T的机组组合问题。决策变量分为两部分第一阶段的“开机决策”机组启停状态u_i,t这是二进制变量以及机组出力的基础水平p_i,t在获知风电不确定性之前决定。第二阶段的“调节决策”风电不确定性实现后机组的出力调整量r_i,t(ξ)以及可能存在的备用调用、失负荷量sh_i,t(ξ)等。目标函数是总成本最小化启动成本SU_i × 最大u_i,t - u_i,t-1, 0燃料成本通常用二次函数近似但在MILP里要分段线性化运行调整成本第二阶段调节出力的成本按期望最坏情况计算基础约束包括系统功率平衡所有机组出力风电出力负荷机组出力上下限机组爬坡约束相邻时段出力变化限制最小启停时间约束线路潮流约束简化时用直流潮流或传输容量限制2.2 分布鲁棒模型中的模糊集如何构造模糊集是分布鲁棒优化的核心。它的作用是描述“风电预测误差的真实概率分布P可能落在哪一类分布里”。基于矩信息的模糊集是最经典的一种表达式如下D { P ∈ P₀(Ξ) | E_P[ξ] μ, E_P[(ξ-μ)(ξ-μ)ᵀ] ⪯ Σ }其中Ξ是风电预测误差的支持集比如根据风机出力特性限定的上下界μ和Σ是从历史预测误差数据中估计出来的均值向量和协方差矩阵。这个模糊集的意思是真实分布P的均值与历史估计一致协方差矩阵被某个半正定矩阵Σ界定但P具体是什么形式我不去精确指定。这里有个细节值得展开为什么用“⪯”而不是“”如果要求协方差精确等于Σ问题会变得非常棘手而且历史数据估计出的Σ本身有噪声精确等于没意义。用“⪯”放宽容纳了协方差估计偏大的可能也保留模糊集作为凸集的好性质。实际代码里这个约束会转化为半定矩阵约束对应Yalmip里的sdpvar变量和矩阵不等式约束。2.3 线性准则如何把两阶段问题变成可计算形式两阶段分布鲁棒问题的一般形式是min cᵀx sup_{P∈D} E_P[ Q(x, ξ) ]其中Q(x, ξ)是给定第一阶段决策x和不确定量实现ξ之后的第二阶段问题最优值。这个内部问题是一个min-max结构直接求解很难。引入线性准则之后第二阶段决策变量被参数化为 r_i,t(ξ) r⁰_i,t Σ_w R_i,t,w · ξ_w这里的ξ_w是第w个风电场的预测误差R_i,t,w表示第i台机组在t时段对第w个风电场预测误差的响应系数。这个仿射形式的好处是原来对函数空间的优化变成了对r⁰和R这些有限维参数的优化。在分布鲁棒框架下目标函数里的最坏期望可以展开成关于ξ的一阶矩和二阶矩的表达式。如果约束条件里不含支持集Ξ内的逐点约束那么只需要用到模糊集里的矩信息就能完成期望值的计算问题退化为一个带半定约束的MILP。如果还要求某些约束在Ξ内逐点满足比如出力在任何ξ下都不越限那就需要额外处理支持集约束——通常用S-Procedure或者鲁棒对偶把这类约束转换成线性矩阵不等式LMI再做一次半定松弛。这里给一个直观的类比线性准则相当于你在做决策时不要求“每种天气情况下都精确知道该怎么办”而是规定“预测误差增大1%我就按某个线性系数去上调或下调机组出力”。这个线性系数本身由优化模型决定——它会在模糊集所描述的所有可能分布里选一个加权平均意义下最有利的值。所以线性准则不是拍脑袋定的规则而是“优化出来的规则”这是它叫“准则”但不失客观性的关键。2.4 模型完整表达式与LDR改造后的形式把上述内容整合模型可以写成min Σ_t Σ_i [ SU_i·v_i,t f_i(p_i,t) ]max_{P∈D} E_P[ min_{r} Σ_t Σ_i c_i·r_i,t(ξ) ]s.t. 第一阶段约束启停、最小启停时间、基础出力上下限 第二阶段约束在每个ξ下满足p_i,t r_i,t(ξ) 在出力范围内爬坡约束同样满足功率平衡在计及风电实际出力后可达 r_i,t(ξ) r⁰_i,t R_i,t ξ其中R_i,t是待优化的敏感度系数矩阵经过对偶推导max-P问题可以转换成有限维对偶形式。这里不展开全部推导过程核心结果是对偶问题引入了与矩约束对应的对偶变量最终模型是一个“MILP 半定约束/二阶锥约束”的混合结构完全可以用Gurobi 9以上的版本直接求解。3. Matlab代码实现从数据生成到求解器调用3.1 代码整体结构与运行流程整套代码按模块划分主程序是main.m其他功能模块按职责拆分方便调试和复用文件/函数作用main.m主入口定义系统参数、调用建模和求解流程load_system_data.m读取机组参数、负荷曲线、风电预测数据build_uc_model.m构建基础机组组合约束启停、爬坡、最小启停时间等build_dro_model.m构建分布鲁棒模糊集及相关对偶约束add_ldr_vars.m定义线性准则相关的决策变量r⁰, R矩阵solve_and_postprocess.m调用Gurobi求解整理结果输出调度方案plot_results.m绘制机组出力、风电预测与实际出力、备用调用等曲线运行前需要准备的数据集包括机组参数表额定容量、最小出力、爬坡率、启停成本系数、燃料成本系数负荷曲线96点或24点风电预测出力序列以及用于估计模糊集参数的历史预测误差样本。3.2 核心代码片段拆解第一阶段机组组合的变量定义和基础约束用Yalmip建模非常方便% 决策变量 u binvar(nunit, T, full); % 机组启停状态 v binvar(nunit, T, full); % 开机动作标志 p sdpvar(nunit, T, full); % 基础出力水平 % 目标函数中的启动成本部分通过v变量线性化 cons cons [v(:,t) u(:,t) - u(:,t-1)]; cons cons [v(:,t) u(:,t)]; cons cons [v(:,t) 0];线性准则的决策变量是整个模型里最有特点的部分。这里要注意R矩阵是一个三维变量在Yalmip里可以按“风电场w”维度展开成一系列二维矩阵或者直接用sdpvar构造三维数组% 线性准则决策变量 r0 sdpvar(nunit, T, full); % 常数项 Xi_LDR sdpvar(nunit, T, nwind, full); % 对预测误差的响应系数 % 对于每个风电场误差 xi_w实际调节量为 r0 Xi_LDR(:,:,w) * xi_w % 总调节量是所有风电场响应叠加的结果 radj r0; for w 1:nwind radj radj Xi_LDR(:,:,w) * xi_w(w); end这样做的好处是后面所有含radj的约束和期望值计算都可以用线性操作展开避免符号运算上的复杂度。分布鲁棒部分的模糊集定义为% 模糊集参数 mu_hat mean(hist_error, 2); % 历史误差均值 Sigma_hat cov(hist_error); % 历史误差协方差矩阵 % 矩约束对应的对偶变量半定矩阵 Gamma sdpvar(nwind, nwind, symmetric); gamma0 sdpvar(1, 1);最坏期望的目标函数改造是关键。如果支持集Ξ是整个R^n经过对偶之后目标函数会包含一项“Gamma与Sigma_hat的迹”配合给定置信水平下的缩放系数。那么目标函数最终写成objective base_cost ... % 第一阶段成本 trace(Gamma * Sigma_hat) ... % 协方差惩罚项 gamma0; % 均值相关项然后再把这个分布在模糊集中的最坏期望与线性准则表达的第二阶段成本结合起来本质上第二阶段期望成本里的E[r]用E[ξ]μ_hat展开E[r²]用E[ξξᵀ]Σ_hatμ_hat μ_hatᵀ展开。于是整个目标函数变成决策变量u, v, p, r0, Xi_LDR, Gamma, gamma0的线性或二次函数然后再做一次分段线性化或按求解器要求处理。3.3 求解器配置与参数调试这套模型求解质量很大程度上取决于求解器的选择和相关参数设定。我自己实测下来Gurobi 9.5对二阶锥约束和MILP混合问题的处理比Cplex更顺手尤其在大规模算例下节点迭代速度明显更快。Yalmip调用Gurobi的设置options sdpsettings(solver, gurobi, ... gurobi.MIPGap, 0.01, ... gurobi.TimeLimit, 3600, ... gurobi.NumThreads, 8, ... gurobi.MIPFocus, 2);几个参数的实际感受MIPGap设到1%基本能满足工程需要强行追逐最优解会让求解时间翻倍。MIPFocus2在某些中等规模算例里能加快下界收敛但如果问题本身可行域比较松反而会浪费时间在证明最优性上。NumThreads要根据本机核心数设不是越多越好太多线程在MILP里会因为同步开销导致加速比下降。如果你的模型里还带有二阶锥约束比如模糊集用范数锥定义注意Gurobi版本要在9.0以上否则会直接把问题判定为“不支持的约束类型”。Cplex对SOCP的支持也不错但在处理大量二进制变量时数值稳定性差一些所以我最后主要还是用Gurobi。3.4 数据处理与风电误差样本生成模糊集的均值μ和协方差Σ是从历史预测误差样本估计的。我采用的是公开数据集里的风电场预测序列和实测序列误差样本通过“预测值减实测值”逐小时生成。有一点容易被忽略风电预测误差往往不是严格零均值且存在厚尾特性直接假设高斯分布会低估尾部分布的极端风险。所以我在构造模糊集时会额外引入偏度或峰度的缩放系数把Sigma_hat放大1.2到1.5倍。这个操作在代码里体现为% 保守系数 kappa: 考虑分布估计误差适当放大协方差 kappa 1.3; Sigma_hat kappa * cov(hist_error);这种缩放看似简单但对结果影响很大太小的κ会让模型低估风险算出偏激进的方案太大的κ会让模型趋向传统鲁棒优化成本偏高。我通常用交叉验证法选κ——把历史数据分两段前段估计模糊集参数并算调度方案后段模拟运行成本选模拟成本最低的那个κ。这一套下来模型对分布估计误差的鲁棒性就有实证支撑了。4. 仿真算例与结果分析4.1 算例设置与场景构建为了验证模型效果我在一个改进的IEEE 30节点系统上做了测试。系统包含6台常规机组总装机280MW、2个风电场总装机120MW调度周期24小时负荷数据取自标准算例库。风电预测曲线按实测风速数据处理得到预测误差用前一节说的方法生成。对同一份数据我跑了三个模型做对比确定性模型把风电固定在预测值要求系统预留固定比例备用比如10%负荷传统两阶段随机规划用1000个蒙特卡洛场景近似真实分布本文的分布鲁棒线性准则模型模糊集参数由历史数据估计κ1.3求解环境为Matlab R2022a Yalmip Gurobi 10.0.1单台机器Intel i7-12700K/64GB内存。4.2 模型对比实验结果三个模型的机组组合结果差异非常明显。确定性模型因为只预留固定备用且认为风电按预测值出力所以只开了4台机组中的大机组总开机成本最低但模拟运行时一旦风电实际出力偏离预测值超过10%系统备用不足出现失负荷事件。传统随机规划模型在1000个场景下求解时间接近30分钟得到方案比确定性模型多开了一台小机组总成本上升约6.3%。模拟测试中它在95%以上的场景下都能保证不失负荷风险控制表现不错但付出的经济代价比较大。分布鲁棒模型的结果很有意思总成本介于两者之间比随机规划模型低约2.1%而模拟运行中的失负荷概率几乎为零——因为模糊集把分布估计误差考虑进去了模型会自动让响应系数R去吸收那些“历史数据里没出现过但分布上有可能”的坏情况。这体现了分布鲁棒“用数据构造模糊集在最坏分布下优化”的核心优势相对鲁棒优化没那么保守相对随机规划又更能应付分布估计错误。4.3 模糊集参数与线性准则灵敏度分析我还做了一组敏感性测试观察κ从1.0变化到2.0时系统总成本的变化趋势。结果是随着κ增大机组组合方案里的高成本机组开机数量缓慢增加总成本几乎线性上升。这说明κ的选取直接影响方案经济性不是“随便缩放就完事”的参数值得单独做一次参数标定。更关键的是线性准则中响应系数矩阵R的分布规律。我把求解得到的R矩阵按机组和风电场画出热力图发现一个典型特征那些爬坡速度快、调节成本低的机组比如燃气机组其对应的R系数普遍较大也就是它们承担了更多的不确定性调节任务而煤电机组因为调节成本高、爬坡慢R系数很小基本只按基础出力运行。这说明线性准则学出来的响应模式和物理直觉完全吻合——优化模型自动把“便宜且灵活的调节资源”分配给了不确定性风险。这个结果给我一个启发线性准则不只是为了求解方便它本身就提供了一种可解释的工具——你能够直观看到每台机组在面对风电误差时应该以多大的灵敏度参与调节这对调度员的运行决策非常有参考价值。5. 常见问题与排查技巧实录5.1 问题一模型求解时间过长尤其大算例下节点爆炸初次跑规模较大的算例比如节点数超过118、机组数超过20台时MILP求解时间很容易突破2小时。我排查后发现问题主要出在两个地方一是R系数矩阵被定义成完整的三维变量实际求解器需要处理的二进制变量和连续变量数量爆炸性增长二是目标函数里二次项太多导致Gurobi的MIP预处理能力受限。解决办法有几个按效果排序固定响应矩阵结构不是所有机组都需要完整的仿射响应。对爬坡能力差、调节成本高的大型煤电机组直接固定R0只让快速机组参与不确定性调节。这从约束上讲并不损失多少最优性但变量数能减少40%以上。合并风电场的预测误差变量如果两个风电场地理位置相近预测误差相关性较高可以合并成一个等效风电场减少nwind维度。增加MIPGap容忍度从0.01放宽到0.05对工程方案来说成本偏差不过0.5%但求解时间能缩短4到5倍。5.2 问题二Yalmip报错“Unknown solver”或Gurobi无法启动这个问题很常见尤其是第一次配置环境的时候。大多数原因是Gurobi许可证没装好或者Yalmip找不到Gurobi的可执行文件。启动时会看到类似“No suitable solver for the problem type”的提示。检查顺序是在Matlab命令行输入gurobi_setup确认Gurobi的mex文件能正常加载没有报DLL缺失。确认sdpsettings(solver, gurobi)里的名字拼写正确。Yalmip对大小写不敏感但错误的中文引号或空格会导致匹配失败。如果用的是Gurobi 10.x确认对应版本的Matlab接口已经通过Gurobi安装器自动复制到Matlab路径或者手动运行addpath(.../gurobi/matlab)。有些模型类型比如无界变量半定约束在某些求解器版本里不被支持可以换Cplex试试或者检查约束是否让问题退化。5.3 问题三分布鲁棒对偶后的目标函数出现“病态”数值跑出来的最优解里Gamma矩阵元素出现极大的正负值交错目标函数第4位小数之后的不稳定这通常是数值病态。诱因和解决方式量纲不统一风电误差单位是MW但负荷单位是MWh或p.u.混合在一起会让矩阵条件数变得极差。统一把功率量纲转为p.u.基准功率比如100MVA数值问题大幅缓解。协方差矩阵奇异当两个风电场误差高度相关时Σ_hat接近奇异其Cholesky分解或特征分解不稳定。处理方法是加一个ridge项Σ_reg Σ_hat εIε取0.01倍的Σ_hat最大特征值。对偶变量尺度差异大gamma0在量级上百而Gamma元素在10^-3量级会影响求解器的presolve。可以分别设置变量的初始值和上下界或者对目标函数各部分做加权归一化处理。5.4 问题四线性准则算出“过度响应”且无法物理解释有时候R矩阵数值很大机组对风电误差的响应系数甚至超过1这意味着风电每波动1MW某台机组要反向调节超过1MW这在物理上不合理。根本原因在于目标函数里缺少了对调节动作本身的惩罚——如果惩罚系数太低模型就会让机组“大开大合”。解决方式是在目标函数里加入对R矩阵的L2正则项% 在目标函数增加正则项倾向于选择较小的响应系数 objective objective lambda_reg * sum(sum(sum(Xi_LDR.^2)));λ_reg调参看效果太大则模型退化为确定性模型失去调节能力太小则R矩阵发散。我自己的经验是λ_reg取基础燃料成本的1/100左右比较合适。另外还可以给R系数加显式的上界约束比如|R_i,t,w|≤0.5彻底杜绝超调现象。从物理上说这相当于给AGC设置调节上限是符合实际运行规则的。5.5 一个容易忽略的坑线性准则与支持集约束的兼容性模糊集的矩约束处理起来比较容易但如果你在Ξ上还要求每个ξ下的约束严格成立比如在任何预测误差下都不能违反功率平衡线性准则和逐点约束结合后问题会变成一个半无限规划。直接放进Yalmip/Gurobi会严重拖慢求解甚至不可行。我采用的规避措施是把逐点约束转化成“在支持集有限个极端点下成立”的近似即在Ξ中取若干极端场景如所有风电场误差同时向上、同时向下、部分最坏组合检验约束满足性。这个近似虽然在理论上不是严格等价但在工程实践中足够可靠且求解速度提升巨大。如果追求严格性就需要引入S-Procedure逐条转换为LMI约束代码复杂度会高一个量级一般只在论文复现里才做。6. 代码运行环境与整体流程速览6.1 运行环境准备这套代码对运行环境没有特别苛刻的要求但有几个建议最好照做Matlab版本R2020a以上。R2019b也能运行但在高维sdpvar变量初始化时会有内存效率问题。Yalmip最新版即可注意从GitHub或官网获取不要用Matlab File Exchange上那些两三年没更新的老版本。Gurobi9.5或10.0版本。许可证可以申请学术免费版安装时选择Matlab接口这样Yalmip才能识别。代码本身不需要额外的Toolbox纯基础Matlab环境就够。6.2 主流程代码逻辑main.m里的流程大致是1. 加载系统数据机组参数、负荷、风电预测序列 2. 生成历史误差样本估计均值mu_hat和协方差Sigma_hat 3. 定义决策变量u, v, p, r0, Xi_LDR 4. 添加第一阶段约束启停逻辑、最小启停时间、出力上下限、爬坡约束 5. 添加第二阶段分布鲁棒目标通过矩信息展开期望项 6. 添加模糊集对偶约束半定约束 7. 调Gurobi求解输出结果 8. 后处理生成机组组合表、出力曲线、备用调用曲线和失负荷风险指标这段流程跑通之后替换数据文件和机组参数就可以迁移到其他测试系统上做实验。我目前已经在IEEE 118节点系统上用同样的代码跑过除了求解时间变长模型本身没有出现结构性的报错。6.3 结果后处理与可视化求解完成后我习惯把三类数据整理出来机组启停状态时间表Gantt图、各时段机组出力堆叠图和风电出力曲线对比图、各机组备用调用量和R系数热力图。可视化不仅是为了汇报好看更重要的是帮你确认结果是否“合理”——比如某台机组频繁启停、某时段出力逼近极限说明约束可能设置不当或是数据存在坏值。我在调试过程中靠可视化发现过两处风电数据索引错位问题这类问题不看曲线是根本发现不了的。7. 一些实操体会与后续扩展方向这套模型从搭建到调通我最深的体会是分布鲁棒优化的难点不在数学推导而在“把模型落到求解器里还能高效跑出来”。线性准则是一个很实用的近似手段它把两阶段随机优化的无穷维空间拉回到有限维让求解器能处理而且解出来的响应系数有明确的物理含义。对比场景法和传统鲁棒方法它在成本和风险之间的平衡是最好的——对历史数据不多、分布估计不准确的场景尤其适合。如果你正在做风电高渗透率下的机组组合课题可以从这里找切入点。如果后续想扩展我认为有三个方向比较有价值一是把水风光互补系统引入分布鲁棒框架二是把线性准则扩展到基于数据的非线性准则比如结合神经网络的分段仿射规则三是把模型从“离线调度”扩展到“滚动时域修正”。每个方向都会在数学和计算上带来新的挑战但也都对应着实际电力系统运行的真实需求。代码的模块化结构已经为这些扩展做了预留改起来不会太痛苦。最后说一个我自己的实操习惯每次改完模型先用小算例系统比如6机30节点跑通再上大系统可以帮你快速定位问题。Gurobi的MIPGap和时间限制在调试阶段最好设得宽松一点不然反复调参的时间都耗在等待求解上了。我最初调这个模型时因为追求gap太小白白浪费了不少时间在无意义的节点搜索上后来发现工程场景里把Gap放到1%到3%已经足够合适。希望这篇总结能让你少走一些弯路。
返回列表