CPLEX 求解器手册(IBM ILOG CPLEX)
1. 引言
GAMS/CPLEX 是一个 GAMS 求解器,允许用户将 GAMS 的高级建模能力与 CPLEX 优化器的强大功能相结合。CPLEX 优化器旨在快速求解大规模困难问题,只需最少的用户干预。在适当的许可下,用户可以访问 CPLEX 的求解算法,用于线性规划、二次约束规划和混合整数规划问题。虽然提供了许多求解选项,但 GAMS/CPLEX 会自动为特定问题计算并设置大多数选项为最佳值。
所有通过 GAMS/CPLEX 可用的 CPLEX 选项均汇总在本文档末尾。
使用 CPLEX 运行模型
以下语句可在 GAMS 程序内部用于指定使用 CPLEX:
Option LP = Cplex; { 或 QCP, MIP, MIQCP, RMIP 或 RMIQCP }
上述语句应出现在 Solve 语句之前。如果在 GAMS 安装期间 CPLEX 被指定为默认求解器,则不需要上述语句。
注意: 之前的免费裸链接模式(以前称为 GAMS/OSICPLEX)已被移除。如果您依赖此裸链接选项,请联系 sales@gams.com 安排 GAMS/CPLEX 求解器链接许可证。
2. 线性规划(LP)
CPLEX 使用几种替代算法求解 LP 问题。大多数 LP 问题使用 CPLEX 最先进的对偶单纯形算法求解效果最好。某些类型的问题受益于使用原单纯形算法、网络优化器、屏障算法(内点法)或筛选算法。并发选项允许使用不同的算法并行求解,由最先完成的算法返回解。
求解线性规划问题是内存密集型的。尽管 CPLEX 非常高效地管理内存,但物理内存不足是运行大型 LP 时最常见的问题之一。当内存有限时,CPLEX 会自动进行调整,这可能会对性能产生负面影响。
CPLEX 设计为使用默认选项设置求解大多数 LP 问题。这些设置通常提供最佳的整体优化速度和可靠性。然而,有时需要更改选项设置以提高性能、避免数值困难、控制优化运行时长或控制输出选项。
一些使用原单纯形算法而非默认对偶单纯形算法的问题求解更快。极少数问题在原单纯形和对偶单纯形中都表现出较差的数值性能。因此,如果使用对偶单纯形时出现数值问题,请考虑尝试原单纯形。
CPLEX 具有非常高效的网络模型算法。网络约束具有以下属性:每个非零系数为 +1 或 -1,出现在这些约束中的每列恰好有两个非零元素,一个 +1 和一个 -1。
LP 算法选项
| 值 | 含义 |
| 0 | 自动选择 |
| 1 | 原单纯形 |
| 2 | 对偶单纯形 |
| 3 | 网络单纯形 |
| 4 | 屏障算法(内点法) |
| 5 | 筛选算法 |
| 6 | 并发 |
当前自动设置的行为:CPLEX 从头求解 LP 模型时几乎总是调用对偶单纯形算法。当从高级基继续时,它会检查基是原可行的还是对偶可行的,并相应选择原单纯形或对偶单纯形算法。
如果请求了多个线程(在确定或机会模式下),从头求解连续线性规划模型(LP)时,自动设置会选择并发优化算法。当三个或更多线程可用时,机会模式在一个线程上运行对偶单纯形,第二个线程上运行原单纯形,第三个及更多线程上运行并行屏障优化器。确定模式在一个线程上运行对偶优化器,在任何其他可用线程上运行并行屏障优化器。
3. 二次规划(QP/QCP/MIQCP)
CPLEX 可以求解具有二次约束的连续和整数规划问题。CPLEX 处理 QCP 问题的算法基于屏障算法(内点法),对于 MIQCP 问题则结合了分支定界方法。
CPLEX 要求二次约束矩阵是半正定的(对于凸问题)。对于非凸问题,CPLEX 可能无法找到最优解。
4. 混合整数规划(MIP)
CPLEX 包含一个强大的混合整数规划求解器,可以求解具有整数变量、二元变量和特殊有序集(SOS)的问题。CPLEX MIP 求解器使用分支定界算法,并结合了多种预处理技术、割平面生成和启发式方法。
关键 MIP 选项包括:
- mipcord — MIP 搜索时执行目标函数分块
- mipemphasis — 控制 MIP 搜索的重点(0=平衡,1=寻找可行解,2=证明最优性,3=寻找最佳可行解,4=寻找隐藏可行解)
- mipstart — 使用现有 MIP 解作为起点
- mipper — MIP 预处理级别和模式
- mippolish — MIP 完成后改善解质量的级别
- cuts — 全局割平面生成控制(-1=不生成,0=自动,1=适度,2=激进,3=非常激进)
- heur — 启发式搜索频率控制
- nodesel — 节点选择策略
- varsel — 变量选择策略
- brdir — 分支方向
- relgap — 相对间隙容差
- absgap — 绝对间隙容差
- tilm — MIP 节点限制
- nod — MIP 节点数限制
- inttol — 整数容差
- objdif — 目标函数差异限制
此外,CPLEX 支持针对特定问题类型的专用割平面:cliquecuts、covercuts、disjcuts、flowcuts、fraccuts、gubcuts、implbd、mcfcuts、zerohalfcuts 等。
5. 解池(Solution Pool)
CPLEX 的解池功能允许在 MIP 求解过程中生成和存储多个备选解。
解池容量
solnpoolcap — 解池中存储的整数解方案数量上限。
解池替换策略
solnpoolrep — 决定当解池满时替换哪些解。0=保留第一个解,1=保留多样性最高的解,2=保留最近发现的解,3=保留目标值最优的解,4=保留目标值次优的解。
解池密度
solnpooldensity — 控制在 populate 过程中生成解的密度。
多样化过滤器
多样化过滤器允许您为一组二元变量指定参考值,生成与参考值相似或不同的解。可以使用选项 DivFlt 以及下界和上界 DivFltLo 和 DivFltUp 来设置。
当前解过滤器
可以通过 CPLEX 过滤器文件(参数 ReadFLT)指定多个过滤器。更多细节请参见 GAMS 模型库中的 solnpool 模型。
访问解池
解存储在 GAMS 数据交换(GDX)文件中,可以由 GAMS 程序加载。如果指示 CPLEX 生成数千个解,此方法会变得效率低下。选项 SolnPoolMerge 触发创建包含所有解的单个 GDX 文件。
GAMS/CPLEX 链接会生成一个 GDX 文件(名称由 SolnPool 指定),其中包含一个名为 Index 的集合,元素为 file1、file2... 这些元素的关联文本包含各个 GDX 解文件的名称。文件名由前缀 soln(可通过选项 SolnPoolPrefix 指定)、模型名称和序列号构成。
6. Benders 算法
CPLEX 实现了 Benders 算法。给定问题的公式,CPLEX 可以将模型分解为单个主问题和(可能多个)子问题。为此,CPLEX 使用您为模型提供的注释。这种方法可以应用于混合整数线性规划(MILP)问题。
参数 BendersStrategy 指定您希望如何将 Benders 算法作为求解模型的策略应用。默认情况下,如果您没有注释模型来指定分解,CPLEX 不会尝试分解问题。如果指定了策略,CPLEX 将使用 Benders 分解方法。
参数 benderscutsonly 控制在 Benders 分解中是否仅使用割生成。
7. 指示约束
CPLEX 支持指示约束,允许您将二元变量与约束是否激活关联起来。指示约束的格式为:
[约束名称] 二元变量 {0|1} ⇒ 线性约束
这意味着当二元变量取指定值时,线性约束被强制满足;当二元变量取相反值时,约束不强制。
8. 冲突精炼器
CPLEX 的冲突精炼器功能可以帮助诊断不可行模型。当模型被证明不可行时,冲突精炼器会识别导致不可行性的最小约束和边界集。
在 GAMS 中使用冲突精炼器:
solve mymodel using mip min z;
abort$(mymodel.modelstat = %modelStat.Infeasible%) "Model infeasible";
option clear = mymodel;
solve mymodel using mip min z;
option conflict = 1;
display conflict;
9. 选项参考
以下按字母顺序列出 CPLEX 的主要选项。
| 选项 | 描述 | 默认值 |
| absgap | MIP 绝对间隙容差 | 0 |
| advind | 高级基指示:0=关闭,1=自动 | 1 |
| aggressive | 割平面激进级别(0=自动,1=保守,2=默认,3=激进,4=非常激进) | 2 |
| algorithm | LP 求解算法:0=自动,1=原单纯形,2=对偶单纯形,3=网络单纯形,4=屏障,5=筛选,6=并发 | 0 |
| barcrossalg | 屏障算法交叉(Crossover)方法 | 0 |
| barstart | 屏障算法起始点策略 | 0 |
| bendersstrategy | Benders 分解策略 | 0 |
| boundstr | 边界强度容差 | 0 |
| brdir | MIP 分支方向:-1=向下优先,0=自动,1=向上优先 | 0 |
| brstat | 分支策略 | 0 |
| btol | 屏障算法收敛容差 | 1e-8 |
| cliquecuts | 集团割控制 | 0=自动 |
| covercuts | 覆盖割控制 | 0=自动 |
| cuts | 全局割平面生成控制:-1=不生成,0=自动,1=适度,2=激进,3=非常激进 | 0 |
| datacheck | 数据检查级别 | 0 |
| depind | 是否考虑问题依赖性 | 1 |
| disjcuts | 析取割控制 | 0=自动 |
| divflt | 多样化过滤器参考值 | 0 |
| divfltlo | 多样化过滤器下界 | 0 |
| divfltup | 多样化过滤器上界 | 1 |
| dual | 对偶优化:-1=自动,0=不取对偶,1=取对偶 | -1 |
| epgap | MIP 相对间隙(optca 的别名) | 0 |
| epint | 整数容差 | 1e-5 |
| epopt | 最优性容差 | 1e-6 |
| epprimal | 原始可行性容差 | 0 |
| eprhs | RHS 可行性容差 | 1e-6 |
| flowcuts | 流割控制 | 0=自动 |
| fraccuts | 分数割控制 | 0=自动 |
| gubcuts | 广义上界割控制 | 0=自动 |
| heur | MIP 启发式搜索级别 | 0 |
| implbd | 隐含边界割控制 | 0=自动 |
| inttol | 整数可行容差 | 1e-5 |
| itlim | LP 迭代限制 | GAMS iterlim |
| lpmethod | LP 求解方法 | 0=自动 |
| ltol | 基识别原容差 | 0 |
| mcfcuts | 多商品流割:-1=不生成,0=自动,1=生成 | 0 |
| mipcord | MIP 目标分块 | 0 |
| mipemphasis | MIP 搜索重点:0=平衡,1=寻找可行解,2=证明最优性,3=寻找最佳可行解,4=寻找隐藏可行解 | 0 |
| mippolish | MIP 解优化级别 | 0 |
| mipprior | MIP 分支优先级文件 | |
| mipstart | 使用 MIP 起点文件 | |
| nod | MIP 节点数限制 | GAMS nodlim |
| nodesel | 节点选择策略:0=深度优先,1=最佳界,2=最佳估值,3=动态 | 0 |
| objdif | 目标函数差异限制 | 0 |
| objrep | 对象存储报告频率 | 0 |
| optca | 绝对最优容差(MIP) | 0 |
| optcr | 相对最优容差(MIP) | GAMS optcr |
| optfile | 读取 CPLEX 选项文件 | 0 |
| ortol | 障碍算法的正交化容差 | 0 |
| perind | 周期性重整化指示 | 1 |
| perturb | 扰动选项 | 0 |
| preind | 预处理指示:0=关闭,1=开启 | 1 |
| prepass | 预处理传递次数 | -1 |
| preslvnd | 预处理节点指示 | 0 |
| prereform | 预求解后重整(0=自动,1=结束预处理,2=特定于问题) | 0 |
| pricing | 单纯形定价策略 | 0 |
| priopt | 原始可行性优化级别 | 0 |
| probe | 探测级别(-1=自动,0=关闭,1=适度,2=激进,3=非常激进) | -1 |
| qcscale | QCP 缩放 | 0 |
| reduced | 简化LP选项:0=关闭,1=开启 | 1 |
| refineriterlim | 冲突精炼器迭代限制 | 0 |
| refinernodelim | 冲突精炼器节点限制 | 0 |
| refinertime | 冲突精炼器时间限制 | 0 |
| relgap | MIP 相对间隙容差 | GAMS optcr |
| reslim | 资源限制(秒) | GAMS reslim |
| siftalgor | 筛选算法 | 0=自动 |
| sifttol | 筛选算法容差 | 1e-6 |
| simdisplay | 单纯形显示频率 | 2 |
| simtoler | 单纯形容差 | 1e-6 |
| singlim | 奇异性限制 | 5 |
| solnpool | 解池 GDX 文件前缀 | solnpool |
| solnpoolcap | 解池容量 | 0 |
| solnpoolmerge | 解池合并为单个 GDX 文件 | |
| solnpoolprefix | 解池文件前缀 | soln |
| solnpoolrep | 解池替换策略 | 0 |
| solnpoolmerge | 合并解池到单个 GDX 文件 | |
| stats | 统计数据输出 | 0 |
| stop | 停止条件 | 0 |
| symmetry | MIP 对称性检测级别:-1=自动,0=关闭,1=适度,2=激进,3=非常激进 | -1 |
| threads | 线程数 | 0 |
| tilim | 时间限制 | GAMS reslim |
| ts | 时间戳间隔 | 0 |
| usrincbcall | 用户当前解检查程序 | |
| varsel | 变量选择策略:-1=自动,0=最小不可行性,1=伪成本,2=强分支,3=混合 | -1 |
| version | CPLEX 版本 | |
| walltime | 挂钟时间限制 | 0 |
| workdir | 工作目录 | |
| workmem | 工作内存限制(MB) | 自动 |
| zerohalfcuts | 零半割控制 | 0=自动 |
在线留言
尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。
|