第1 期 作者简介:吴兴远(1987-),男,湖北武汉人,武汉大学本科生,研究方向为能源动力系统及其自动化;莫小宝(1987~),男,湖北武汉人,武汉大学本科生,研究方向为能源动力系统及其自动化;李佳(1988-),女,湖北武汉人,武汉大学本科生,研究方向为自动化。 0 引言 在工程设计、科学实验中经常遇到线性规划、整数规划、非线性规划等问题,解决这类问题广泛使用的方法为美国数学家Dantzig 提出的单纯形法和对偶单纯形法。 现已有很多数学软件集成了这些算法比如 matlab、mathmatical 等, 但是这类软件语法比较复杂不易掌握。Lingo 作为一款解决线性规划、非线性规划等的专业软件, 因为程序简单直观得到广泛应用。 并且Lingo 提供了与 C、C++、JAVA、FORTRAN 等高级语言交互的接口。 通过动态链接库文件嵌入到 C、C++、JAVA 等程序中,这样可以非常方便的在高级语言程序中进行多次或者循环地进行规划,大大减少了人工干预,提高了程序的运行效率,而且计算出的结果可以返回到程序中用于后续计算。 1 C++与 Lingo 接口实现 Lingo 与 VC、FORTRAN 等高级语言接口的主要思想是:Lingo 提供一个动态链接库文件(DLL),使得高级语言可以直接运行 Lingo 的命令脚本语言(commandscript),这样就可以在 Lingo 与高级语言之间进行数据传递以及各种操作。 下面简单介绍一下 Lingo 与 C++混合编程的方法。 1.1 建立 Lingo 与 C++的连接 添加头文件“lingd90.h”,动态链接库文件“Lingd90.lib”到工程中,并且用 #include“lingd90.h”语句将其写入所包含头的文件中。 下面就可以进入代码的编写, 首先要创建一个 Lingo 的对象,调用 LScreateEnvLng()函数,若调用成功则返回一个pLSenvLINGO 类型的 Lingo 句柄。 之后就要调用 LSopenLog-FileLng()函数创建一个 log 文件用于保存计算结果,以及 lingo 对结果的分析如灵敏度分析。 在计算完后必须调用 LScloseL- ogFileLng 函数关闭这个 Log 文件。 这样 Lingo 与 C++之间的接口环境就建立好了。 1.2 Lingo 与 C++之间数据传递 数据传递正确与否是影响程序计算结果的重要因素。数据传递是由 Lingo 程序中的 @POINTER (n) 函数与 C++程序中的 LSsetPointerLng (pLSenvLingopL,double* pdPointer,int* pn- PointersNow)函数共同完成的。LSsetPointerLng 函数中的第一参数指的是第一步中创建的 Lingo 句柄,第二个参数 pdPointer 指的是 C++程序要传递给 Lingo 的数据, 而 pnPointersNow 指该函数是第几次被调用,与 @POINTER(n)中的 n 相对应,这样可以保证数据正确地传给相对应的变量。 LSsetPointerLng 函数将 pdPointer 的内存地址传给 Lingo,这样 Lingo 就可以利用内存的数据进行计算。 语句如下: / / (C++程序中代码) nError = LSsetPointerLng( pLINGO, dProfit, &nPointer- sNow); ! (lingo 程序中的代码) profit = @pointer(1); 运行后