2023年11月29日发(作者:)
c#与Lingo混合编程解决整数⼆次规划(⾮线性规划)问题
Lingo安装完后在其⽬录下有⼀些实例项⽬可以学习如下图所⽰,实例中讲的是关于线性规划:⽣产电脑最⼤利润问题,本章节进⾏改编:
整形⾮线性规划问题。
(请注意,吐槽开始
VS2010下,适⽤于控制台命令窗⼝,winform, webform 下述是以控制台窗⼝调⽤实例。
当遇到以下情况,改⼀下⽬标平台为anycpu,控制台命令窗⼝,winform即可解决并VS运⾏正常,但是webform仍然出错,⽹上查了好
多解决⽅法,如IIS应⽤池32,64 适配true; 项⽬.csproj 添加
最后才发现其实没有问题,虽然在VS上运⾏出错,但是项⽬发布后正常运⾏,真是兜兜转转⼀⼤圈花费了1个星期才发现什么都不⽤改。)
⽬标函数:
min=(x1-80)^2 + (x2-10)^2 + (x3-10)^2
约束条件:
接下来是在c# 项⽬中将上述的c1,c2,a,b⼿动输⼊,调⽤lingo解决。
⾸先lingo改成如下:
pointer(n):1-4: 需要动态输⼊。 5-7:返回的结果
c#项⽬中代码如下:
代码有点多,请耐⼼观看。
本例是根据例⼦改变⽽成,主要的区别是在于c1,c2,a,b的书写格式。⼀般的流程就是调⽤dll⽅法打开指定⽬录的lng⽂件,成功后输⼊参
数,在打印结果。
int nError = -1, nPointersNow = -1;
const string strModelFile = "lingo64_17programming samplesc#"; // Model file name
// Make sure model file exists
if (!(strModelFile))
{
ine("*** Unable to find model file: {0}n", strModelFile);
goto FinalExit;
}
// Get a pointer to a Lingo environment
IntPtr pLingoEnv;
pLingoEnv = teEnvLng();
if (pLingoEnv == )
{
ine( "Unable to create Lingo environment.n");
goto FinalExit;
}
// Open LINGO's log file
nError = LogFileLng( pLingoEnv, "lingo64_17programming samplesc#");
if (nError != _NO_ERROR_LNG) goto ErrorExit;
//在下⾯的代码中,我们建⽴回调函数。解算器模型处理时,解算器周期性地调⽤回调。
//每当Lingo遇到错误时,都会调⽤错误回调。
//回调是可选的——如果不是,则不必声明它们需要。
//可选地,声明回调数据(在全局上分配防⽌gc重新定位的堆)
CallbackData cbData;
acks = 0;
{
// Pass /Lingo the addresses of the transfer areas for input and output data:
// Pass Lingo the pointer to the objective coefficients (refer to the template model, )
//将输⼊和输出数据传输区域的地址⽤⾏话传递给:
//将指针传递给⽬标系数(请参阅模板模型)
nError = ointerLng(pLingoEnv, c1, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
// Pass a pointer to the production limits //将指针传递到⽣产限制
nError = ointerLng(pLingoEnv, c2, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
// Pointer to the labor utilization coefficients //指向劳动利⽤系数的指针
nError = ointerLng(pLingoEnv, a, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
nError = ointerLng(pLingoEnv, b, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
// Point to dObjective, where Lingo will return the objective value //指向dObjective,其中Lingo将返回⽬标值
nError = ointerLng(pLingoEnv, pdObjective, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
// Pointer to the solution status code //指向解决⽅案状态代码的指针
nError = ointerLng(pLingoEnv, pdStatus, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
// Point to the variable value array //指向变量值数组
nError = ointerLng(pLingoEnv, x, ref nPointersNow);
if (nError != _NO_ERROR_LNG) goto ErrorExit;
//这是我们要运⾏LINGO的脚本。这个“take”命令加载
//从外部⽂件建模。或者,cScript可以被加载通过使⽤模型⽂本,来避免⽂件访问。
} else {
}
lingo单独运⾏如下:


发布评论