使用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)来检验自己编写的程序是否正确。
笔者曾经在参加数学建模时,使用此方法编写过分段函数,进行整数规划。经过检验,当初始值选取较合理时,可以搜索到全局最优解。当然,笔者的能力有限,测试方法也比较简单。还请大家验证一下这种方法,以免误导关注此方法的数学爱好者,如有缺陷还请大家指正。
This is a unique website which will require a more modern browser to work!
Please upgrade today!
Comments (0)
Be the first to leave a reply!