4.2. 使用 C 语言调用 MindOpt¶
本节通过一个简单的示例展示如何使用 C 语言调用 MindOpt 实现优化模型的读取与求解。
4.2.1. 编辑.c文件¶
以下我们将展示如何在 .c
文件中调用 MindOpt C API 读取优化问题模型文件并进行求解。
首先导入 C 头文件:
9#include "Mindopt.h"
然后创建环境和优化模型:
25 MDOenv* env;
26 MDOemptyenv(&env);
27 MDOstartenv(env);
28 MDOmodel* model;
之后使用 MDOreadmodel()
来读取 MPS/LP 格式的优化问题:
34 CHECK_RESULT(MDOreadmodel(env, argv[1], &model));
之后使用 MDOoptimize()
来求解问题,并使用 MDOgetdblattr()
来查看最优解的目标函数。
40 CHECK_RESULT(MDOoptimize(model));
41 double obj;
42 CHECK_RESULT(MDOgetdblattr(model, MDO_DBL_ATTR_OBJ_VAL, &obj));
最后,使用 MDOfreemodel()
来释放内存空间。
50 MDOfreemodel(&model);
51 MDOfreeenv(&env);
以下为完整的源代码文件 read_mps.c。
1/**
2 * Description
3 * -----------
4 *
5 * Read model from an MPS/LP file, and call optimizer to solve the problem.
6 */
7#include <stdio.h>
8#include <stdlib.h>
9#include "Mindopt.h"
10
11
12/* Macro to check the return code */
13#define CHECK_RESULT(code) { int res = code; if (res != 0) { fprintf(stderr, "Bad code: %d\n", res); exit(res); } }
14
15int main(int argc, char* argv[])
16{
17 if (argc != 2)
18 {
19 return 0;
20 }
21 /*------------------------------------------------------------------*/
22 /* Step 1. Create a environment and model. */
23 /*------------------------------------------------------------------*/
24 /* Create an empty model. */
25 MDOenv* env;
26 MDOemptyenv(&env);
27 MDOstartenv(env);
28 MDOmodel* model;
29
30 /*------------------------------------------------------------------*/
31 /* Step 2. Input model. */
32 /*------------------------------------------------------------------*/
33 /* Read model from file. */
34 CHECK_RESULT(MDOreadmodel(env, argv[1], &model));
35
36 /*------------------------------------------------------------------*/
37 /* Step 3. Solve the problem and print the result. */
38 /*------------------------------------------------------------------*/
39 /* Solve the problem. */
40 CHECK_RESULT(MDOoptimize(model));
41 double obj;
42 /* Print the result. */
43 CHECK_RESULT(MDOgetdblattr(model, MDO_DBL_ATTR_OBJ_VAL, &obj));
44 printf("Obj value: %f\n", obj);
45
46 /*------------------------------------------------------------------*/
47 /* Step 4. Free the model ane the environment. */
48 /*------------------------------------------------------------------*/
49 /* Free the model. */
50 MDOfreemodel(&model);
51 /* Free the environment. */
52 MDOfreeenv(&env);
53 return 0;
54}
在安装路径 <MDOHOME>/<VERSION>/examples/c
下可以找到更多 C 语言相关示例文件。
4.2.2. Linux平台上编译¶
我们在安装路径 <MDOHOME>/<VERSION>/examples/c
下提供了示例文件。以 linux x86 为例,在此路径下执行以下指令编译示例代码、链接 MindOpt 动态库并执行优化求解:
cc -std=c99 -O2 -DNDEBUG -Wl,-rpath,../../linux64-x86/lib -I../../linux64-x86/include -o read_mps read_mps.c -L../../linux64-x86/lib -lmindopt
./read_mps ../data/afiro.mps
同时我们也提供了 Makefile 脚本,可以通过 make 指令来编译和执行示例代码:
# Compile and execute
make read_mps
./read_mps ../data/afiro.mps
# 使用 'make test' 命令自动编译和执行所有示例
make test
4.2.3. macOS平台上编译¶
我们在安装路径 <MDOHOME>/<VERSION>/examples/c
下提供了示例文件。以 macOS x86 为例,在此路径下执行以下指令编译示例代码、链接 MindOpt 动态库并执行优化求解:
cc -std=c99 -O2 -DNDEBUG -Wl,-rpath,../../osx64-x86/lib -I../../osx64-x86/include -o read_mps read_mps.c -L../../osx64-x86/lib -lmindopt
./read_mps ../data/afiro.mps
同时我们也提供了 Makefile 脚本,可以通过 make 指令来编译和执行示例代码:
# Compile and execute
make read_mps
./read_mps ../data/afiro.mps
# 使用 'make test' 命令自动编译和执行所有示例
make test
4.2.4. Windows平台上编译¶
对于 Windows 平台用户,首先安装使用 Visual Studio 2019 或以上版本,之后打开 x64 Native Tools Command Prompt (在开始菜单中键入 cmd 即可看到此程序) 并切换路径至 <MDOHOME>\<VERSION>\examples\c
,在此路径下执行以下指令编译示例代码、链接 MindOpt 动态库并执行优化求解:
cl /I ../../win64-x86/include read_mps.c /link /LIBPATH:../../win64-x86/lib mindopt.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