SCIP 求解器 — 开源混合整数规划求解器


 

SCIP(Solving Constraint Integer Programs)是目前性能最强、功能最全面的开源混合整数规划(MIP)求解器之一,由德国柏林 Zuse Institute(ZIB)主导开发。SCIP 已成功集成到 GAMS 中,为用户提供强大的数学优化能力,支持从线性规划到约束整数规划的广泛问题类型。

SCIP 支持求解以下类型的问题:

  • 线性规划(LP) — 通过集成的 SoPlex 求解器
  • 混合整数线性规划(MIP) — 分支定界、切割平面、启发式算法
  • 混合整数二次规划(MIQP)
  • 混合整数二次约束规划(MIQCP)
  • 混合整数非线性规划(MINLP)
  • 约束整数规划(CIP) — SCIP 独有的特色,融合了约束规划和整数规划

SCIP 的核心优势包括:灵活的插件架构、丰富的预处理技术和切割平面生成器、多种启发式算法支持,以及强大的分支策略。作为开源求解器,SCIP 拥有活跃的社区和持续的更新维护,广泛应用于学术研究和工业优化场景。在 GAMS 中使用 SCIP 求解器,用户可以通过简单的选项配置调用其全部功能,无需额外学习成本。

目录


第一章:SCIP 概述

SCIP 由德国柏林 Zuse Institute(ZIB)的 Tobias Achterberg 博士在其博士论文工作中创立,目前由一个国际化的开发团队持续维护和扩展。SCIP 的名称源自 "Solving Constraint Integer Programs",其核心理念是将约束规划(Constraint Programming, CP)与混合整数规划(MIP)的技术深度融合。

SCIP 采用基于 LP 的分支定界框架,但通过其独特的约束处理程序和插件架构,能够处理远超传统 MIP 求解器范围的问题类型。这种灵活性使 SCIP 成为学术研究、教学和工业应用的理想平台。

作为开源求解器,SCIP 在性能上与许多商业求解器不相上下,在特定问题类别上甚至更具优势。其源代码采用 Apache 2.0 许可证发布,允许自由使用、修改和分发。

SCIP 的主要版本持续演进,每个版本都带来性能提升和功能增强。在 GAMS 中集成的 SCIP 版本保持与官方版本的同步更新,确保用户能够获得最新的求解能力。

第二章:支持的问题类型

SCIP 支持广泛的问题类型,涵盖了数学优化的主要领域:

2.1 线性规划(LP)

SCIP 通过集成的 SoPlex 求解器处理线性规划问题。SoPlex 是一个专为 SCIP 设计的高性能线性规划求解器,实现了修正单纯形法和原始单纯形法。用户也可以选择使用其他 LP 求解器作为底层驱动,如 CPLEX 或 Gurobi(通过相应的接口)。

2.2 混合整数线性规划(MIP)

MIP 是 SCIP 的核心能力所在。SCIP 实现了完整的 MIP 求解流程,包括预处理、启发式、切割平面、分支定界等环节。SCIP 在 MIP 求解性能上持续与顶级商业求解器竞争,在 MIPLIB 基准测试中表现优异。

2.3 混合整数二次规划(MIQP)

SCIP 支持目标函数包含二次项的混合整数二次规划问题。通过将二次目标函数线性化或直接处理二次项,SCIP 能够高效求解具有二次目标的优化问题。

2.4 混合整数二次约束规划(MIQCP)

对于包含二次约束的问题,SCIP 提供了多种处理技术,包括二阶锥规划(SOCP)松弛和线性化方法。SCIP 能够识别并利用问题的特殊结构来加速求解。

2.5 混合整数非线性规划(MINLP)

SCIP 支持求解混合整数非线性规划问题,包括具有非线性目标函数或约束的问题。SCIP 集成了多种非线性处理技术,包括空间分枝定界法、外部逼近法和逐步线性化方法,能够处理连续和离散变量的非线性问题。这使得 SCIP 在实际工程优化、化工过程和能源系统优化等领域具有广泛的应用价值。

