首页 优化求解器 开发指南 求解器用户手册

求解器用户手册

优化求解器的用户手册,介绍求解器的调用方式、如何输入问题和求解器的APIs清单。

说明

由于本软件APIs比较多,且还在高频增加功能中,因此APIs的介绍会较多地引导至另一个《MindOpt用户使用手册——完整版》的【中文】【英文】上查看细节。给您带来的不连贯阅读体验敬请谅解。

优化求解器调用方式

在使用之前,请先下载和安装求解器SDK,并获取使用权限,见快速入门(开通和使用)求解器SDK下载和安装

下面列出简单的示例,求解器细节的调用方式和完整案例可查看更多

命令行调用示例:

Linux以及macOS下,假设用户根据安装文档将MindOpt安装到环境变量$MINDOPT_HOME指定目录:

mindopt $MINDOPT_HOME/examples/data/afiro.mps

Windows下

mindopt %MINDOPT_HOME%\examples\data\afiro.mps

C/C++/Java/Python语言调用示例:

# 方法1:从0.19.0版本开始引入新式的创建模型方式,云鉴权更快,消耗的并发度少
env = mindoptpy.MdoEnv()
model = mindoptpy.MdoModel(env)
model.read_prob(filename)
model.solve_prob()
model.display_results()

# 方法2:旧式的创建模型方式仍然支持
# model = mindoptpy.MdoModel()
# model.read_prob(filename)
# model.solve_prob()
# model.display_results()
//<dependency>
//    <groupId>com.alibaba.damo</groupId>
//    <artifactId>mindoptj</artifactId>
//    <version>[0.20.0,)</version>
//</dependency>
// load动态链接库,如下:
Mdo.load("c:\\mindopt\\0.20.0\\win64_x86\\lib\\mindopt_0_20_0.dll");

// 方法1:从0.19.0版本开始引入新式的创建模型方式,云鉴权更快,消耗的并发度少
//Set up environment,放在程序初始化的时候进行,例如MapReduce里的setup阶段
MdoEnv env = new MdoEnv();
//create a model
MdoModel model = env.createModel();
model.readProb(filename)
model.solveProb();
model.displayResult();
model.free();
//JAVA SDK 需要手动释放 env,放在程序结束的时候进行,例如MapReduce里的cleanup阶段
env.free();

// 方法2:旧式的创建模型方式仍然支持,但被标记为过时,将在以后的版本中移除
/*
MdoModel model = new MdoModel();
model.readProb(filename)
model.solveProb();
model.displayResult();
*/
// 方法1:从0.19.0版本开始引入新式的创建模型方式,云鉴权更快,消耗的并发度少
using mindopt::MdoEnv;
MdoEnv env;
MdoModel model(env);
model.readProb(filename);
model.solveProb();
model.displayResults();

// 方法2:旧式的创建模型方式仍然支持
/*
MdoModel model;
model.readProb(filename);
model.solveProb();
model.displayResults();
*/
// 方法1:从0.19.0版本开始引入新式的创建模型方式,云鉴权更快,消耗的并发度少
MdoEnvPtr env;
MdoMdlPtr model;
Mdo_createEnv(&env);
Mdo_createMdlWithEnv(&model, env);
Mdo_readProb(model, filename);
Mdo_solveProb(model);
Mdo_displayResults(model);
Mdo_freeMdl(&model);
// C SDK 需要手动释放 env
Mdo_freeEnv(&env);

// 方法2:旧式的创建模型方式仍然支持
/*
MdoMdlPtr model;
Mdo_createMdl(&model);
Mdo_readProb(model, filename);
Mdo_solveProb(model);
Mdo_displayResults(model);
Mdo_freeMdl(&model);
*/

完整例子的代码请查看更多

支持求解的优化问题

当前版本的求解器支持:

优化问题的输入方式

优化问题支持3种输入方式:文件输入、数据建模APIs输入、外部建模工具调用。

