MOSEK 求解器文档
MOSEK 是丹麦MOSEK ApS公司开发的高性能数学规划求解器,专为求解大规模优化问题而设计。MOSEK 采用先进的数值算法,支持线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP)、二次约束二次规划(QCQP)、二阶锥规划(SOCP)、半定规划(SDP)以及非线性凸优化等多种问题类型。作为 GAMS 平台的核心求解器之一,MOSEK 以其卓越的数值稳定性、求解速度和并行计算能力著称,广泛应用于金融投资组合优化、能源系统规划、供应链管理、工程设计优化、机器学习、控制理论等商业和科研领域。MOSEK 支持多核并行计算,能够充分利用现代计算硬件资源加速求解过程,并提供丰富的参数设置选项,使用户能够精细控制求解行为。
章节导航
1. Introduction(引言)
MOSEK 是一款功能强大的数学优化求解器,专门用于解决大规模复杂优化问题。它采用先进的算法实现高效的求解性能,能够处理多种优化问题类型。以下是 MOSEK 支持的主要问题类别及其特点:
| 问题类型 |
说明 |
典型应用 |
| 线性规划(LP) |
目标函数和约束均为线性函数 |
生产计划、资源分配 |
| 混合整数线性规划(MILP) |
包含整数变量的线性规划 |
排班调度、设施选址 |
| 二次规划(QP/QCP) |
目标函数包含二次项或二次约束 |
投资组合优化、模型预测控制 |
| 二阶锥规划(SOCP) |
约束为二阶锥形式 |
稳健优化、工程结构设计 |
| 半定规划(SDP) |
矩阵变量满足半正定约束 |
最大割问题、LMI控制 |
| 非线性凸优化 |
凸可微非线性目标与约束 |
信号处理、统计学 |
MOSEK 的主要特点包括:高效的 LP/MILP/QP/SOCP/SDP 求解能力;出色的数值稳定性和求解精度;支持多核并行计算和大规模分布式计算;与 GAMS 平台无缝集成,通过 OPTION LP=MOSEK; 即可调用;提供丰富的参数设置选项,灵活控制求解过程;支持热启动(Warm Start),加速重复求解场景。MOSEK 以其在金融优化和能源领域中的卓越表现,成为业界公认的顶级优化求解器之一。
2. Options(求解器选项)
在 GAMS 中调用 MOSEK 求解器,只需在模型文件中添加以下语句:
OPTION LP=MOSEK;
OPTION MIP=MOSEK;
OPTION NLP=MOSEK;
OPTION QCP=MOSEK;
用户可以通过 GAMS 的 option 语句直接设置 MOSEK 参数,或使用 MOSEK 的专用选项文件(如 mosek.opt)来配置。选项文件的格式为每行一个参数,参数名与参数值之间用空格隔开,示例:
MSK_IPAR_LOG 10
MSK_DPAR_OPTIMIZER_FEAS_TOL 1.0e-7
MSK_IPAR_INTPNT_MAX_ITERATIONS 400
在 GAMS 中,通过 option mosek = "参数名=参数值"; 的方式也可直接设置选项。MOSEK 的参数分为整数参数(MSK_IPAR_*)、双精度浮点参数(MSK_DPAR_*)和字符串参数(MSK_SPAR_*)三类。关键参数类别包括:求解容差设置(可行性容差、最优性容差)、算法选择(原始单纯形法、对偶单纯形法、内点法)、预处理选项、输出控制(日志级别、迭代输出频率)、时间限制与迭代限制等。
3. LogFile(日志文件)
MOSEK 的日志文件功能提供了详细的求解过程记录,对于调试模型和分析求解性能至关重要。MOSEK 支持不同级别的日志详细程度,从简洁的摘要输出到详细的迭代日志,可通过参数 MSK_IPAR_LOG 控制日志级别:
| 日志级别 |
输出内容 |
推荐场景 |
| 0(无输出) |
不输出任何日志信息 |
批量求解 |
| 1(仅错误) |
仅输出错误信息 |
生产环境 |
| 5(标准) |
求解摘要、迭代过程、最终结果 |
日常求解(默认) |
| 10(详细) |
全部迭代日志、预处理细节、算法切换信息 |
性能分析 |
日志文件通常包含以下内容:
- 求解器版本信息 — MOSEK 版本号、构建信息
- 问题统计 — 变量数(含整数变量数)、约束数、非零元素数、半定矩阵维度等
- 预处理结果 — 问题化简后的规模、冗余约束消除信息
- 迭代过程 — 每次迭代的迭代次数、原始目标值、对偶目标值、原始不可行度、对偶不可行度、互补间隙等
- 求解状态 — Optimal(最优)、Infeasible(不可行)、Unbounded(无界)、Dual Infeasible(对偶不可行)等
- 最终结果汇总 — 最优目标值、求解时间、迭代次数、内存使用量
用户可以通过参数 MSK_SPAR_LOG_FILE 指定日志文件的输出路径,也可将日志信息重定向到 GAMS 的输出流中一并显示。
4. SemidefiniteProgram(半定规划)
MOSEK 是少数能够高效求解半定规划(SDP)问题的商业求解器之一。半定规划是锥优化的重要分支,其约束条件要求矩阵变量为半正定矩阵。在 GAMS 中,用户可以通过 SDP 工具在模型中对半定矩阵变量进行建模。MOSEK 支持以下 SDP 相关功能:
- 半定矩阵变量的声明 — 在 GAMS 中使用
positive variable X(i,j); 结合 SDP 工具声明对称半正定矩阵变量
- 半定锥约束的定义 — 使用
psdcon 等约束类型定义矩阵必须属于半定锥
- 目标函数中的矩阵变量 — 目标函数可以包含矩阵变量的迹(Trace)或内积
- 对称矩阵的向量化处理 — 将对称矩阵的上三角元素向量化,以减少变量数量
典型的 SDP 应用问题包括:
- 最大割问题(Max-Cut) — 使用 Goemans-Williamson 半定松弛进行近似求解
- 矩阵完备化问题(Matrix Completion) — 在已知部分元素的条件下恢复低秩矩阵
- 控制系统中的 LMI 问题 — 线性矩阵不等式在控制器设计中的应用
- 传感器网络定位 — 使用 SDP 松弛进行分布式定位求解
MOSEK 采用原始-对偶内点法求解 SDP 问题,其算法具有良好的数值稳定性和可扩展性,能够处理数百维的半定矩阵变量。对于大规模 SDP 问题,MOSEK 通过利用矩阵的稀疏性结构和并行计算技术来提升求解效率。
5. DetailedDescription(详细说明)
下表列出了 MOSEK 求解器的主要参数选项,包括参数名称、描述说明、数据类型和默认值。用户可根据具体问题特性调整这些参数以获得最佳求解性能。
| 参数名称 |
描述说明 |
类型 |
默认值 |
| MSK_IPAR_OPTIMIZER |
选择求解算法:0=默认自动选择,1=内点法,2=原始单纯形法,3=对偶单纯形法,4=原始单纯形法(热启动),5=对偶单纯形法(热启动),6=并发(同时运行多种算法) |
整数 |
0(自动) |
| MSK_DPAR_OPTIMIZER_FEAS_TOL |
原始可行性容差,控制约束违反程度的允许范围,值越小精度越高 |
双精度 |
1.0e-8 |
| MSK_DPAR_INTPNT_QO_TOL_DFEAS |
内点法的对偶可行性容差 |
双精度 |
1.0e-8 |
| MSK_DPAR_INTPNT_QO_TOL_PFEAS |
内点法的原始可行性容差 |
双精度 |
1.0e-8 |
| MSK_DPAR_INTPNT_QO_TOL_REL_GAP |
内点法相对对偶间隙容差,求解器认为达到此间隙即收敛 |
双精度 |
1.0e-8 |
| MSK_IPAR_INTPNT_MAX_ITERATIONS |
内点法最大迭代次数上限 |
整数 |
400 |
| MSK_DPAR_OPTIMIZER_MAX_TIME |
求解最大时间限制(秒),超过此时间求解器将终止并返回当前最佳解 |
双精度 |
1.0e15(无限) |
| MSK_IPAR_SIM_MAX_ITERATIONS |
单纯形法最大迭代次数 |
整数 |
10000000 |
| MSK_DPAR_SIM_FEAS_TOL |
单纯形法可行性容差 |
双精度 |
1.0e-7 |
| MSK_IPAR_LOG |
日志输出级别:0=无输出,1=仅错误,2-4=逐步详细,5=标准输出,6-10=详细调试输出 |
整数 |
5 |
| MSK_IPAR_LOG_FILE |
日志文件输出级别(0=禁用日志文件,1=启用日志文件输出) |
整数 |
0 |
| MSK_SPAR_LOG_FILE |
日志文件的输出路径,指定后将日志写入文件 |
字符串 |
""(空字符串) |
| MSK_IPAR_NUM_THREADS |
并行计算线程数,0=自动检测并使用所有可用核心 |
整数 |
0(自动) |
| MSK_IPAR_PRESOLVE_USE |
预处理开关:0=禁用预处理,1=启用预处理(推荐),2=仅预处理但不求解 |
整数 |
1(启用) |
| MSK_IPAR_MIO_MODE |
混合整数优化模式:0=自动选择,1=传统的分支定界,2=使用卫星求解器加速 |
整数 |
0(自动) |
| MSK_DPAR_MIO_DISABLE_TERM_TIME |
MIP求解时间限制(秒),超过则终止 |
双精度 |
1.0e15(无限) |
| MSK_DPAR_MIO_TOL_ABS_GAP |
MIP绝对间隙容差,当前最佳解与对偶界的绝对差距小于此值即终止 |
双精度 |
1.0e-6 |
| MSK_DPAR_MIO_TOL_REL_GAP |
MIP相对间隙容差,当前最佳解与对偶界的相对差距小于此值即终止 |
双精度 |
1.0e-4 |
| MSK_IPAR_SDP_CONVERSION |
SDP问题转换方式:0=不使用转换,1=自动选择合适的转换方法 |
整数 |
1(自动) |
| MSK_IPAR_INFEAS_REPORT_AUTO |
不可行性报告开关:0=禁用,1=启用自动不可行性分析报告 |
整数 |
0 |
MOSEK 求解状态码含义:Optimal(求解成功,找到最优解)、Primal Infeasible(原始问题不可行)、Dual Infeasible(对偶问题不可行,原始问题无界)、Near Optimal(接近最优解,满足容差)、Unknown(求解过程被中断,如超时)。用户可通过 GAMS 的模型状态和求解状态输出来获取收敛信息。
6. SettingUpLicense(许可证设置)
MOSEK 采用许可证文件机制进行授权管理,许可证文件通常命名为 mosek.lic。正确配置许可证是正常使用 MOSEK 求解器的前提。以下是许可证设置的详细说明:
6.1 许可证文件获取
用户购买 MOSEK 后,MOSEK ApS 会通过电子邮件发送许可证文件(mosek.lic),其中包含授权信息、有效期和授权的功能模块。请妥善保管该文件,切勿泄露给未授权用户。
6.2 许可证文件放置位置
MOSEK 在启动时会按照以下顺序自动搜索许可证文件:
- 环境变量
MOSEKLM_LICENSE_FILE 指定的路径(优先级最高)
- 当前工作目录下的
mosek.lic
- 用户主目录下的
~/mosek/mosek.lic(Linux/Mac)或 %USERPROFILE%\mosek\mosek.lic(Windows)
- MOSEK 安装目录下的
mosek.lic
6.3 环境变量设置
推荐通过设置环境变量 MOSEKLM_LICENSE_FILE 来指定许可证文件路径:
- Windows:
set MOSEKLM_LICENSE_FILE=C:\ProgramData\MOSEK\mosek.lic(或在系统属性中设置永久环境变量)
- Linux/Mac:
export MOSEKLM_LICENSE_FILE=/opt/mosek/mosek.lic(可添加到 .bashrc 或 .zshrc 中)
6.4 浮动许可证配置
如果使用的是浮动许可证(Floating License),需要配置许可证服务器:
- 在许可证服务器上安装 MOSEK 许可证管理器(MOSEK License Manager)
- 将许可证文件放置在服务器上,启动许可证服务
- 在客户端设置
MOSEKLM_LICENSE_FILE 指向服务器,格式为 port@hostname(例如 27000@licserver.company.com)
6.5 GAMS 中的许可证配置
对于 GAMS 用户,MOSEK 的许可证需与 GAMS 许可证配合使用。在 GAMS 环境中,MOSEK 的许可证路径可通过以下方式配置:
- 确保
MOSEKLM_LICENSE_FILE 环境变量已正确设置
- 或在 GAMS 工作目录中放置
mosek.lic 文件
- 或在 GAMS 的配置文件
gamsconfig.yaml 中指定 MOSEK 许可证路径
6.6 验证许可证配置
使用以下方法验证许可证是否正确配置:
- 在命令行执行
mosek 或 mosek --license,查看许可证状态
- 在 GAMS 中运行一个简单的 LP 问题(如
solve test using lp minimizing z;),观察求解器是否正常调用
- 查看求解日志中的许可证信息行,确认授权状态和有效期
6.7 常见问题排查
| 问题现象 |
可能原因 |
解决方法 |
| License Not Found 错误 |
许可证文件路径不正确或环境变量未设置 |
检查环境变量和文件路径 |
| License Expired 错误 |
许可证已过有效期 |
联系供应商续订 |
| Feature Not Available 错误 |
当前许可证不包含所需功能模块 |
检查授权功能列表 |
| Server Not Responding 错误 |
浮动许可证服务器未启动或网络不通 |
检查服务器状态及网络连接 |
完成上述配置后,重新启动 GAMS 即可正常调用 MOSEK 求解器。如仍有问题,请查看 MOSEK 安装目录下的日志文件或联系技术支持获取帮助。
在线留言
尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。
|