2.6 约束整数规划(CIP)

CIP 是 SCIP 独有的问题类别,它将约束规划(CP)的约束处理能力与 MIP 的线性规划技术相结合。CIP 允许使用任意类型的约束,只要这些约束能够通过约束处理程序(constraint handler)进行处理。这种灵活性使 SCIP 能够解决传统数学规划方法难以处理的问题。

第三章:求解算法与技术

SCIP 采用先进的求解框架,整合了多种优化算法:

3.1 分支定界法(Branch-and-Bound)

分支定界是 SCIP 的核心算法框架。SCIP 通过递归地将问题分解为子问题(分支),利用松弛解提供下界,利用可行解提供上界,通过剪枝操作缩小搜索空间。SCIP 实现了多种分支定界变体,包括:

  • LP 基分支定界 — 标准的分支定界方法,利用 LP 松弛提供下界
  • 非线性分支定界 — 针对 MINLP 问题的空间分枝定界法
  • 混合分支定界 — 结合多种松弛策略的混合方法

3.2 分支切割法(Branch-and-Cut)

在分支定界框架中集成切割平面生成,通过动态添加有效不等式来加强松弛,提升下界质量。SCIP 包含丰富的切割平面生成器,在求解过程中的多个节点自动调用。

3.3 分支定价法(Branch-and-Price)

SCIP 支持列生成(column generation)方法,适用于具有大量变量的结构化问题。通过动态生成变量而不是一次性枚举所有变量,SCIP 能够高效求解大规模优化问题。

3.4 冲突分析(Conflict Analysis)

SCIP 从整数组分数解中学习冲突约束,利用这些信息避免在未来搜索中重复探索相同的不可行区域,显著提升搜索效率。

3.5 节点选择与搜索策略

SCIP 支持多种节点选择策略,包括深度优先搜索、最佳优先搜索、广度优先搜索以及混合策略。用户可以通过参数调整搜索策略以适应特定问题类型。

第四章:预处理与切割平面

4.1 预处理技术

SCIP 的预处理模块在正式求解之前对问题模型进行简化,减少问题规模并改善数值特性:

  • 系数约简 — 利用约束的上下界简化系数
  • 冗余约束检测 — 识别并移除被其他约束支配的冗余约束
  • 固定变量 — 检测并固定可通过约束推理确定的变量
  • 代理约束(Probing) — 通过临时固定变量推断变量关系
  • 双固定(Dual Fixing) — 利用对偶信息减少变量数量
  • 系数缩放 — 改善矩阵的数值条件
  • 隐式整数变量检测 — 识别虽声明为连续但实际上只能取整数值的变量

4.2 切割平面生成器

SCIP 集成了丰富的切割平面族,在求解过程中动态生成并添加到 LP 松弛中:

  • Gomory 切割 — 经典的 Gomory 混合整数切割
  • 夹紧切割(Clique Cuts) — 基于变量之间的互斥关系
  • 覆盖切割(Cover Cuts) — 针对背包约束的强切割
  • 流覆盖切割(Flow Cover Cuts) — 针对固定费用流问题
  • 蕴涵切割(Implication Cuts) — 基于变量逻辑关系
  • 析取切割(Disjunctive Cuts) — 利用析取约束的强切割
  • 混合整数舍入切割(MIR Cuts) — 一般化的舍入切割
  • 提升/投影切割(Lift-and-Project Cuts)
  • 零半切割(Zero-half Cuts)

SCIP 的切割管理器和分离循环策略确保切割平面能够有效改进松弛质量,而不会因过多切割导致 LP 求解负担过重。

第五章:启发式算法

SCIP 包含了丰富的启发式算法集合,用于快速寻找高质量可行解:

5.1 启始启发式(Start Heuristics)

在分支定界过程开始前运行的启发式算法,力求快速获得初始可行解:

  • 舍入启发式 — 将 LP 松弛解舍入为整数可行解
  • 邻域搜索 — 基于根节点松弛解的局部搜索
  • 简单舍入 — 快速试探性舍入策略