方式1:文件输入

  • 支持 MPS 格式LP 格式,如 .mps.lp,以及对应文件的压缩文件如:.mps.gz.mps.bz2

  • 支持.dat-s格式, 如SDP问题示例。

  • mindoptampl模块支持.nl格式文件输入,如在命令行中输入mindoptampl filename.nl

更详细的介绍请查看更多

方式2:建模APIs输入

相关联的APIs有多种,同一个数据也可以有多种输入方式。

  • 按行输入Python示例简述:

    • mindoptpy.MdoModel.set_int_attr() 将目标函数设置为最小化;

    • mindoptpy.MdoModel.add_var() 来添加四个优化变量,并分别定义其下界、上界、名称和类型;

    • mindoptpy.MdoModel.add_cons() 来添加约束。

  • 按列输入Python示例简述:

    • mindoptpy.MdoModel.set_int_attr() 将目标函数设置为最小化;

    • 开始时调用 mindoptpy.MdoModel.add_cons() 来创建带有指定的左侧和右侧值的约束(无非零元素);

    • 创建临时的列对象 mindoptpy.MdoCol() 来按顺序地保存约束和非零元素的值;

    • 最后调用 mindoptpy.MdoModel.add_var() 来创建新的变量,及其相应的目标函数系数、列向量中的非零元、下界和上界、变量名以及变量类型。

更详细的介绍请查看更多。其中,模型的属性描述(Model Attributes)列表见更多

方式3:建模工具 AMPL、Pyomo、PuLP、MindOpt APL

MindOpt支持一些常见的建模工具,当前支持以下几种:

1. AMPL

使用 AMPL 调用 MindOpt 之前需要先安装 MindOpt 和 AMPL 。mindoptampl 应用位于安装包的\bin\mindoptampl。mindoptampl 提供了一些可配置的参数,用户可以通过 AMPL 的option命令设置 mindoptampl_options 参数,如:

ampl: option mindoptampl_options 'numthreads=4 maxtime=1e+4';

更详细的介绍和案例请查看更多

2. Pyomo

使用 Pyomo 调用 MindOpt 之前需要先安装 MindOpt 和 Pyomo。调用 MindOpt 求解器的 Pyomo API 需要使用接口文件 mindopt_pyomo.py。 MindOpt 的 Pyomo 接口是继承自 Pyomo 的 DirectSolver 类,实现代码在安装包的\lib\pyomo\mindopt_pyomo.py。在 Python 代码中导入该文件:

from mindopt_pyomo import MindoDirect

更详细的介绍和案例请查看更多

3. PuLP

使用 PuLP 调用 MindOpt 之前需要先安装 MindOpt 和 PuLP。调用 MindOpt 求解器的 PuLP API 需要使用接口文件 mindopt_pulp.py。 MindOpt 的 PuLP 接口继承自 PuLP 的 LpSolver 类,实现代码在安装包的\lib\pulp\mindopt_pulp.py。在 Python 代码中导入该文件:

from mindopt_pulp import MINDOPT

更详细的介绍和案例请查看更多

  1. MindOpt APL

2022年开始支持MindOpt APL建模语言。

重要

免费邀测通知:

  • 可在MindOpt云上建模求解平台通过浏览器使用建模语言和求解器,还包含案例,供快速入门。

  • 使用时,无需安装任何软件,打开浏览器即可使用。

求解时的参数设置

运行求解器可以设置输入参数,请参考可选输入参数章节。如设置求解器的最大求解时间"MaxTime"

计算设备配置参考:LP求解时不同算法特性

配置机器资源时候,不同问题结构、算法选择,耗费的机器资源会有差异,请根据需要测试选择。

关于LP求解,当前我们线性规划(LP)的求解提供了Simplex(单纯形法)、IPM(Interior Point Method,内点法)、Concurrent(并发优化)算法。在求解时候,执行流程如下文的“执行流程”图片所示,会默认选Concurrent,您可以通过设置“Method”参数来选择算法。

这3种算法的区别如下:

Simplex(单纯形法)

IPM(Interior Point Method,内点法)

Concurrent(同时优化)

特性

- 通常情况下对数值敏感低

- 耗费内存更少

