LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等。

  下面介绍一下我从网上总结学习到的一些lingo知识:

  内置函数:

  • @bin(x):限制x只能为0或1,通常在0-1规划中使用
  • @gin(x):限制x只能为整数
  • @free(x):在lingo软件中,x默认为负数,使用@free(x)可以取消x非负数的限制。
  • @abs(x):取x的绝对值
  • @exp(x):返回e^x的值
  • @sin(x),@cos(x),@tan(x):返回对应三角函数的值 

   下面通过几个例题来实际介绍一下这些内置函数

第一题:

在lingo软件中,默认变量的值是大于等于零的,所以第四个约束条件可以省略不写,代码如下:

MODEL:
MAX =4*X1+3*X2;
2*X1+X2<=10;
X1+X2<=8;
X2<=7;
END

运行结果如下:

即X1=2,X2=6的时候,取得目标函数的最大值。 

 第二题:要求X1,X2均为整数:

在整数的要求下,可以使用@gin(x)这个函数,它要求变量X必须是整数。

MODEL:
MAX=40*X1+90*X2;
9*X1+7*X2<=56;
7*X1+20*X2<=70;
@gin(X1);@gin(X2);
END

运行截图:

第三题:0-1规划问题:要求变量只能是0或1。

Lingo软件提供了@bin(x)这个函数,它规定了变量只能是0或者1这两个量。

MODEL:
MAX=X1*X1+0.4*X2+0.8*X3+1.5*X4;
3*X1+2*X2+6*X3+10*X4<=10;
@BIN(X1);@BIN(X2);@BIN(X3);@BIN(X4);
END

 第四题:非线性规划问题:

 在lingo软件中,提供了绝对值函数@abs,可以直接使用来表示目标函数。

 代码如下:

MODEL:
MIN=@ABS(X1)+2*@ABS(X2)+3*@ABS(X3)+4*@ABS(X4);
X1-X2-X3+X4=0;
X1-X2+X3-3*X4=1;
X1-X2-2*X3+3*X4=-0.5;
END

 运行截图如下:

  LINGO一个重要特质就是集合(SETS):分为原始集和派生集:

  具体的格式为:

  原始集名/1.2.3...n/:属性1,属性2,属性3;

  派生集名(原始集名1,原始集名2):属性1,属性2;

  其中集合操作函数有:@SUM,@FOR,@PROD等等。

  利用lingo解决指派问题:已经知道下列工人完成指定的工作时间如下表:

MODEL:
SETS:
VAR/1..4/; !定义一个原始集;
LINK(VAR,VAR):C,X;  !定义一个4*4的派生集,即为指派数组;
ENDSETS
DATA:
C=15 18 21 24
  19 23 22 18
  26 17 16 19
  19 21 23 17;
ENDDATA
MIN=@SUM(LINK:C*X);
@FOR(VAR(I):@SUM(VAR(J):X(I,J))=1); !每一个工作都有人解决;
@FOR(VAR(J):@SUM(VAR(I):X(I,J))=1); !每一个人都有工作做;
@FOR(LINK:@BIN(X));
END

 运行截图如下所示:

即:甲——B,乙——A,丁——C,丙——D.

用LINGO解决0-1背包问题:

给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个,规定重量不能超过8,价值和重量如下:

v[]={2,1,4,3,5};
w[]={1,4,2,3,5};

代码如下:

MODEL:
SETS:
JIHE/1..5/:VALUE,WEIGHT,CHOOSE;
ENDSETS
DATA:
VALUE=2,1,4,3,5;
WEIGHT=1,4,2,3,5;
ENDDATA
MAX=@SUM(JIHE:VALUE*CHOOSE);
@SUM(JIHE:WEIGHT*CHOOSE)<=11;
@FOR(JIHE:@BIN(CHOOSE));
END

运行截图如下:

表示选择1,3,4,5的时候,总价值最大。