5.2 大邻域搜索(Large Neighborhood Search, LNS)

LNS 是 SCIP 中最有效的启发式策略之一,通过固定部分变量然后在缩小的问题空间上求解:

  • RINS(Relaxation Induced Neighborhood Search) — 基于松弛解与当前最优解的差异固定变量
  • Local Branching — 在当前最优解的邻域内搜索
  • Mutation — 随机固定变量
  • DINS(Distance Induced Neighborhood Search) — 基于距离的邻域策略
  • Proximity Search — 靠近最优已知解搜索

5.3 改进启发式(Improvement Heuristics)

在求解过程中持续运行,尝试改进当前最优解的质量:

  • 交叉交换(Crossover) — 结合多个解的特征生成新解
  • 单分支(One-Opt) — 翻转一个变量的值
  • 两分支(Two-Opt) — 交换两个变量的值
  • 量化启发式 — 基于目标函数值排序的改进策略

5.4 可行解搜寻(Feasibility Pump)

Feasibility Pump 是一种专门用于寻找 MIP 问题可行解(而不一定最优)的启发式算法。它通过在 LP 松弛解和整数投影解之间迭代交替,快速收敛到整数组可行解。SCIP 还包含改进版的 Feasibility Pump 2 和 Objective Feasibility Pump。

第六章:分支策略

分支策略是影响 MIP 求解效率的关键因素之一。SCIP 提供了多种分支规则:

6.1 最可信分支(Most Infeasible Branching)

选择分数部分最接近 0.5 的变量进行分支。这是经典的默认分支策略,但在实践中一般不优先选择。

6.2 伪代价分支(Pseudo Cost Branching)

基于历史求解信息估计每个变量的分支效果,选择预期改进最大的变量。伪代价分支通过在求解过程中积累每个变量的上下分支经验数据,逐步提高分支决策质量。

6.3 强分支(Strong Branching)

在作出分支决策前,对候选变量进行实际的 LP 求解测试,评估每个变量的分支效果。强分支通常能产生更小的搜索树,但每次分支决策的计算成本较高。

6.4 可靠伪代价分支(Reliable Pseudo Cost Branching)

结合伪代价分支和强分支的混合策略。对于伪代价估计不够可靠的变量(历史数据不足),使用强分支评估;对于可靠的变量,直接使用伪代价估计。这种策略在分支质量和计算成本之间取得了良好的平衡。

6.5 混合分支(Hybrid Branching)

SCIP 的默认分支策略是混合分支,它综合运用上述多种分支规则,根据求解状态动态选择最适合的规则。

第七章:插件架构与扩展

SCIP 的最大优势之一是其模块化的插件架构。用户可以通过编写插件来扩展 SCIP 的功能:

7.1 核心组件

  • 约束处理程序(Constraint Handler) — 定义约束的传播、检查、分离和线性化操作
  • 变量处理程序(Variable Handler) — 定义变量的域传播和分支操作
  • 节点选择器(Node Selector) — 定义搜索树节点选择策略
  • 分支规则(Branching Rule) — 定义分支变量选择策略
  • 切割生成器(Separator) — 定义新的切割平面族
  • 启发式算法(Heuristic) — 定义新的启发式搜索策略
  • 事件处理器(Event Handler) — 响应求解过程中发生的事件
  • 对话处理器(Dialog Handler) — 扩展命令行交互功能
  • 显示处理器(Display Handler) — 自定义求解过程信息显示

7.2 应用扩展

基于 SCIP 的插件架构,已经开发了多个专门的应用求解器:

  • SCIP-SDP — 用于求解半定规划(SDP)问题的扩展
  • SCIP-Jack — 用于求解 Steiner 树问题的专用求解器
  • SCIP-MIQP — 针对混合整数二次规划的特殊处理
  • UG(Ubiquity Generator) — 用于并行化和分布式计算框架
  • GCG(Generic Column Generation) — 自动列生成框架,用于识别问题中的特殊结构并应用分解方法
  • PolySCIP — 多目标优化的扩展模块

