4.3. 使用 C++ 语言调用 MindOpt¶
本节通过一个简单的示例展示如何使用 C++ 语言调用 MindOpt 实现优化模型的读取与求解。
4.3.1. 编辑.cpp文件¶
以下我们将展示如何在 .cpp
文件中调用 MindOpt C++ API 读取优化问题模型文件并进行求解。
首先导入 C++ 头文件:
8#include "MindoptCpp.h"
然后创建环境和优化模型:
26 MDOEnv env = MDOEnv();
27 MDOModel m = MDOModel(env);
之后使用 MDOModel::read()
来读取 MPS/LP 格式的优化问题:
35 m.read(argv[1]);
最后使用 MDOModel::optimize()
来求解问题,并调用 MDOModel::get()
来得到最优解的目标函数值。
40 m.optimize();
41 cout << "Total meal cost: " << m.get(MDO_DoubleAttr_ObjVal) << endl;
以下为完整的源代码文件 read_mps.cpp。
1/**
2 * Description
3 * -----------
4 *
5 * Read model from an MPS/LP file, and call optimizer to solve the problem.
6 */
7#include <iostream>
8#include "MindoptCpp.h"
9
10
11using namespace std;
12
13int main(
14 int argc,
15 char * argv[])
16{
17 if (argc != 2)
18 {
19 return 0;
20 }
21
22 /*------------------------------------------------------------------*/
23 /* Step 1. Create a model and change the parameters. */
24 /*------------------------------------------------------------------*/
25 /* Create an empty model. */
26 MDOEnv env = MDOEnv();
27 MDOModel m = MDOModel(env);
28
29 try
30 {
31 /*--------------------------------------------------------------*/
32 /* Step 2. Input model. */
33 /*--------------------------------------------------------------*/
34 /* Read model from file. */
35 m.read(argv[1]);
36 /*--------------------------------------------------------------*/
37 /* Step 3. Solve the problem and print the result. */
38 /*--------------------------------------------------------------*/
39 /* Solve the problem. */
40 m.optimize();
41 cout << "Total meal cost: " << m.get(MDO_DoubleAttr_ObjVal) << endl;
42 }
43 catch (MDOException & e)
44 {
45 std::cerr << "===================================" << std::endl;
46 std::cerr << "Error : code <" << e.getErrorCode() << ">" << std::endl;
47 std::cerr << "Reason : " << e.getMessage() << std::endl;
48 std::cerr << "===================================" << std::endl;
49
50 return static_cast<int>(e.getErrorCode());
51 }
52
53 return 0;
54}
在安装路径 <MDOHOME>/<VERSION>/examples/cpp
下可以找到更多 C++ 语言相关示例文件。
4.3.2. Linux平台上编译¶
我们在安装路径 <MDOHOME>/<VERSION>/examples/cpp
下提供了示例文件。在 linux 平台上有两个版本的 C++ 静态库。
libmindoptcpp_g++4.8.a 适用于 g++ 编译器版本大于等于 4.8 且小于 5.2, libmindoptcpp_g++5.2.a 适用于 g++ 编译器版本大于等于5.2。
以 linux x86, g++ 5.5 为例,在此路径下执行以下指令编译示例代码、链接 MindOpt 动态库并执行优化求解:
c++ -std=c++11 -O2 -DNDEBUG -Wl,-rpath,../../linux64-x86/lib -I../../linux64-x86/include -o read_mps read_mps.cpp -L../../linux64-x86/lib -lmindoptcpp_g++5.2 -lmindopt
./read_mps ../data/afiro.mps
同时我们提供了 Makefile 脚本,可以通过 make 指令来编译和执行示例代码:
# Compile and execute
make read_mps
./read_mps ../data/afiro.mps
# 使用 'make test' 命令自动编译和执行所有示例
make test
4.3.3. macOS平台上编译¶
我们在安装路径 <MDOHOME>/<VERSION>/examples/cpp
下提供了示例文件。以 macOS x86 为例,在此路径下执行以下指令编译示例代码、链接 MindOpt 动态库并执行优化求解:
c++ -std=c++11 -O2 -DNDEBUG -Wl,-rpath,../../osx64-x86/lib -I../../osx64-x86/include -o read_mps read_mps.cpp -L../../osx64-x86/lib -lmindoptcpp -lmindopt
./read_mps ../data/afiro.mps
同时我们提供了 Makefile 脚本,可以通过 make 指令来编译和执行示例代码:
# Compile and execute
make read_mps
./read_mps ../data/afiro.mps
# 使用 'make test' 命令自动编译和执行所有示例
make test
4.3.4. Windows平台上编译¶
对于 Windows 平台用户,首先安装 Visual Studio 2019 或以上版本,之后打开 x64 Native Tools Command Prompt (在开始菜单中键入 cmd 即可看到此程序) 并切换路径至 <MDOHOME>\<VERSION>\examples\cpp
,在此路径下执行以下指令编译示例代码、链接 MindOpt 动态库并执行优化求解:
cl /I ../../win64-x86/include read_mps.cpp /link /LIBPATH:../../win64-x86/lib mindopt.lib mindopt_c++mt.lib
read_mps.exe ..\data\afiro.mps
同时我们也提供了 Makefile 脚本,可以通过 nmake 指令来编译和执行示例代码:
# Compile and execute
nmake read_mps
read_mps.exe ..\data\afiro.mps
# 使用 'nmake test' 命令自动编译和执行所有示例
nmake test