- 支持Warm-start

- 对数值更敏感

- 比Simplex方法要多2~10倍的内存

- 不支持Warm-start

- 对大规模的问题可能更适用

- 同时进行两个方法的优化,耗费的内存更多

- 更鲁棒

- 在求解新类别问题的时候,建议先用本方法来尝试求解,帮助分辨Simplex或IPM方法哪种更合适,辅助后续算法选取

计算设备需求

不同问题可能有明显差异,请以实测为准。以下实验室的测试值供参考:

当问题约束量为43200,非零元素为1038761时

测试最大内存占用为350 MB

测试最大内存占用为620 MB

测试最大内存占用为920 MB

当问题约束量为986069,非零元素为4280320时

测试最大内存占用为1250 MB

测试最大内存占用为1500 MB

测试最大内存占用为1650 MB

当问题约束量为4284,非零元素为11279748时

测试最大内存占用为2050 MB

测试最大内存占用为5200 MB

测试最大内存占用为5200 MB

当问题约束量为22117,非零元素为20078717时

测试最大内存占用为3400 MB

测试最大内存占用为5600 MB

测试最大内存占用为8300 MB

说明

- 内存的消耗取决于问题的形式、规模以及稀疏程度,如需提前预估内存资源时,建议先通过问题的规模和稀疏程度来推算内存消耗,再乘以一定的倍数作为内存资源预留的预估值。

求解结果获取

命令行运行

命令行运行求解时,会打印输出求解过程输出和结果的summary,同时会在求解的文件处生成同名结果文档.bas.sol

如下图示意运行mindopt afiro.mps后,文件夹中生成了afiro.basafiro.sol文件,.bas文件保存的是基,.sol文件保存的是求解的最优目标值和变量值的解。命令行求解输出

API求解和获取结果

待求解的问题输入后,可以调用solveProb的API来求解,如python的求解指令model.solve_prob()

求解完后,可以调用API来获取结果,以Python为例:

  • 可以调用model.display_results()来打印输出。

  • 可以调用model.get_status()获取求解的状态。

  • 可以调用model.get_real_attr("PrimalObjVal")来获取原始目标值,类似地:

    • "DualObjVal"对应:对偶目标值

    • "PrimalSoln"对应:原始解

    • "ColBasis"对应:原始解的基

    • 更多解的属性描述(Solution Attributes)列表见更多

完整的代码示例可参考安装包的example文件夹,或文档更多

求解辅助分析工具

约束不可行性分析

在建模求解过程中,会遇到由于某些约束互相冲突导致问题不可行(infeasible)的情况,分析不可行问题并识别出导致约束冲突的关键约束能有效帮助建模。这类导致问题不可行的最小约束子集被称为不可约不可行系统 (IIS, irreduciable infeasible system)。

MindOpt 设计了用来计算IIS的API,当问题"INFEASIBLE"时,用户可以通过 compute IIS 的API来对不可行问题进行分析,如可依据此对IIS中的约束进行修正或移除,使得优化问题变得可行。

IIS的Python接口调用示例如下:

status_code, status_msg = model.get_status()
if status_msg == "INFEASIBLE":
    idx_rows, idx_cols = model.compute_iis()

完整的 compute IIS 的说明请参阅更多

求解器调参

MindOpt Tuner也可以对求解器超参调优,提供业务场景的数据,采用MindOpt Tuner,经过调参后,可以得到一个业务场景定制的更快的求解器。目前部分功能线上公测中。

其他功能

数据脱敏

MindOpt的命令行功能里有--sanitize 可进行数据脱敏,方便外发数据用于技术交流或求解器调参改进。其脱敏原理可以参考博客

求解器的执行流程

MindOpt的执行流程:

以下是线性规划LP问题的调用示例,在求解其他优化问题的时候,选择特定算法的地方会自动选择对应方法。

求解器执行流程

完整APIs和调用方式

完整的说明请查阅《MindOpt用户使用手册——完整版》,目录示意如下:

8. 完整的API说明

阿里云首页 优化求解器 相关技术圈