插件架构使 SCIP 不仅是一个求解器,更是一个优化研究平台。研究人员可以方便地实现和测试新的算法思想,并在真实的基准测试中评估其性能。

第八章:GAMS 集成与使用

8.1 基本使用

在 GAMS 中使用 SCIP 求解器非常简单,只需在 solve 语句中指定求解器名称为 SCIP:

Model mymodel /all/;
Solve mymodel using MIP minimizing z;

GAMS 会自动将模型转换为 SCIP 可接受的格式,并调用 SCIP 进行求解。GAMS 与 SCIP 之间通过共享内存进行高效的数据交换。

8.2 支持的模型类型

在 GAMS 中,SCIP 支持以下模型类型:

  • LP — 线性规划
  • MIP — 混合整数线性规划
  • RMINLP — 松弛混合整数非线性规划(通过 SCIP 的 MINLP 能力)
  • MINLP — 混合整数非线性规划
  • QCP — 二次约束规划
  • MIQCP — 混合整数二次约束规划
  • CNS — 约束非线性系统(作为约束满足问题处理)

8.3 GAMS 选项配置

用户可以通过 GAMS 选项文件(scip.opt 或通过 GAMS 命令行参数)配置 SCIP 的行为。常用的选项包括:

  • 时限控制 — ResLim(资源限制)、OptCr(相对最优性容差)、OptCa(绝对最优性容差)
  • 算法选择 — 选择 LP 求解算法(原始/对偶单纯形法)
  • 预处理级别 — 控制预处理的激进程度
  • 输出控制 — 控制日志输出的详细程度
  • 线程控制 — 设置并行求解的线程数

8.4 返回信息与求解状态

求解完成后,GAMS 会通过标准状态变量报告求解结果:

  • modelstat — 模型状态(最优、不可行、无界等)
  • solvestat — 求解过程状态(正常完成、资源限制中断等)
  • objval — 目标函数值
  • resusd — 求解耗时
  • iterusd — 迭代次数
  • nodusd — 分支定界搜索节点数

第九章:选项与参数配置

SCIP 提供了大量的参数选项,用户可以通过精细的参数调优来获得最佳求解性能。以下是主要参数类别:

9.1 基本参数

  • limits/time — 求解时间限制(秒)
  • limits/gap — 相对最优性间隙停止条件
  • limits/absgap — 绝对最优性间隙停止条件
  • limits/nodes — 最大搜索节点数
  • limits/solutions — 达到指定数量的可行解后停止
  • limits/memory — 内存使用限制(MB)

9.2 预处理参数

  • lp/presolving — 启用/禁用 LP 预处理
  • presolving/maxrounds — 预处理最大轮数
  • separating/maxrounds — 切割平面分离最大轮数
  • presolving/maxrestarts — 预处理重启最大次数

9.3 切割平面参数

  • separating/clique/freq — 夹紧切割的生成频率
  • separating/cover/freq — 覆盖切割的生成频率
  • separating/gomory/freq — Gomory 切割的生成频率
  • separating/zerohalf/freq — 零半切割的生成频率
  • separating/maxroundsroot — 根节点最大分离轮数

9.4 启发式参数

  • heuristics/feaspump/freq — Feasibility Pump 调用频率
  • heuristics/rens/freq — RENS 启发式调用频率
  • heuristics/rins/freq — RINS 启发式调用频率
  • heuristics/localbranching/freq — Local Branching 调用频率
  • heuristics/subnlp/freq — NLP 子问题启发式频率(用于 MINLP)

9.5 分支参数

  • branching/vanillafullstrong/priority — 分支规则优先级
  • branching/leastinf/priority — 最不可行分支优先级
  • branching/mostinf/priority — 最可行分支优先级
  • branching/cloud/priority — 云分支优先级
  • branching/relpscost/priority — 可靠伪代价分支优先级

9.6 性能调优建议

