LINDO 求解器
一、简介 (Introduction)
LINDO(Linear, INteractive, and Discrete Optimizer)是 LINDO Systems 公司开发的一款高性能数学规划求解器。作为 GAMS 生态系统中重要的求解器选项之一,LINDO 在处理大规模优化问题方面表现出色,广泛应用于生产计划、物流优化、资源配置、金融投资等众多领域。
LINDO 求解器支持广泛的数学模型类型,包括:
- LP(线性规划)
- MIP(混合整数规划)
- NLP(非线性规划)
- RMIP(带松弛的混合整数规划)
- RMINLP(带松弛的混合整数非线性规划)
在 GAMS 环境中,用户只需在模型中使用 option solver=lindo; 即可调用 LINDO 求解器,所有复杂求解细节均由求解器内部自动处理。
LINDO 求解器采用先进的算法技术,包括改进的单纯形法、内点法以及分支定界法等。其数值稳定性出色,求解速度快,内存效率高,经过大量实际问题的严格验证。
二、目录
一、简介 (Introduction)
LINDO 求解器通过 GAMS 标准求解器接口无缝集成,支持 LP、MIP、NLP、RMIP 和 RMINLP 等多种模型类型。求解器内部采用模块化架构,针对不同类型的问题自动选择最优算法策略。
对于线性规划问题,LINDO 提供了两种算法选择:
- 单纯形法:适用于中等规模问题,在重优化场景中表现优异
- 内点法:适用于大规模问题,特别是当问题具有稀疏结构时
对于整数规划问题,LINDO 采用分支定界框架,结合先进的割平面技术、启发式策略和预处理技术,有效加速求解过程。
对于非线性规划问题,LINDO 支持多种类型的非线性函数(详见下一节),采用序列二次规划(SQP)和内点法相结合的求解策略。
二、支持的非线性函数 (Supported Nonlinear Functions)
LINDO 求解器支持 GAMS 中定义的大多数标准非线性函数,包括但不限于:
基本算术运算
- 加法、减法、乘法、除法
- 幂运算:
x**y
- 绝对值:
abs(x)
指数与对数函数
- 自然指数:
exp(x)
- 自然对数:
log(x)
- 以10为底的对数:
log10(x)
- 以2为底的对数:
log2(x)
- 指数函数:
power(x,y)
三角函数
- 正弦:
sin(x)
- 余弦:
cos(x)
- 正切:
tan(x)
- 反正弦:
arcsin(x)
- 反余弦:
arccos(x)
- 反正切:
arctan(x)
其他函数
- 最大值:
max(x1,x2,...)
- 最小值:
min(x1,x2,...)
- 符号函数:
sign(x)
- 平方根:
sqrt(x)
- 误差函数:
errorf(x)
- Gamma函数:
gamma(x)
- 阶乘:
fact(x)
- 取整函数:
ceil(x), floor(x), round(x)
注意:在非线性模型中,某些函数(如 max 和 min)可能导致非光滑特性。LINDO 求解器能够处理大多数连续可微的非线性函数,但对于高度非凸或非光滑的问题,建议使用全局优化求解器。
三、不可行与无界问题 (Infeasible & Unbounded)
不可行问题
当求解器报告模型不可行时,说明约束条件之间存在矛盾,没有任何解能同时满足所有约束。LINDO 求解器会返回不可行状态,并提供以下诊断信息:
- 不可行约束的识别(通过求解约束可行性子问题)
- 不可行性度量(显示约束违反程度)
- 建议的修正方向(通过 IIS - 不可行约束子系统分析)
对于线性模型,LINDO 支持不可行约束集(IIS)的自动识别,帮助用户快速定位问题根源。对于整数规划模型,求解器会报告整数不可行性,并可能提供松弛解以供参考。
无界问题
当模型无界时,说明目标函数可以在满足所有约束的条件下无限改进。这通常意味着缺少必要的约束条件,或目标函数中的变量系数存在问题。
LINDO 求解器在检测到无界状态时会:
- 报告无界状态和相应的退出信息
- 如果可行,提供无界方向的指示
- 输出最后一次迭代的解,帮助用户诊断问题
诊断建议
- 检查模型中的约束条件是否完整
- 验证变量的上下界是否正确设置
- 确保目标函数中的系数没有逻辑错误
- 使用
option limrow=9999; 和 option limcol=9999; 查看完整的方程和变量列表
四、求解输出 (Output)
LINDO 求解器在 GAMS 中运行时会生成详细的求解日志和结果输出,帮助用户了解求解过程和结果质量。
标准输出信息
典型的 LINDO 求解输出包含以下部分:
- 求解器标识和版本信息:显示 LINDO 求解器的版本号和版权信息
- 模型统计信息:
- 变量数量(包括离散变量和连续变量)
- 约束数量(包括等式和不等式)
- 非零元素数量
- 模型的非线性程度
- 求解过程信息:
- 迭代次数
- 节点数(MIP问题)
- 当前最佳目标值
- 当前最佳边界(MIP问题)
- 相对间隙(MIP问题)
- 求解状态:
- 最优解已找到
- 不可行
- 无界
- 达到迭代限制
- 达到时间限制
- 求解中断
- 最终结果摘要:目标函数值、求解时间、内存使用等
GAMS 状态和求解器状态
LINDO 求解完成后会设置相应的 GAMS 模型状态和求解器状态。常见的模型状态包括:
- 1 - 最优 (Optimal)
- 2 - 局部最优 (Locally Optimal)
- 3 - 不可行 (Infeasible)
- 4 - 无界 (Unbounded)
- 5 - 达到迭代/时间限制 (Iteration/Time Limit)
- 6 - 其他 (Other)
输出详细程度控制
用户可以通过选项控制求解输出的详细程度:
option iterlim:控制迭代限制
option reslim:控制求解时间限制
option optcr:设置 MIP 最优性容差
option optca:设置 MIP 绝对最优性容差
五、求解选项 (Options)
LINDO 求解器提供丰富的选项参数,允许用户根据具体问题的特点调整求解行为。选项可以通过 GAMS 的 option 语句或求解器选项文件进行设置。
通用选项
以下为 LINDO 求解器支持的主要选项类别:
| 选项名称 |
默认值 |
说明 |
iterlim |
1000000 |
求解迭代次数上限 |
reslim |
10000 |
求解时间上限(秒) |
optcr |
0.1 |
MIP 相对最优性容差(百分比) |
optca |
0 |
MIP 绝对最优性容差 |
lindo_mipdisplay |
1 |
MIP 求解过程输出级别(0=无输出, 1=标准输出, 2=详细输出) |
lindo_nlpdisplay |
1 |
NLP 求解过程输出级别 |
LP 求解选项
| 选项名称 |
默认值 |
说明 |
lindo_lpmethod |
0 |
LP 求解算法(0=自动, 1=单纯形法, 2=内点法) |
lindo_scaling |
1 |
模型缩放(0=不缩放, 1=自动缩放) |
lindo_presolve |
1 |
预处理级别(0=无, 1=基本, 2=高级) |
MIP 求解选项
| 选项名称 |
默认值 |
说明 |
lindo_mipstrategy |
0 |
MIP 求解策略(0=自动, 1=深度优先, 2=广度优先, 3=最佳优先) |
lindo_cuts |
1 |
割平面生成(0=禁用, 1=启用) |
lindo_heuristics |
1 |
启发式策略(0=禁用, 1=启用) |
lindo_mipgap |
0.0001 |
MIP 停止间隙(绝对+相对混合) |
lindo_nodeselect |
0 |
节点选择策略(0=自动, 1=深度优先, 2=最佳投影) |
NLP 求解选项
| 选项名称 |
默认值 |
说明 |
lindo_nlpmethod |
0 |
NLP 求解算法(0=自动, 1=SQP, 2=内点法) |
lindo_nlptol |
1e-6 |
NLP 最优性容差 |
lindo_nlpfeastol |
1e-6 |
NLP 可行性容差 |
lindo_nlpmaxiter |
500 |
NLP 最大迭代次数 |
lindo_derivcheck |
0 |
导数检查(0=不检查, 1=检查) |
六、选项汇总 (Summary of Options)
下表汇总了 LINDO 求解器最常用的选项及其用途:
| GAMS 选项 |
LINDO 内部选项 |
默认值 |
说明 |
iterlim |
IP_ITER_LIM |
1000000 |
迭代次数上限 |
reslim |
IP_TIME_LIM |
10000 |
求解时间上限(秒) |
optcr |
IP_OPT_CR |
0.1 |
MIP 相对间隙(百分比) |
optca |
IP_OPT_CA |
0 |
MIP 绝对间隙 |
lindo_lpmethod |
IP_LP_METHOD |
0(自动) |
LP 算法选择 |
lindo_mipstrategy |
IP_MIP_STRATEGY |
0(自动) |
MIP 分支策略 |
lindo_nlpmethod |
IP_NLP_METHOD |
0(自动) |
NLP 算法选择 |
lindo_scaling |
IP_SCALING |
1(启用) |
模型自动缩放 |
lindo_presolve |
IP_PRESOLVE |
1(基本) |
预处理级别 |
lindo_cuts |
IP_CUTS |
1(启用) |
割平面生成 |
lindo_heuristics |
IP_HEURISTICS |
1(启用) |
MIP 启发式 |
lindo_mipdisplay |
IP_MIP_DISPLAY |
1(标准) |
MIP 输出详细程度 |
lindo_nlpdisplay |
IP_NLP_DISPLAY |
1(标准) |
NLP 输出详细程度 |
lindo_nlptol |
IP_NLP_TOL |
1e-6 |
NLP 最优性容差 |
lindo_nlpfeastol |
IP_NLP_FEASTOL |
1e-6 |
NLP 可行性容差 |
七、详细说明 (Detailed Descriptions)
7.1 求解器调用方式
在 GAMS 模型中调用 LINDO 求解器有多种方式:
- 通过 option 语句:
option solver=lindo;
- 在 solve 语句中指定:
solve mymodel using LP maximizing profit;
此时如果已设置 option solver=lindo;,则 GAMS 会使用 LINDO 求解。
- 通过选项文件:
创建名为 lindo.opt 的文件,在其中写入求解选项,并在 GAMS 中引用:
option lindo = lindo.opt;
7.2 线性规划求解详解
对于 LP 问题,LINDO 提供两种主要的求解算法:
单纯形法:
- 适用于中小规模问题
- 在序列求解(reoptimization)场景下效率极高
- 支持敏感性分析和参数分析
- 通过
lindo_lpmethod=1 强制使用
内点法:
- 适用于大规模问题(变量数超过10万)
- 在处理高度稀疏问题时具有显著优势
- 支持多线程并行计算
- 通过
lindo_lpmethod=2 强制使用
当设置为自动模式(lindo_lpmethod=0)时,LINDO 会根据问题的规模和结构特征自动选择最优算法。
7.3 混合整数规划求解详解
LINDO 的 MIP 求解器采用分支定界(Branch-and-Bound)框架,集成了多项先进技术:
- 预处理技术:通过约束简化、变量固定、系数化简等减少问题规模
- 割平面生成:自动生成 Gomory 割、混合整数割(MIR)、覆盖割(Cover Cuts)等
- 启发式策略:包括 RINS、邻近搜索等,快速寻找高质量可行解
- 节点选择策略:深度优先、最佳投影、最佳估计等多种策略
- 变量分支策略:基于伪代价、强分支等技术的智能变量选择
MIP 求解过程受多个选项控制:
optcr 和 optca:控制求解停止条件,当当前最佳解与理论最优界面的差距小于设定值时,求解停止
lindo_mipstrategy:控制分支策略的选择
lindo_cuts:控制割平面生成的激进度
lindo_heuristics:控制启发式搜索的频率和深度
7.4 非线性规划求解详解
非线性规划问题的求解比线性问题复杂得多。LINDO 采用以下策略处理 NLP 问题:
- 序列二次规划(SQP):
- 适用于中小规模 NLP 问题
- 每次迭代求解一个 QP 子问题
- 收敛速度快,通常在几十次迭代内收敛
- 内点法(Interior Point):
- 适用于大规模 NLP 问题
- 采用障碍函数处理不等式约束
- 能有效处理高度非线性问题
重要注意事项:
- NLP 求解器通常只能找到局部最优解,对非凸问题不保证全局最优性
- 模型应尽量保持良好的数值尺度,避免过大或过小的系数
- 使用
lindo_derivcheck=1 可以验证导数的正确性(调试用)
- 如果模型包含大量非线性的非凸项,建议使用全局优化求解器
7.5 性能调优建议
根据问题特点调整求解选项可以显著提升求解性能:
| 问题类型 |
建议选项设置 |
说明 |
| 超大规模 LP(>10万变量) |
lindo_lpmethod=2 |
使用内点法,内存效率更高 |
| 系列求解 LP(同一模型多次求解) |
lindo_lpmethod=1 |
单纯形法在热启动时有优势 |
| 困难 MIP 问题 |
lindo_cuts=2 + lindo_heuristics=2 |
增加割平面和启发式强度 |
| 需要快速可行解的 MIP |
lindo_heuristics=2 + optcr=0.05 |
加强启发式搜索,设置合理间隙 |
| 大规模 NLP |
lindo_nlpmethod=2 |
使用内点法求解 NLP |
| 数值困难模型 |
lindo_scaling=1 + lindo_presolve=2 |
启用缩放和高级预处理 |
7.6 高级功能
多线程并行计算:LINDO 求解器支持多线程并行计算,可以通过系统设置或选项控制使用的线程数。在线性规划内点法和混合整数规划求解过程中,多线程可以显著缩短求解时间。
求解器回调功能:对于高级用户,LINDO API 提供了丰富的回调函数接口,允许在求解过程中实时获取求解状态、中断求解或修改求解参数。但在 GAMS 环境下,这些功能通过 GAMS 标准接口间接使用。
MIP 起始解(MIP Start):GAMS 允许用户为 MIP 问题提供初始可行解,通过 prioropt 选项或变量 .l 属性设置。LINDO 求解器会使用这些初始解加速 MIP 求解过程。
敏感性分析:对于 LP 问题,LINDO 求解器可以生成敏感性分析信息,包括目标系数范围、右端项范围等。在 GAMS 中,可以通过 gdx 输出获取这些信息。
相关资源
在线留言
尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。
|