lingo8.0完美教程

发布时间 : 星期二 文章lingo8.0完美教程更新完毕开始阅读

1

LINGO 基础以及在建模中的应用

LINGO 是一个利用线性规划和非线性规划来简洁地阐述、解决和分析复杂问题的简便工 具。LINGO 还是最优化问题得一种建模语言,包括许多常用的函数可供使用者建立模型时调用, 并提供与其他数据文件(如文本文件、EXCEL 电子表格文件、数据库文件等)的接口,程序执 行速度快,易于输入、修改、求解和分析问题。

和另外一种常用的建模语言MATLAB 相比,LINGO 有自己的独特的地方。在使用

MATLAB 表述一个数学模型问题的时候,需要将模型中的约束条件进行分类(即线性等式约束、 线性不等式约束、非线性等式约束、非线性不等式约束)转化成相应的矩阵形式以及相应的M 文件,如果是一个大规模的问题,还需要建立较多的M 文件,而且,当问题中的某些约束条件 有较小的改动的时候,会引起相应的M 文件有较大的改动,这就使得MATLAB 的灵活性较差。 而在使用LINGO 表述相同模型问题时,则只需要简单的“翻译”成相应的LINGO 程序即可。 同时LINGO 是一个专业的求解规划问题的软件,在求解速度和求解精度上都要比MATLAB 好。 但是MATLAB 也有自己的特点,所以读者在建模时,最好根据实际问题,恰当得混合使用这两 种软件,才能达到较好的建模效果。

LINGO 软件包有多种版本,但其软件内核和使用方法类似,本讲义以LINGO8.0 进行简 单介绍。学习本讲义,仅能够让读者能够运用LINGO8.0 建模语言表述实际问题,正确理解求 解过程所显示的状态,解读输出结果。作为一门建模语言,它非常灵活,不是本讲义所能完全 包含的,关于程序高级方面的设置和使用,可查看帮助文件和其他的相关资料。

一LINGO 基础

§1 LINGO 快速入门

当你在windows 下开始运行LINGO 系统时,和其他的windows 应用程序一样,会得到类似 下面的一个窗口:

外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之 下。在主窗口内的标题为LINGO Model – LINGO1 的窗口是LINGO 的默认模型窗口,建立的模 型都都要在该窗口内编码实现。下面举两个例子。

2

例1.1 如何在LINGO 中求解如下的线性规划问题:

, 0 2 600 100 350 . .

min 2 3

1 2 1 2 1 1 2 1 2

????????

??????x x x x x x x s t x x

在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600;

保存后然后点击工具条上的按钮即可。

例1.2 使用LINGO 软件计算6 个发点8 个收点的最小费用运输问题。产销单位运价如下表。 单 位销地 运 价 产地

B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8 1 4 3 52

销量 35 37 22 32 41 32 43 38

首先建立相应的数学模型:设ij x 为产地i A 到销地j B 的运量,ij c 为单位运价,i a 为产地i A 的 产量,j b 为销地j B 的销量 数学模型:min

6 8 1 1 ij ij i j

c x

????

???

6 1

, 1,2...8 ij j

i

x b j

??

??????,

8 1

, 1,2...6 ij i

j

x a i

??

??????,0 ij x ??

使用LINGO 软件,编制程序如下: model: !程序开始的标志符 ! 集合的定义部分 1]sets:

2] AA/1..6/: a; 3] BB/1..8/: b;

4] Links(AA,BB): c, x;

3

5]Endsets !数据的定义部分 6] data:

7] a=60 55 51 43 41 52; 8] b=35 37 22 32 41 32 43 38; 9] c=6 2 6 7 4 2 9 5 10] 4 9 5 3 8 5 8 2 11] 5 2 1 9 7 4 3 3 12] 7 6 7 3 9 2 7 1 13] 2 3 9 5 7 2 6 5 14] 5 5 2 2 8 1 4 3; 15] enddata !目标函数;

16] min=@sum(links: c*x); !需求约束; 17] @for(BB(j):

18] @sum(AA(i): x(i,j))=b(j)); !产量约束; 19] @for(AA(i):

20] @sum(BB(j): x(i,j))<=a(i)); end !程序结束的标志符 然后点击工具条上的按钮即可。

上例就是一个典型的LINGO 程序,程序一般以标志符model:开始,以end 结束。标准的LINGO 程序主体一般由四部分组成:(1)集合块,如例中的第1-5 行。(2)数据快,如例中的第6-15 行。(3)目标函数,如例中的第16 行。(4)约束条件,如例中的第17-20 行。这四个部分之间

并没有严格的顺序之分,调整它们之间的次序,并不影响程序的运行,但为了修改程序的方便, 还是建议采用这种顺序编写程序。下面的学习,我们就对每一个组成部分进行简单的介绍。

4

§2 LINGO 中的集

2.1 集的简介

集是LINGO 建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个 单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大 的模型(如例1.2 中程序的17-20 行)。

集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或 雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值 可以预先给定,也可以是未知的,有待于LINGO 求解。但是在使用之前,必须先定义它。 LINGO 有两种类型的集:原始集(primitive set)和派生集(derived set)。

一个原始集是由一些最基本的对象组成的,可以称之为简单集合。如A ??{1,2,3}就定义 了一个集合A.

一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的 集,由已知集合派生得到的。如A ??{1,2,3},B ??{a,b,c},C ??{(1,a),(2,b),(2,c),(3,c)},A,B就是 原始集,而C 就是由A,B 派生得到的。 2.2 模型的集部分

集部分是LINGO 模型的一个可选部分(如在例1.1 的程序中就无此部分)。在LINGO 模 型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets” 结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可 以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。 2.2.1 定义原始集

为了定义一个原始集,必须详细声明:

[1]集的名字 [2]集的成员(可选)[3]集成员的属性(可选) 定义一个原始集,用下面的语法:

setname[/member_list/][:attribute_list];

注意:用“[]”表示该部分内容可选。下同,不再赘述。

Setname 是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标 准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉

伯数字(0,1,?,9)组成的总长度不超过32 个字符的字符串,且不区分大小写。

注意:该命名规则同样适用于集成员名和属性名等的命名。

Member_list 是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和 隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。 ①当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开, 允许混合使用。

例2.1 可以定义一个名为students 的原始集,它具有成员John、Jill、Rose 和Mike, 每个成员具有属性有sex 和age:

sets:

students/John Jill, Rose Mike/: sex, age;

endsets

②当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:

setname/member1..memberN/[: attribute_list]; 这里的member1 是集的第一个成员名,memberN 是集的最末一个成员名。LINGO 将自动产生 中间的所有成员名。LINGO 也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。

联系合同范文客服:xxxxx#qq.com(#替换为@)