ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GAMS二次开发教程(12):求解器能力矩阵与选型——CPLEX/GUROBI/BARON/IPOPT/CONOPT 与许可边界

GAMS二次开发教程(12):求解器能力矩阵与选型——CPLEX/GUROBI/BARON/IPOPT/CONOPT 与许可边界 GAMS二次开发教程12求解器能力矩阵与选型——CPLEX/GUROBI/BARON/IPOPT/CONOPT 与许可边界版本与许可声明工具/软件GAMS版本号以官方发行说明为准本篇以gams.com/latest/docs指向的当前分发为口径。求解器版本锚点取自官方求解器手册总目录以官方发行说明为准。语言/环境GAMS 语言示例调用 NLP/MIP 求解器。本文目标把我这个模型该交给谁从听说某某求解器厉害变成先看模型类型再看求解器能力最后看许可边界的三步判定。许可边界求解任何模型都需要许可官方提供 demo license其规模约束以官方许可说明为准本篇涉及能不能并行能跑多大的结论一律同时标注许可与平台边界。一句话结论GAMS 的求解器选型只有一个可靠的判据链——先由Solve ... using 模型类型定死问题类别再用官方求解器手册的求解器/模型类型矩阵S_MAIN.html筛出能处理该类别的求解器最后用许可边界demo license 规模、Solver Link 许可、已移除的 bare-bone link 模式筛出你有权用的那几个局部求解器在modelstat上返回 2局部最优、全局求解器返回 1最优而且换求解器只允许改变求解器怎么停不允许改变已知最优解——目标值一变先怀疑模型再怀疑容差最后才怀疑求解器。〇、本篇要解决的认知问题Q1GAMS 与求解器是怎样的两层架构为什么求解器版本锚点必须以官方手册总目录为准而不能凭记忆Q2求解器 × 模型类型矩阵到底怎么读一个模型能不能交给某求解器判定依据是什么Q3局部求解器与全局求解器怎么判定在modelstat上分别对应什么码Q4同一模型换求解器后.lst里有哪些可对比的证据为什么这些差异不能解读成谁更快Q5许可边界有哪些坑demo license、Solver Link 许可、bare-bone link 三者是什么关系一、机制解析1.1 两层架构GAMS 负责生成求解器负责求解GAMS 的设计哲学可以概括成一句话建模语言与求解算法解耦。GAMS 把声明式的模型SETS/PARAMETERS/VARIABLES/EQUATIONS/MODEL编译、执行、重构后生成规范形式的模型实例交给某个求解器库或求解器进程求解器返回状态码、解的 level 与 marginalGAMS 再把它们回填到变量与方程的属性上.l/.m等。因此建模层的问题域错误、方程写错、模型类型标错与求解层的问题不可行、无界、迭代用尽、许可失败是两类问题诊断入口也不同换求解器在 GAMS 里是一行option语句的事——这正是同一模型换求解器能成为工程手段的原因但能换不等于等价求解器能处理的模型类型不同、返回的状态码含义不同、各自版本不同。求解器清单、版本锚点、以及哪个求解器支持哪个模型类型唯一权威出处是官方求解器手册总目录S_MAIN.html的求解器/模型类型矩阵与各求解器手册页。任何二手转述都可能过期。铁律 1版本先声明本篇出现的所有求解器版本号都是检索期锚点用于让你知道自己正在对哪一代求解器说话版本号以官方发行说明为准不要把它们写进项目的文档约束里当作固定契约。1.2 求解器版本锚点官方求解器手册总目录登记求解器版本锚点以官方发行说明为准主要角色CPLEX22.1LP/MIP/QCP 等线性与二次类的主力商业求解器GUROBI13.0LP/MIP/QCP 等的主力商业求解器XPRESS46.01LP/MIP 等的主力商业求解器MOSEK11锥规划含二阶锥方向COPT8.0LP/MIP 方向的商业求解器KNITRO15.1NLP/MINLP 方向BARON见官方手册全局优化求解器ANTIGONE1.1全局优化求解器LINDO / LINDOGLOBAL16.0全局优化方向SCIP10.0开源方向的 MIP/MINLP 求解器IPOPT3.14开源内点法 NLP 求解器CONOPT4及 CONOPT 3大型稀疏 NLP 的经典求解器MINOS5.6经典 NLP 求解器与 CONOPT 常被并提SNOPT7.7SQP 方向 NLP 求解器HiGHS1.12开源 LP/MIP 求解器SoPlex8.0开源 LP 求解器CBC2.10开源 MIP 求解器DICOPT2MINLP 的分解式求解器SBB见官方手册MINLP 的分支定界求解器AlphaECP2.11MINLP 的凸化/割平面方向SBB / DICOPT / AlphaECP见上三者都属于MINLP 求解器这一族诚实标注上表是检索期登记的锚点不同分发版本打包的求解器版本不同个别求解器在官方手册中未标注独立版本号表中写见官方手册。以官方发行说明与S_MAIN.html为准。1.3 求解器 × 模型类型矩阵怎么读读出什么矩阵的行是求解器列是模型类型。GAMS 的模型类型清单官方Model and Solve Statements章节包括LP、NLP、QCP、DNLP、MIP、RMIP、MINLP、RMINLP、MIQCP、RMIQCP、MCP、CNS、MPEC、RMPEC、EMP另有 MPSGE 作为完备性提及。读矩阵要读三件事类型是否可解某求解器是否出现在该类型的列里。这是能不能的唯一依据。R 前缀的语义RMIP/RMINLP/RMIQCP/RMPEC不是新问题类型而是把离散约束松弛后按对应类型求解。官方明确说明整数与二进制变量可取界内任意值SemiInteger/SemiCont可取 0 到上界之间的任意值SOS1/SOS2的非零个数限制被移除。所以先rmip探路再mip求整数解是完全合法的两段式写法。二次约束的额外门槛官方特别提示许多LP 求解器含 CPLEX提供求解凸二次模型的能力因此要求二次项的 Q 矩阵半正定此外还有二阶锥SOCP含对称锥与旋转锥的扩展。这意味着QCP 列里打勾不等于任何 QCP 都能解——凸性不满足时能力边界之外的东西不在矩阵里体现。用法把矩阵当筛选器而不是当排行榜。矩阵告诉你可解/不可解这一布尔判断矩阵不告诉你速度。1.4 局部求解器与全局求解器modelstat是唯一判据NLP/MINLP 求解器分两类局部求解器从初始点出发收敛到它找到的局部最优全局求解器对给定问题类给出全局最优官方手册中带 Global 标记的一族如 BARON、ANTIGONE、LINDOGLOBAL、SCIP 等具体名单以S_MAIN.html为准。这个区别在结果里是可核验的靠modelstat读码官方枚举含义现实语义1找到最优解全局话语MIP/LP 与全局求解器2找到局部最优解局部求解器解 NLP 的典型返回4 / 5 / 6不可行 / 局部不可行 / 提前终止且当时仍不可行“不可行家族”三者的处置完全不同8 / 10找到整数解 / 找不到可行整数解MIP 场景的两种归宿所以用 CONOPT 解一个非凸 NLP 得到modelstat2是预期行为不是 bug把它当成全局最优去做商业决策才是 bug。铁律 7调优不承诺性能本篇不写某求解器在某类模型上一定更快。求解器之间的速度关系属于基准测试领域取决于具体实例、机器、线程数与版本正确的做法是用你自己的算例做对照实验并把速度与能力分开记录。1.5 许可边界三重门这是最容易被教程略过、却最先卡住人的一层。官方对每台 GAMS 安装都区分GAMS 系统本身的许可含 demo license官方提供 demo license可用其规模约束以官方许可说明为准——教程里任何demo 能跑多大的具体数字都不要信包括本篇。求解器许可Solver Link求解行为受求解器链接许可约束。表现到 GAMS 层就是两个状态码——solvestat7求解器因许可错误而终止与modelstat11许可问题。看到这两个码不要再改模型去查许可。裸链接模式bare-bone link的变化官方发行说明登记过相关调整例如原GAMS/OSICPLEX这类裸链接模式已被移除。具体哪些链接模式可用、各自的行为差异以官方发行说明为准。铁律 2许可先讲清凡是涉及求解/并行/规模/平台的结论必须同时说明许可或平台边界。本篇的三条边界就是求解需要许可并行是否可用取决于求解器许可与线程安全平台差异例如某些工具仅 Windows会影响整条流水线。1.6 官方选型指引MINOS vs CONOPT、PATH vs MILESGAMS 官方在求解器使用章节里专门写了两篇选型指引这说明选型问题是被官方承认的、需要正面回答的问题MINOS 与 CONOPT 的相对优劣官方给出的结构是如何在 MINOS 与 CONOPT 之间选择“为什么严肃的 NLP 建模者应该同时拥有两者”。这个结构本身就是一个工程结论NLP 选型不是单选而是用两个工具互相验证。PATH vs MILES这是 MCP混合互补问题方向上的官方对比。本篇不重复官方手册的结论以官方手册为准只记方法论遇到 NLP/MCP 这类对算法假设敏感的模型类型选型动作是两个都试而不是投票选一个。1.7 选型工作流可执行版定类型确认Solve ... using 类型的类型标注正确——官方会在模型类型不符时报错例如号称线性却含非线性项查矩阵在S_MAIN.html的求解器/模型类型矩阵中筛出可解该类型的求解器集合查许可在你的 GAMS 安装上用option subSystems ;把本机实际可用的求解器清单打进.lst见代码 12-2与第 2 步的集合求交做对照对交集里的候选逐一求解记录modelstat、solvestat、iterUsd、resUsd与目标值做回归用一个已知最优解的小案例确认换求解器没有改变最优值铁律 8。二、完整代码与逐行剖析代码 12-1同一 NLP 交给三个求解器完整可运行含已知最优解回归$title ch12_nlp_swap - 同一 NLP 换求解器CONOPT / IPOPT / BARON 对照 * 适用分发口径以 gams.com/latest/docs 当前分发为准求解器版本以官方发行说明为准 * 求解许可本段调用 SOLVE需要所用 NLP 求解器许可以官方许可说明为准 * 平台GAMS 语句通用求解器可用性以本机安装与许可为准 * ---- 一个已知最优解的小 NLP作为换了求解器也不许改答案的回归基准 ---- Variables x1, x2, obj ; x1.lo -10 ; x1.up 10 ; x2.lo -10 ; x2.up 10 ; * 给一个偏离最优的初始点让不同算法走出不同的迭代路径 x1.l 5 ; x2.l 5 ; Equation defObj objective: distance to (1,2) ; Equation conSum x1 x2 must be at least 3 ; defObj .. obj e sqr(x1 - 1) sqr(x2 - 2) ; conSum .. x1 x2 g 3 ; Model rosen / all / ; * ---- 结果收集容器按求解器名索引 ---- Set sv candidate NLP solvers / conopt, ipopt, baron / ; Parameter objv(sv) objective value reported by each solver mstat(sv) modelStat of each run sstat(sv) solveStat of each run itU(sv) iterUsd of each run rsU(sv) resUsd of each run (seconds) ; * * 候选 1CONOPT经典大型稀疏 NLP 求解器 * option NLP CONOPT ; Solve rosen using nlp minimizing obj ; objv(conopt) obj.l ; mstat(conopt) rosen.modelStat ; sstat(conopt) rosen.solveStat ; itU(conopt) rosen.iterUsd ; rsU(conopt) rosen.resUsd ; * * 候选 2IPOPT开源内点法 NLP 求解器 * option NLP IPOPT ; Solve rosen using nlp minimizing obj ; objv(ipopt) obj.l ; mstat(ipopt) rosen.modelStat ; sstat(ipopt) rosen.solveStat ; itU(ipopt) rosen.iterUsd ; rsU(ipopt) rosen.resUsd ; * * 候选 3BARON全局优化求解器modelstat 期望为 1 而不是 2 * option NLP BARON ; Solve rosen using nlp minimizing obj ; objv(baron) obj.l ; mstat(baron) rosen.modelStat ; sstat(baron) rosen.solveStat ; itU(baron) rosen.iterUsd ; rsU(baron) rosen.resUsd ; * ---- 回归闸门最优值必须都是 0解析解在 (1,2)目标值 0---- abort$(smax(sv, abs(objv(sv))) 1e-6) REGRESSION FAILED: objective drifted; option decimals 4 ; Display objv, mstat, sstat, itU, rsU, x1.l, x2.l ;逐行剖析defObj .. obj e sqr(x1 - 1) sqr(x2 - 2) ;与conSum .. x1 x2 g 3 ;构成一个无约束最优恰好在约束边界上的问题——无约束极小点(1,2)满足x1x23因此全局最优目标值是 0这是一个可以手算验证的基准x1.l 5 ; x2.l 5 ;故意给一个偏离最优的初始点默认初始点是 0 或最接近 0 的边界让不同算法的迭代路径分叉三次option NLP ... ;分别把同一模型交给 CONOPT、IPOPT、BARON这就是同一模型换求解器的最小实证rosen.modelStat、rosen.solveStat、rosen.iterUsd、rosen.resUsd是解后属性把停在哪、用了多少迭代、花了多少墙上时间一起带出来abort$(smax(sv, abs(objv(sv))) 1e-6) ... ;是回归闸门——只要任一求解器给出的目标值偏离 0 超过 1e-6 就中止程序这比肉眼看表可靠得多Display输出mstat时你应当看到局部求解器返回 2、全局求解器返回 1这是本篇最重要的一个观察结果。代码 12-2盘点本机可用求解器 松弛/整数两段式求解完整可运行$title ch12_inventory - subSystems 盘点 RMIP 探路 MIP 求整数解 * 适用分发口径subSystems 与模型类型的语义以官方 Option Statement / Model and Solve 章节为准 * 求解许可需要 MIP 求解器许可以官方许可说明为准 * 平台GAMS 语句通用 * ---- 第一步把本机有哪些求解器、当前默认是谁、本次实际用谁写进 .lst ---- option subSystems ; Sets t planning periods / t1, t2, t3, t4 / s supply options / s1, s2 / ; Parameters dem(t) demand per period / t1 40, t2 60, t3 55, t4 70 / fixed(s) fixed charge if supply option s is opened / s1 120, s2 200 / varcost(s) variable cost per unit from supply option s / s1 3, s2 2 / cap(s) capacity per period if opened / s1 60, s2 90 / ; Variables x(t,s) units supplied from option s in period t y(s) 1 if supply option s is opened cost total cost ; Binary Variable y ; Positive Variable x ; Equations obj minimize fixed plus variable cost satisfy(t) demand must be met in every period capLim(t,s) capacity limit, active only if opened (big-M style) ; obj .. cost e sum(s, fixed(s)*y(s)) sum((t,s), varcost(s)*x(t,s)) ; satisfy(t) .. sum(s, x(t,s)) g dem(t) ; * ---- 能力上限未开工则 x 必须为 0开工则受 cap 限制 ---- capLim(t,s) .. x(t,s) l cap(s)*y(s) ; Model plan / all / ; * ---- 求解器绑定松弛类型与实际类型分别绑定避免默认求解器不支持 ---- option RMIP CPLEX ; option MIP CPLEX ; * ---- 第一段松弛掉 0-1 约束先拿一个下界探路---- Solve plan using rmip minimizing cost ; Scalar lbRelaxed lower bound from the relaxed problem ; lbRelaxed cost.l ; * ---- 第二段求整数解上一段的解会自动成为这一段的初始点 ---- Solve plan using mip minimizing cost ; * ---- 状态码防御先看求解器是否正常终止再看解的成色 ---- abort$(plan.solveStat 1) SOLVER-LEVEL STOP: see solveStat; abort$(plan.modelStat 1 and plan.modelStat 8) NO OPTIMAL/INTEGER SOLUTION: see modelStat; Display lbRelaxed, cost.l, y.l, x.l, plan.modelStat, plan.solveStat ;逐行剖析option subSystems ;是官方选项表中其它选项里的一条官方描述为把可用求解器清单以及当前默认求解器与生效求解器列进 LST 文件——它是我到底有什么的唯一实证手段比任何教程里的求解器名单都可靠因为它是你这台机器的真名册capLim(t,s) .. x(t,s) l cap(s)*y(s) ;是最朴素的 big-M 式能力约束用容量本身当 M而不是拍一个 9999这是让未开工即零产出逻辑成立的写法option RMIP CPLEX ;与option MIP CPLEX ;分类型绑定这是实践中的关键习惯——很多求解器不支持的报错来自我只设了MIP忘了RMIP也会走一遍求解器选择先rmip再mip的两段式不仅给出一个松弛下界lbRelaxed第二次求解还会自动把第一次的解当作初始点官方说明多个solve语句之间前一次求解的解会被用于初始化后一次的初始点因为它同样存在于变量与方程的 level/marginal 中最后两条abort$是状态码路由solvestat 1属于求解器级问题modelStat不是 1 或 8 属于解的质量问题两类问题的处置方向完全不同。代码 12-3把状态码路由成下一步动作完整可运行$title ch12_code_router - modelstat / solvestat - 处置动作 * 适用分发口径状态码含义以官方 ModelStat / SolveStat 枚举与各求解器手册为准 * 求解许可本段调用 SOLVE需要 LP 求解器许可以官方许可说明为准 * 平台GAMS 语句通用 Set i canning plants / seattle, san-diego / ; Set j markets / new-york, chicago, topeka / ; Parameter a(i) / seattle 350, san-diego 600 / b(j) / new-york 325, chicago 300, topeka 275 / ; Table d(i,j) new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4 ; Scalar f / 90 / ; Parameter c(i,j) ; c(i,j) f * d(i,j) / 1000 ; Variables x(i,j), z ; Positive Variable x ; Equations cost, supply(i), demand(j) ; cost .. z e sum((i,j), c(i,j)*x(i,j)) ; supply(i) .. sum(j, x(i,j)) l a(i) ; demand(j) .. sum(i, x(i,j)) g b(j) ; Model transport / all / ; option LP CPLEX ; Solve transport using lp minimizing z ; * ---- 处置动作字符串由状态码组合决定而不是只由某一个码决定 ---- Parameter action next action for the current modelStat/solveStat pair ; if (transport.solveStat 1, action SOLVER SIDE: inspect solver log then reconsider solver choice or license ; elseif transport.modelStat 1 or transport.modelStat 8, action ACCEPT: solution is optimal (or integer feasible) ; elseif transport.modelStat 2, action ACCEPT WITH CAUTION: locally optimal only, use a global solver if needed ; elseif transport.modelStat 3, action MODEL SIDE: unbounded, check variable bounds ; elseif transport.modelStat 4 or transport.modelStat 5 or transport.modelStat 6, action MODEL SIDE: infeasible family, check constraints and right-hand sides ; elseif transport.modelStat 10, action MODEL SIDE: no feasible integer solution, check discrete constraints ; else action UNCLASSIFIED: refer to the official status code tables ; ) ; Display transport.modelStat, transport.solveStat, action ;逐行剖析if (cond, stmts; elseif cond, stmts; else stmts; ) ;是 GAMS 的执行期分支结构整段以一个分号收尾判断顺序刻意先判solveStat再判modelStat——因为求解器级失败会污染解的质量判读先排除它才能正确解读modelStatmodelStat 2单独成一支并给出局部最优必要时换全局求解器的提示这是把第 1.4 节的判定标准落成代码else分支不硬猜直接指向官方状态码表——未知类别就承认未知这比编一个看起来合理的动作安全。三、常见报错与排查排查 3-1求解器不可用。现象option LP CPLEX ;之后求解失败提示找不到该求解器或链接不可用。根因该求解器未随本分发安装、未链接或你所持许可不含它。解法先用option subSystems ;把本机可用清单打进.lst与实际调用的名字逐字比对确认名字不在清单里就换求解器或补安装具体哪些求解器随哪个分发提供、哪些需要单独链接以官方发行说明为准。排查 3-2solvestat6求解器因模型超出其能力而终止。现象模型能生成、能提交但求解器直接退出。根因你把这个模型类型交给了不支持它的求解器——例如把MIQCP/QCP交给只做 LP/MIP 的求解器或把MCP交给一个 NLP 求解器。解法回到求解器/模型类型矩阵确认该列里是否有这个求解器二次类还要进一步确认凸性要求官方说明许多 LP 求解器只接受半正定Q 矩阵。不要在这种情况下改iterLim/resLim那是无效动作。排查 3-3solvestat7或modelstat11许可错误。现象模型与求解器都正确仍失败。根因求解器链接许可问题。解法停止改模型检查 GAMS 与求解器许可注意 demo license只覆盖有限范围具体规模以官方许可说明为准同时注意分发升级可能与License Check Date的规则相关Major 设定、Minor/Maintenance 沿用以官方发行说明为准。排查 3-4modelstat4/5/6/10混用把提前终止当成模型不可行。现象一次超时运行返回modelstat6你按模型不可行去改约束。根因官方枚举里4是不可行、5是局部不可行、6是求解器提前终止且当时仍不可行、10是找不到可行整数解——四者的处置方向不同。解法先看solvestat是不是 2 或 3迭代用尽 / 超时若是则modelstat6属于截断产物应放宽预算重跑而不是改模型。排查 3-5换了求解器后目标值变了。现象同一模型、不同求解器最优值不同。根因排查顺序不要跳步① 模型在两次运行之间被改过含数据文件② 新的求解器是局部求解器而旧的是全局的modelstat会从 1 变 2③ 最优性容差optCR/optCA不同导致够好就停停在不同点④ 真的换了问题例如换了RMIP/MIP的求解类型。解法用已知最优解的小案例做回归代码 12-1 的abort$闸门就是为此设计的把差异定位到上述四类之一。排查 3-6只绑定了MIP没绑定RMIP两段式求解中途出问题。现象先用rmip探路的脚本在第二个求解语句报求解器不支持。根因option语句是按模型类型分别绑定的MIP的绑定不会自动继承给RMIP。解法对实际会用到的每一个类型显式绑定option RMIP CPLEX ;与option MIP CPLEX ;并列或改用粗粒度的option solver CPLEX ;官方描述对该求解器能处理的所有模型类型设为默认但要接受粗粒度带来的不可控。四、动手练习练习 1全局 vs 局部实证运行代码 12-1。判定(a)objv三个值都约等于 0(b)x1.l约等于 1、x2.l约等于 2© 能指出哪几个求解器的mstat是 2、哪几个是 1并解释原因。练习 2回归闸门把defObj里sqr(x2 - 2)改成sqr(x2 - 2.5)把abort$的阈值改成 1e-6 后重跑。判定程序按预期中止并能说出新的解析最优值提示(1, 2.5)仍满足x1x23.53故最优值为 0.25。练习 3能力边界把代码 12-1 的Solve rosen using nlp改成using mip并声明Binary Variable之外不做其它改动。判定能说清这次失败属于模型类型标注错误还是求解器能力不足并给出验证方法看solvestat是否为 6。练习 4本机求解器名册运行代码 12-2 的第一行option subSystems ;在.lst中找出可用求解器清单。判定能列出本机可用求解器并指出当前的默认求解器与本次生效求解器分别是哪个。练习 5状态码路由运行代码 12-3然后用option resLim 0.001 ;人为制造超时结果随机器而异。判定能给出solveStat与modelStat的组合并说明action落在哪一支、为什么先判solveStat是正确的顺序。五、小结与下一篇预告本篇把选型拆成三步定类型 → 查矩阵 → 过许可并把换求解器从口号变成可复现的实验同一模型、多求解器、记录状态码与统计量、用已知最优解做回归闸门。三个必须记住的判定局部求解器返回modelstat2、全局返回 1solvestat6是能力不足、solvestat7是许可问题R前缀的模型类型是松弛版本不是新问题。同时也把两条纪律带下去版本先声明铁律 1、许可先讲清铁律 2以及一条禁止项——不承诺性能铁律 7。第 13 篇《求解器调优与 warm start》进入求解过程本身GAMS 到底把什么当初始点传给求解器level与marginal组成的 starting point缺省为 0 或最接近 0 的边界、advanced basis 与bratio的提示公式hint : (0 bRatio) or (rowsWithNonzeroMarg nRows * bratio)、savepoint与execute_loadpoint如何把求解点存成 GDX 再注入、save/restart的工作文件.g00机制与适用场景以及mipstart/tryint这类必须显式开启才生效的 MIP 起点选项——那是把重求解从重跑一遍变成接着上一次往前推的关键一章。本篇认知问题回显FAQQ1GAMS 与求解器是怎样的两层架构为什么求解器版本锚点必须以官方手册总目录为准AGAMS 是声明式建模语言 外部求解器驱动的两层架构GAMS 负责编译、执行、重构模型并生成规范形式的模型实例求解器负责实际求解然后把状态码与解的 level、marginal 回填到 GAMS 的变量与方程属性.l/.m上。因此建模层问题域错误、方程写错、模型类型标错与求解层问题不可行、无界、迭代用尽、许可失败是两类问题诊断入口不同。求解器清单、版本锚点与某求解器支持哪些模型类型唯一权威出处是官方求解器手册总目录S_MAIN.html的求解器/模型类型矩阵与各求解器手册页不同分发打包的求解器版本不同教材式转述与记忆都可能过期因此所有版本号都应视为检索期锚点并注明以官方发行说明为准。Q2求解器 × 模型类型矩阵怎么读一个模型能不能交给某求解器判定依据是什么A矩阵的行是求解器、列是 GAMS 模型类型LP、NLP、QCP、DNLP、MIP、RMIP、MINLP、RMINLP、MIQCP、RMIQCP、MCP、CNS、MPEC、RMPEC、EMP等。读法有三层① 类型是否可解——某求解器是否出现在该类型列中这是能不能的唯一依据②R前缀的语义——RMIP/RMINLP/RMIQCP/RMPEC不是新问题类型而是把离散约束松弛后按对应类型求解整数与二进制变量可取界内任意值SemiInteger/SemiCont可取 0 到上界之间任意值SOS1/SOS2的非零个数限制被移除③ 二次约束的额外门槛——许多 LP 求解器含 CPLEX提供求解凸二次模型的能力要求二次项 Q 矩阵半正定另有二阶锥SOCP扩展。矩阵是筛选器而不是排行榜它只回答可解与不可解不回答快慢。Q3局部求解器与全局求解器怎么判定各自在modelstat上是什么码A局部求解器从初始点出发收敛到它找到的局部最优全局求解器对给定问题类给出全局最优官方手册中带 Global 标记的一族如 BARON、ANTIGONE、LINDOGLOBAL、SCIP 等具体名单以官方手册为准。判定落在模型解的返回码上modelstat1表示找到最优解对应 LP/MIP 与全局求解器的话语modelstat2表示找到局部最优解是局部求解器解 NLP 的典型返回。因此用一个局部求解器解非凸 NLP 得到modelstat2属于预期行为把它当作全局最优去做决策才是问题。MIP 场景另有modelstat8找到整数解与modelstat10找不到可行整数解。Q4同一模型换求解器后.lst里有哪些可对比的证据为什么这些差异不能解读成谁更快A可对比的证据有modelStat解的成色1 最优 / 2 局部最优 / 8 整数解等、solveStat求解器终止原因1 正常 / 2 迭代用尽 / 3 超时 / 6 能力不足 / 7 许可错误等、iterUsd本次求解使用的迭代数、resUsd本次求解使用的资源时间秒以及目标值.l与变量解的 level/marginal。这些差异不能解读成速度排名原因有二一是求解器之间的相对快慢取决于具体实例、机器、线程数与版本属于基准测试领域二是能力与速度是两件事——一个求解器返回modelstat1而另一个返回modelstat2这是能力差异全局 vs 局部不是速度差异。正确做法是在自己的算例上做对照实验并把能力与时间分开记录。Q5许可边界有哪些坑demo license、Solver Link 许可、bare-bone link 三者是什么关系A三层边界。第一层是 GAMS 系统本身的许可官方提供 demo license 可用其规模约束以官方许可说明为准——任何教程给出的具体规模数字都不可信。第二层是求解器许可Solver Link求解行为受求解器链接许可约束在 GAMS 层的表现为两个状态码solvestat7求解器因许可错误而终止与modelstat11许可问题看到这两个码应当停止改模型转向排查许可。第三层是链接模式的差异官方发行说明登记过相关调整例如原GAMS/OSICPLEX这类裸链接模式已被移除具体哪些链接模式可用及其行为差异以官方发行说明为准。此外分发升级涉及License Check Date规则Major 发行会设定新的校验日期Minor/Maintenance 沿用前一 Major因此旧许可在 Minor 升级后仍可能可用细节以官方发行说明为准。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进