Lingo软件使用指南

  • 格式:doc
  • 大小:224.00 KB
  • 文档页数:45

Lingo软件使用指南

摘要:本文介绍了Lingo软件的基本使用方法。从最基本的使用到复杂问题的解决,本文给出了比较详细的介绍。Lingo软件是美国Lindo公司的产品,主要用来求解优化问题。它是一个非常强大的软件,可以求解大部分优化问题,包括线性规划、二次规划、整数规划、运输问题等,是目前全球应用最广泛的优化软件之一。这里我们简单介绍它的使用方法。

一 进入Lingo

如果你的计算机已经安装了Lingo,只需要在桌面上双击Lingo的快捷方式,就可以进入Lingo。为了使自己的程序易于阅读,经常需要有一些注释,因此在编写程序中,每一行前面有感叹号的表示这一行是注释行,在程序运行中不起作用,希望初学者养成注释的好习惯。

二 建立数学模型和 Lingo模型语言

例1 在Lingo的命令窗口中输入下面的线性规划模型

!目标函数;

MAX = 100 * x1 + 150 * x2;

!第一个约束;

X1<= 100;

!第二个约束;

X2 <= 120;

!第三个约束;

X1 + 2 * x2<= 160;

!end可有可无;

end

求解可得全局最优解:

Objective value: 14500.00

Variable Value

X1 100.0000

X2 30.00000

从这个例子可以看出,用Lingo软件求解一个简单的优化问题是非常容易的。我们只需要输入优化问题的两个主要部分:目标函数和约束,就可以直接求解。对于比较简单的问题,我们可以采取这种直接的方式去求解,但是,对于比较复杂的问题,用这种方式就不现实。比如下面的例2,这就必须要使用Lingo的模型语言。

例2 一个运输问题

假设WWW公司有6个仓库,储存着8个分厂生产所需要的原材料。要求每一个仓库的供应量不能超过储存量,而且每一个分厂的需求必须得到满足。问:如何组织运输,使总运输费用最小?已知从6个仓库到8个分厂的运输费用表。

表1 供应 表2 需求

分厂标号 需求量

V1 35

V2 37

V3 22

V4 32

V5 41

V6 32

V7 43

V8

38

仓库标号 供应能力

Wh1 60

Wh2 55

Wh3 51

Wh4 43

Wh5 41

Wh6 52

表3 运输费用

V1 V2 V3 V4 V5 V6 V7 V8

Wh1 6 2 6 7 4 2 5 9

Wh2 4 9 5 3 8 5 8 2

Wh3 5 2 1 9 7 4 3 3

Wh4 7 6 7 3 9 2 7 1 Wh5 2 3 9 5 7 2 6 5

Wh6 5 5 2 2 8 1 4 3

这个问题是一个典型的优化问题,通常称为运输问题。具体求解过程如下。

第一步:写出模型语言

1 构造目标函数。根据问题要求,可以设VOLUME_I_J表示从第I个仓库到第J个分厂运输原材料数。那么,总运费最小的目标函数为

MIN = 6 * VOLUME_1_1 + 2 * VOLUME_1_2 +

6 * VOLUME_1_3 + 7 * VOLUME_1_4 +

4 * VOLUME_1_5 +

·

·

·

8 * VOLUME_6_5 + VOLUME_6_6 + 4 * VOLUME_6_7 +

3 * VOLUME_6_8;

很显然,这样输入太麻烦,如果用Lingo模型语言来描述则简洁的多。

首先将目标函数表示为我们熟悉的数学语言

Minimize

然后将其转化为Lingo模型语言

MIN = @SUM( LINKS(I,J): COST(I,J) * VOLUME(I,J));

数学语言和Lingo模型语言之间的关系为:

数学语言 Lingo模型语言

Minimize MIN =

@SUM( LINKS( I, J): )

COST ij COST(I,J)

* *

VOLUME ij VOLUME(I,J)

2 构造约束函数。

第j个分厂的需求:VOLUME_1_j + VOLUME_2_j + VOLUME_3_j +

VOLUME_4_j + VOLUME_5_j + VOLUME_6_j = 35;

则每一个分厂的需求用数学语言描述为

VOLUMEij = DEMANDj, 对所有j 分厂

Lingo模型语言描述为

@FOR( VENDORS( J):

@SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J));

数学语言和Lingo模型语言之间的关系为:

数学语言 Lingo模型语言

for all j inVENDORS @FOR( VENDORS( J): )

@SUM( WAREHOUSES( I): )

VOLUME ij VOLUME( I, J)

= =

DEMAND j DEMAND( J)

第i个仓库的供应:

VOLUME ij <= CAP i ,

每一个仓库的供应能力约束为

VOLUME ij <= CAP i , 对所有i 仓库

Lingo模型语言描述为

@FOR( WAREHOUSES( I):

@SUM( VENDORS( J): VOLUME( I, J))<= CAPACITY( I));

这样,我们就把运输问题的两个约束都用Lingo模型语言写出来了。从而就得到了一个完整的模型:

MODEL:

MIN = @SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J));

@FOR( VENDORS( J):

@SUM( WAREHOUSES( I): VOLUME( I, J)) =DEMAND( J));

@FOR( WAREHOUSES( I):

@SUM( VENDORS( J): VOLUME( I, J)) <=CAPACITY( I));

END

但是,我们还没有定义模型中的变量,且没有把已知数据传进来。

第二步:定义变量集合

在这个问题中,我们要定义三个集合,即:仓库集合、分厂集合及运输集合。

定义方式如下:

SETS:

WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;

VENDORS / V1 V2 V3 V4 V5 V6 V7 V8/ : DEMAND;

LINKS( WAREHOUSES, VENDORS): COST, VOLUME;

ENDSETS

在这个定义中,三个变量集合包含在SETS和ENDSETS之间。仓库集合命名为WAREHOUSES,其中包含六个元素WHi(即六个仓库),且每个元素都有一个共同属性是供应量,命名为CAPACITY。分厂集合命名为VENDORS,其中包含八个元素Vj(即八个分厂),每个元素都有一个共同属性是需求量,命名为DEMAND。运输集合是由前两个集合派生出来的,用LINKS( WAREHOUSES, VENDORS)来表示这种派生关系,它中间包含48个元素,表示了从6个仓库到8个分厂之间的运输情况,其中每一个元素有两个属性,运输费用COST和运输量VOLUME。这样,我们就把模型中需要的所有变量都定义过了。

第三步:输入模型数据

按照所定义的变量,输入数据,格式如下:

DATA:

CAPACITY = 60 55 51 43 41 52;

DEMAND = 35 37 22 32 41 32 43 38;

COST = 6 2 6 7 4 2 5 9

4 9 5 3 8 5 8 2

5 2 1 9 7 4 3 3

7 6 7 3 9 2 7 1

2 3 9 5 7 2 6 5

5 5 2 2 8 1 4 3;

ENDDATA

可以看出,所有输入的数据都必须包含在DATA和ENDDATA之间。

经过这三步之后,我们就可以得到一个完整的Lingo文件。

MODEL:

!六个仓库供应八个分厂的一个运输问题;

SETS:

WAREHOUSES/ WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;

VENDORS/ V1 V2 V3 V4 V5 V6 V7 V8/: DEMAND;

LINKS (WAREHOUSES, VENDORS): COST, VOLUME;

ENDSETS

!目标函数;

MIN = @SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J));

!分厂需求约束;

@FOR( VENDORS( J):

@SUM( WAREHOUSES( I): VOLUME( I, J)) =DEMAND( J));

!仓库供应约束;