使用C++为lingo编写的自定义函数@user的dll库

Lingo可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。在工程应用中,往往需要编写复杂的目标函数,而此时Lingo内置的建模语言就显得力不从心了。而C++作为应用最广泛的编程语言之一,可以快速地编写几乎任何复杂的函数,若可以用C++为Lingo编写目标函数,那么Lingo处理问题的能力将大大增强。

在较新版本的Lingo中,已经支持用户自定义函数@user,通过开发插件,即可在Lingo中使用C++编写的函数。官方帮助在“Visual C++ Example”例程中提供了使用C++编写的方法,并且提供了Visual C++ 5.0的示例工程。

官方提供的C++源程序如下:

// sqroot.cpp : Defines the initialization
// routines for the DLL.

#include "stdafx.h"
#include "sqroot.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE

static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////
// CSqrootApp

BEGIN_MESSAGE_MAP(CSqrootApp, CWinApp)
         //{{AFX_MSG_MAP(CSqrootApp)
         // NOTE - the ClassWizard will add and
         // remove mapping macros here.
         // DO NOT EDIT what you see in these
         // blocks of generated code!
       //}}AFX_MSG_MAP
END_MESSAGE_MAP()
CSqrootApp::CSqrootApp()

{
  // The constructor
  // Remove next line for a "quiet" version
  // of MyUser.DLL

  AfxMessageBox("@USER DLL installed");
}

CSqrootApp theApp;
#include
extern "C" __declspec( dllexport)

void MyUser( int* pnNumberOfArgs,
double* pdArgs, double* dResult)

// This is an @USER routine callable by LINGO. In
// this particular case we simply take the
// square root of the first argument.

  *dResult = sqrt( *pdArgs);
}

示例中给出的是一个求平方根的函数。通过修改MyUser内的内容,即可实现所需的函数。其中,pnNumberOfArgs为传入参数个数,pdArgs为传入参数数组,类型为double,dResult为返回的函数值。

编写完成后,生成dll文件sqlroot.dll,关闭Lingo程序,并将此dll文件保存到Lingo程序的根目录下即可。在下一次启动Lingo时,会弹出一个窗口,这就说明自定义函数成功导入到了Lingo程序中。

在进行Lingo建模时,可用@USER(params)的方式调用自定义函数。建议大家在使用之前,先用x=@USER(params)来检验自己编写的程序是否正确。

笔者曾经在参加数学建模时,使用此方法编写过分段函数,进行整数规划。经过检验,当初始值选取较合理时,可以搜索到全局最优解。当然,笔者的能力有限,测试方法也比较简单。还请大家验证一下这种方法,以免误导关注此方法的数学爱好者,如有缺陷还请大家指正。

由于官方给出的示例工程版本为VC++5.0,使用起来非常不便(新版本Visual Studio不兼容),因此笔者特意将此工程转换为Visual Studio 2010版的工程,希望能给大家带来便捷。

Visual Studio 2010版本文件下载

尚无评论
快来抢沙发!

发表评论

* 必须填写

浏览器版本过低,无法访问该网站 试用Google Chrome