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单独运⾏如下: