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

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

Note

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

4.4.1. 安装 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.2. Python 语言示例: mdo_mps

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

首先导入 Python 模块:

4import mindoptpy

然后,创建优化模型:

28        model.create_mdl()

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

29        model.read_prob(filename)

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

30        model.solve_prob()
31        model.display_results()

以下为完整的源代码文件 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.create_mdl()
29        model.read_prob(filename)
30        model.solve_prob()
31        model.display_results()
32
33    except MdoError as e:
34        logging.error("Received MindOpt exception.")
35        logging.error(" - Code          : {}".format(e.code))
36        logging.error(" - Reason        : {}".format(e.message))
37    except Exception as e:
38        logging.error("Received exception.")
39        logging.error(" - Reason        : {}".format(e))
40    finally:
41        model.free_mdl()
42
43

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