4.4. 使用 Python 语言调用 MindOpt 动态库

4.4.1. 简要示意

# 方法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()

后文将说明如何安裝使用 MindOpt Python 软件包,并提供 Python 语言的示例。该示例将读取 MPS 文件中的优化模型并进行优化求解。

Note

由于动态库只在应用程序实际运行时才进行链接,因此,用户必须在环境变量中指定动态库的路径,以便应用程序能够正确地定位到动态库。若环境变量未指定,则用户必须将动态库放置于应用程序旁。关于环境变量的设置说明,请参阅 安装说明。关于 Python 语言编译器版本的支持,请参阅 支持平台 中的说明。

在V0.24.1版本之后,MindOpt 的 Python 库新增 pip install 的方式。以下分两种方式来描述如何安装Python。

4.4.2. 从完整安装包安装 MindOpt Python 库

前提:已经完成了完整的单机安装包的安装,请参阅 安装说明

  1. (建议) 创建并激活一 Python 虚拟环境

conda create -n myenv python=3.9 --yes
conda activate myenv

Note

这一步用 conda 创建虚拟环境,并在该虚拟环境下安装 MindOpt 软件包 (conda的安装请参考: conda)。 即便不使用 conda 环境的,用户亦能在其他 Python 环境安装 MindOpt Python 软件包。但是经过试验,MindOpt Python 在 conda 下调用更为稳定。

  1. 安装 MindOpt Python依赖库:

python <MDOHOME>/<VERSION>/<PLATFORM>/lib/python/setup.py install

用户可以使用下面的命令来检查 MindOpt Python 包是否正确安装:

cd <MDOHOME>/<VERSION>/examples
python ./python/mdo_mps.py --filename=./data/afiro.mps

Warning

若使用默认的 Python 3.8+,则系统调用 MindOpt 动态库可能会导致以下调用问题:

from mindoptpy import *
ImportError: DLL load failed while importing mindoptpy

解决办法为:利用 os.add_dll_directory 来指定 MindOpt 动态库位置:

import os
os.add_dll_directory("<MDOHOME>/<VERSION>/<PLATFORM>/lib/")

4.4.3. pip install MindOpt Python 库

前提:无需安装单机包,具备pip的环境即可。

安装指令:

pip install mindoptpy

本安装方式,从V0.24.1版本开始,内嵌了一个特定License,有效期是:2023/01/01 ~ 2024/12/31。

本安装方式仅支持 mindoptpy 库,不支持 命令行调用 MindOpt 等其他功能。如需其他功能,请完整安装,参阅 安装说明

4.4.4. Python 语言示例: mdo_mps

以下,我们将展示如何用 MindOpt Python API 来读取 MPS/LP 格式的优化问题并进行求解。

首先导入 Python 模块:

4import mindoptpy

然后,创建优化模型:

28        model.read_prob(filename)

并使用 mindoptpy.MdoModel.read_prob() 来读取 MPS/LP 格式的优化问题:

29        model.solve_prob()

最后,使用 mindoptpy.MdoModel.solve_prob() 来求解问题,并调用 mindoptpy.MdoModel.display_results() 来查看优化结果。

30        model.display_results()
31

以下为完整的源代码文件 mdo_mps.py

 1"""
 2Test
 3"""
 4import mindoptpy
 5from mindoptpy import MdoError
 6import logging
 7import argparse
 8
 9
10def setup_logging(level):
11    logging.basicConfig(format='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %I:%M:%S %p', level=level)
12
13
14if __name__ == "__main__":
15
16    # Register arguments.
17    parser = argparse.ArgumentParser(description='Run MindOpt.')
18    parser.add_argument('--filename', type=str, default='../data/afiro.mps', help='Input LP/MPS filename.')
19    args = parser.parse_args()
20    filename = args.filename
21   
22    logging.info("Started MindOpt.")
23    logging.info(" - Filename  : {0}".format(filename))
24
25    model = mindoptpy.MdoModel()
26
27    try:
28        model.read_prob(filename)
29        model.solve_prob()
30        model.display_results()
31
32    except MdoError as e:
33        logging.error("Received MindOpt exception.")
34        logging.error(" - Code          : {}".format(e.code))
35        logging.error(" - Reason        : {}".format(e.message))
36    except Exception as e:
37        logging.error("Received exception.")
38        logging.error(" - Reason        : {}".format(e))
39    finally:
40        model.free_mdl()
41
42

在安装包的 <MDOHOME>/<VERSION>/examples/python 中可以找到更多 Python 相关示例文件。