第十章 Lingo软件包及其应用

Lingo软件包是一种专门用来求解数学规划和优化问题的软件包,由美国芝加哥大学的Linus Schrage教授创立的Lindo系统公司开发出来,可以在Windows和Linux环境下运行,同一版次具有不同的版本,如:演示版(试用版)、学生班、高级版、超级版、工业版、扩展版等等,不同的版本对求解问题的规模、变量数目和约束条件的限制不同。

对于Lingo软件包来说,编写很简单的程序就能调用大量的外部已有数据进行优化计算,是其出色的亮点。

§9.1 Lingo软件包的基础知识

(一)Lingo软件包的运算符

(1)算术运算符(Arithmetic Operators)

— 取反(negation) ^ 乘方(Exponentiation) * 乘法(Multiplication) / 除(Division)

+ 加(Addition) — 减(Subtraction)

(2)逻辑运算符

Lingo软件包的逻辑运算符,主要用于优化计算中定义各种逻辑条件。逻辑运算符为:

#NOT# 非运算 #EQ# 相等 #NE# 不相等 #GT# 严格大于 #GE# 大于等于 #LT# 严格小于 #LE# 小于等于 #AND# 与 #OR# 或

(3)关系运算符

Lingo软件包中的关系运算符用在数学表达式中。 = 等号

<= 小于等于 >= 大于等于

注:Lingo软件包不支持严格大于和严格小于,即,在Lingo软件包的数学表达式中“>”等价于“>=”,“<”等价于“<=”。

运算符的运算优先级(Priority Level)由高到低依次为:

1

优先级 运算符 最高级 #NOT# —(negation) ^ * / + -

#EQ# #NE# #GT# #GE# #LT# #LE# #AND# #OR#

最低级 <= = >=

(4)Lingo软件包的内部函数

Lingo软件包提供下列内部函数:

@ABS( X) 绝对值函数 @COS( X) 余弦函数 @EXP( X)

e函数

x@FLOOR( X) 小于X的最大整数

@LGM( X) log((X?1)!),即(X?1)!的自然对数

@LOG( X) 自然对数

@SIGN( X) 符号函数,当X < 0时,取值-1,否则取值+1 @SIN( X) 正弦函数

@SMAX( X1, X2,..., XN) 求最大 @SMIN( X1, X2,..., XN) 求最小 @TAN( X) 正切函数

@IF If函数,使用格式为:@IF(条件,T,F),即,条件为真时,得到T,

否则得到F。

@SUM 求和函数

@FREE(X) 取消变量X的非负限制(Lingo在求解优化问题时,默认所有

变量非负)

@FOR 优化计算时,用于限定约束条件 @bin(X) 限定X是(0,1)变量

@bnd(下界,X,上界) 限定 下界?X?上界 @gin(X) 限定X为整数变量

例如,@FOR(A(i,j)|a(i,j)#gt#0:@bin(x(i,j))) 表示限定矩阵A中元素:当a(i,j)?0 时,对应的变量x(i,j)是(0,1)变量。 注:

(1)在Lingo软件包中调用内部函数,一定要以@符号开头。 (2)在Lingo软件包中,model、sets、data以“:”结尾,其它语

2

句每行都以“;”结尾,endsets、enddata、end尾部不加任何符号。 (3)以!开头,书写注释行,结尾用“;”。

(4)在Lingo软件包中,不能写100x,要写成100*x

(5)无论是否是求解优化问题,Lingo的结果中都有松弛分析(Slack or Surplus)

(6)Lingo软件包求解时,已经假设所有变量?0

例10-1 在Lingo软件包中编写如下程序: model: data: m=?; n=?; enddata

f=@sin(m)+@cos(n); end

执行后,依次输入m?1、n?2,得到结果: Feasible solution found at iteration: 0 Variable Value

M 1.000000 N 2.000000 F 0.4253241 Row Slack or Surplus 1 0.000000

注:如果输入m?1、n?3,则,得不到有效的结果,这说明Lingo软件包不能做通常的数学计算,它的优点在于优化计算。

(5)Lingo软件包编程的基本格式

格式1 model: 开头,end 结尾 格式2 model: 开头,结尾省略end 格式3 省略model: 和end

3

例10-2 在Lingo软件包中,求解下列线性规划问题:

maxf?100x?150y???s.t.??x??x?100y?120?2y?160x,y?0

Lingo软件包中优化程序如下: model:

max = 100 * x + 150 * y; x <= 100; y <= 120;

x + 2 * y <= 160; end

执行后得到结果:

Global optimal solution found at iteration: 0 Objective value: 14500.00

Variable Value Reduced Cost

X 100.0000 0.000000 Y 30.00000 0.000000 Row Slack or Surplus Dual Price 1 14500.00 1.000000 2 0.000000 25.00000 3 90.00000 0.000000 4 0.000000 75.00000

即,目标函数fmax?14500,最优解x?100,y?30。

例10-3 在Lingo软件包中,利用FREE函数的功能,可以求解变量可取负值的优化问题;利用IF函数,可以求解分段函数的优化问题:

minF?fx?fy

??100,x?0fx?2x????0,x?0???60?3y,y?0 s.t.?fy???2y,y?0??x?y?30??Lingo软件包中优化程序如下: model: min=fx+fy;

fx=@if(x#gt#0,100,0)+2*x; fy=@if(y#gt#0,60+3*y,2*y);

4