SHOT(Supporting Hyperplane Optimization Tool)—— GAMS 混合整数非线性规划求解器
SHOT(Supporting Hyperplane Optimization Tool,支撑超平面优化工具)是 GAMS 内置的一款功能强大的开源求解器,专门用于求解混合整数非线性规划(MINLP)问题。SHOT 基于支撑超平面(SHP)和外逼近(EOA)等先进的凸化策略,能够高效处理包含非线性约束和整数变量的复杂优化问题。
SHOT 求解器的主要特点和优势包括:
- 支持凸与非凸 MINLP:SHOT 采用双模式策略,既能高效求解凸 MINLP 问题,也能通过多起点和启发式方法处理非凸 MINLP 问题。
- 多种算法引擎:集成了支撑超平面(SHP)和外逼近(EOA)两种核心算法,用户可根据问题特性灵活选择。
- 集成数值优化库:底层集成了 IPOPT、CBC、CppAD 等成熟的数值优化库,确保求解的稳定性和效率。
- 完全开源免费:作为 GAMS 开源求解器系列的一员,SHOT 可免费使用,降低用户的软件采购成本。
- 无缝集成 GAMS:完全兼容 GAMS 建模语言,用户无需额外学习即可在现有 GAMS 模型中直接调用 SHOT 求解器。
- 全局优化能力:针对非凸问题提供全局优化支持,帮助用户找到高质量的可行解。
SHOT 求解器广泛应用于化工过程优化、能源系统设计、供应链管理、工程经济分析等领域,特别适用于那些同时包含离散决策变量和非线性物理约束的复杂优化建模场景。无论是学术研究还是工业应用,SHOT 都凭借其开源特性和优异性能,成为 MINLP 求解领域的重要选择。
SHOT 求解器:算法、使用与选项
SHOT(Supporting Hyperplane Optimization Tool)是一款开源 NLP/MINLP 求解器,采用支撑超平面(Supporting Hyperplane)与数位优化法(Numeric Optimization)相结合的技术路线。SHOT 的核心思想是将原始混合整数非线性规划(MINLP)问题通过序列线性化或凸化策略转化为一系列更易求解的子问题(MILP/QP),从而在保证全局收敛性的同时兼顾求解效率。以下从 Algorithm、Usage、Options 三个章节详细介绍其核心内容。
目录
Algorithm(算法说明:支撑函数数位优化法)
SHOT 求解器的算法体系以支撑函数数位优化法(Supporting Hyperplane & Numeric Optimization)为核心,融合了两种互补的策略:
- 支撑超平面投影法(SHP, Supporting Hyperplane Projection):该策略在非线性可行域的凸包络外部构造一系列支撑超平面,将原问题中的非线性约束逐步线性化。每次迭代中,SHOT 求解一个 MILP 主问题,获得候选点后利用该点更新支撑超平面的位置,使得线性化模型不断逼近原非线性可行域。该方法对凸 MINLP 问题具有全局收敛性保证。
- 扩展外逼近法(EOA, Extended Outer Approximation):对非线性约束在整数变量固定后的 NLP 子问题求解点处进行一阶泰勒展开,构建线性/二次外逼近模型。通过交替求解 NLP 子问题(固定整数变量)和 MILP 主问题(更新整数变量),逐步逼近原问题的最优解。EOA 在处理强非线性约束时更具优势。
- 数位优化增强(Numeric Optimization Enhancements):SHOT 在算法框架中嵌入多种数值优化技术,包括梯度再计算、Hessian 近似更新、可行域修复策略以及自适应步长控制。这些技术确保线性化模型的数值稳定性和收敛速度。
- 非凸问题处理:对于非凸 MINLP,SHOT 采用多起点搜索(Multi-Start)、可行性泵(Feasibility Pump)以及基于 LP/NLP 分支定界的启发式整数变量固定策略,在合理时间内获得高质量可行解。
SHOT 的算法流程可概括为:初始化 → 构造线性化模型 → 求解 MILP 主问题 → 检查收敛条件 → 更新支撑超平面/外逼近 → 重复迭代直至满足最优性容忍度或达到迭代上限。在此过程中,SHOT 自动切换 SHP 与 EOA 模式,或根据用户指定的 Algorithm 选项固定使用某一种策略。
Usage(使用方法:OPTION NLP=SHOT; OPTION MINLP=SHOT; 示例)
SHOT 求解器同时支持 NLP 与 MINLP 两种问题类型。在 GAMS 模型中调用 SHOT 非常简单:
方式一:通过 OPTION 语句全局指定
option nlp = shot; * 将默认 NLP 求解器设为 SHOT
option minlp = shot; * 将默认 MINLP 求解器设为 SHOT
方式二:在 SOLVE 语句中直接指定
solve mynlp using nlp minimizing z;
solve myminlp using minlp maximizing profit;
完整示例:MINLP 模型调用 SHOT
* 示例:带整数变量的非线性优化问题
positive variables x1, x2;
integer variable y;
equations obj, con1, con2;
obj.. z =e= 2*x1 + 3*x2 + 5*y;
con1.. x1**2 + x2**2 =l= 10;
con2.. x1 + x2 + y =g= 4;
y.lo = 0; y.up = 5;
model example /all/;
option minlp = shot; * 指定使用 SHOT 求解器
option shotopt = shot.opt; * 指定选项文件(可选)
solve example using minlp minimizing z;
display z.l, x1.l, x2.l, y.l;
SHOT 支持的 GAMS 语法特性包括:连续变量(Positive, Negative, Free)、离散变量(Binary, Integer)、等式与不等式非线性约束、非线性目标函数、多变量索引与集合定义、条件表达式($ 控制)、Lagrange 乘子与对偶变量访问等。
求解完成后,可在 .lst 文件中查看详细求解日志,包括:迭代次数、MILP 节点数、目标函数值、最优性间隙、求解状态(Optimal / Infeasible / Unbounded / TimeLimit 等)及求解耗时。
Options(选项)
SHOT 提供丰富的求解选项,用户可通过 GAMS 的 option 语句或选项文件 shot.opt 进行配置。以下为常用选项:
| 选项名称 |
类型 |
默认值 |
说明 |
| Algorithm |
整数 |
1 |
核心算法选择:1=SHP(支撑超平面),2=EOA(外逼近),3=自动混合模式 |
| TimeLimit |
实数 |
1e10 |
求解时间上限(秒),到达后返回当前最优可行解 |
| IterationLimit |
整数 |
100000 |
最大主迭代次数(SHP/EOA 循环次数) |
| NodeLimit |
整数 |
100000 |
MILP 求解器最大分支节点数 |
| OptimalityTolerance |
实数 |
1e-6 |
最优性相对容忍度,决定算法何时判定已收敛到最优解 |
| ConstraintTolerance |
实数 |
1e-6 |
约束违反绝对容忍度,用于判断可行解 |
| Heuristics |
整数 |
1 |
启发式方法开关:0=禁用全部启发式,1=启用默认启发式 |
| MultiStart |
整数 |
0 |
多起点搜索次数:0=禁用,N≥1 表示从 N 个不同起点开始搜索 |
| OutputLevel |
整数 |
2 |
日志输出详细级别:0=无输出,1=简要,2=详细,3=调试(含算法内部信息) |
| MILPSolver |
字符串 |
CBC |
底层 MILP 求解器选择:CBC、CPLEX(如已许可)、Gurobi(如已许可)等 |
| FixInteger |
整数 |
0 |
是否固定整数变量(用于 NLP 子问题求解):0=不固定,1=固定当前整数解 |
| ScaleOption |
整数 |
1 |
模型缩放策略:0=不缩放,1=自动缩放,2=用户自定义缩放因子 |
在 GAMS 模型中通过以下方式配置选项:
* 方法一:使用选项文件
$onecho > shot.opt
Algorithm 2
TimeLimit 3600
OptimalityTolerance 1e-8
MultiStart 5
OutputLevel 1
$offecho
option shotopt = shot.opt;
* 方法二:直接通过 GAMS 选项设置(部分常用选项)
option reslim = 3600; * 求解时间上限(秒)
option optcr = 1e-6; * 最优性相对容忍度
option optca = 1e-8; * 最优性绝对容忍度
合理配置上述选项可显著影响求解效率与解质量:对于凸 MINLP,建议采用默认的 SHP 算法(Algorithm=1)并保持 Heuristics 开启;对于非凸问题,建议启用 MultiStart(如 MultiStart=10)以增强全局搜索能力;对于大规模模型,合理设置 TimeLimit 与 NodeLimit 可避免求解过程过度耗时。
在线留言
尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。
|