以下是一些常见的性能调优策略:

  • 针对大规模 MIP:启用更多的切割平面生成器、增加预处理轮数、使用强分支策略
  • 针对已知可行解:设置初始解、减少启发式频率
  • 针对快速近似解:设置较宽松的间隙容忍度、增加大邻域搜索频率
  • 针对 MINLP:根据问题的凸性选择适当的松弛策略

用户可以在 GAMS 选项文件中通过 option optfile = 1;$onecho > scip.opt ... $offecho 来传递 SCIP 参数。

第十章:性能调优指南

10.1 模型分析与诊断

在使用 SCIP 求解之前,建议对模型进行分析:

  • 检查模型的数值稳定性 — 避免系数数量级差异过大
  • 分析约束的类型和数量 — 识别是否需要特殊的切割或分解方法
  • 评估变量类型 — 尽量减少整数变量数量,优先使用二元变量
  • 检查冗余约束和变量 — 移除不影响问题求解的多余元素

10.2 求解器参数调优

SCIP 提供了丰富的参数调优选项,建议按照以下步骤进行调优:

  • 启用更多预处理(增加 presolving/maxrounds)
  • 调整切割平面生成频率(根据问题类型启用或禁用特定的切割)
  • 选择合适的启发式策略(根据问题结构选择最有效的启发式)
  • 优化分支策略(对于复杂问题使用强分支,对于大规模问题使用伪代价分支)
  • 调整搜索节点选择策略
  • 设置合理的时间限制和最优性间隙

10.3 并行计算

SCIP 支持通过 UG(Ubiquity Generator)框架进行并行求解:

  • 共享内存并行 — 利用多核处理器并行搜索分支定界树
  • 分布式内存并行 — 在计算集群上进行分布式求解
  • 混合并行 — 结合共享内存和分布式内存的并行策略

在 GAMS 中设置线程数可通过 option threads = N; 或通过 SCIP 参数 lp/threads 控制。

10.4 内存管理

对于大规模问题,内存管理非常重要:

  • 通过 limits/memory 设置内存使用上限
  • 启用节点文件的压缩和磁盘卸载(通过 nodeselection/bfs/zip 等参数)
  • 控制切割平面存储的数量以避免内存过度消耗
  • 合理设置保存节点信息的文件位置和大小

10.5 常见问题与解决方案

问题可能原因解决方案
求解过程缓慢启发式失效或切割生成不足增加启发式频率,启用更多切割类型
内存不足搜索树过大或切割生成过多限制节点数,启用节点文件卸载,减少切割存储
数值不稳定模型系数尺度差异过大调整模型系数尺度,启用自动缩放
找不到可行解模型约束过严或搜索不足放宽约束检查,增加启发式搜索,延长求解时间
求解结果不正确数值误差或参数设置不当检查模型定义,调整数值容忍度参数

 

SCIP 作为开源混合整数规划求解器的领先者,持续在算法性能、功能覆盖和易用性方面进行提升。通过 GAMS 的集成,用户能够充分利用 SCIP 的强大能力,解决最复杂的优化问题。无论是学术研究还是工业应用,SCIP 都提供了可靠、高效且灵活的计算基础。

 


 

在线留言

尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。

 

 

 

 

联系我们

 

微信公众号

咨询微信

企业店铺

400-621-1085

(节假日期间办公室座机如无人接听,请选择其他联系方式,感谢理解!祝您节日快乐!)

 

联系我们 快速链接 相关产品 上海卡贝信息技术有限公司

©2025  上海卡贝信息技术有限公司

产品中心

下载中心

站点地图

隐私政策

 

销售QQ咨询

产品QQ咨询

淘宝店铺

 

GAMS:概述

最近更新

相关文档

下载试用

购买咨询

Berkeley Madonna

iThink

Stella Architect

IBM SPSS Modeler

DecisionTools Suite

NeuralTools

Frontier Analyst

Vensim

RISKOptimizer

PrecisionTree

LINGO

LINDO API

What'sBest!

@RISK

BARON

BayesiaLab

Oracle Crystal Ball

GEMPACK

GTAP Database

TreeAge