我们遇到的许多优化问题都可以归结为规划问题,如线性规划、非线性规划、二次规划、整数规划、动态规划等,当遇到变量比较多或者约束条件表达式比较复杂的情况时,想用手工计划来求解这类问题几乎是不可能的,编程计算虽然可行,但是工作量大,程序长而繁琐,容易出错,还要花费大量的时间和精力,可行的办法是用现成的软件来求解,LINGO是专门用来求解各种规划问题的软件包,是求解线性和非线性优化问题的简易工具,是求解优化模型的最佳选择。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 一、LINGO快速入门 1.1 LINGO简介
当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:
外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。
通常,一个优化模型由以下三部分组成:
(1) 目标函数:一般表示成求某个数学表达式的最大或最小值; (2) 决策变量:目标函数值取决于哪些变量;
(3) 约束条件:对变量附加一些条件限制(通常用等式或不等式表示);
页 第1
例1.1 如何在LINGO中求解如下的LP(线性规划)问题:
mins.t.x1?x2?350x1?1002x1?x2?6002x1?3x2
x1,x2?0
在模型窗口中输入如下代码: min=2*x1+3*x2;!目标函数; x1+x2>=350; x1>=100; 2*x1+x2<=600; X1>=0; X2>=0;
然后点击工具条上的按钮 (Lingo/solve)即可。
如果模型有语法错误,则弹出“Lingo error message”(错误信息)的窗口,指出在哪一行,有怎样的错误,每种错误都有一个编号,具体含义参考附件。
如果语法通过,LINGO用内部所带的求解程序求出模型的解,然后弹出一个标题为“Lingo solver status”(求解状态)的窗口,其内容为变量个数,约束条件个数,优化状态,非零变量个数,耗费内存,所花时间等信息,点击close关闭窗口,则屏幕显示“solution report”(解的报告)的信息窗口,显示优化计算的步数,优化后的目标函数值,列出各变量得计算结果。 1.2 Lingo模型的组成
LINGO建模语言引入了集合的概念,为建立大规模数学规划模型提供了方便,用LINGO语言编写程序来表达一个实际化问题,称为LINGO模型,模型的基本组成:
1)集合定义部分; 2)数据初始化(数据段) 3)目标函数和约束条件
下面以一个运输规划模型来说明LINGO模型的基本组成:
例1.2 某公司有6个货仓,库存货物总数分别为:60,55,51,43,41,52,现有8个客户
页 第2
各要一批货,数量分别为 35,37,22,32,41,32,43,38,各货仓到8个客户处的单位货物运输价见表。试确定各货仓到各客户处货物调运数量,使总的运输费最小。
销地 产地 W1 W2 W3 W4 W5 W6
解:引入决策变量xij,代表从第i个货仓到第j个客户的货物运量,用符号cij表示从第i个货仓到第j个客户的单位货物运价, ai表示第i个货仓的最大供货量,dj表示第j个客户的订货量。
目标函数是总运输费最少;
约束条件有三条:1、各货仓运出的货物总量不超过其库存数;2、各客户收到的货物总量等于其订单数量;3、决策变量xIJ非负。
则,本问题的数学模型为; Min z=?i?16V1 V22 V3 6 4 5 7 2 5 2 9 2 6 3 5 6 5 1 7 9 2 V4 7 3 9 3 5 2 V5 4 8 7 9 7 8 V6 2 5 4 2 2 1 V7 V88 5 8 3 7 6 4 9 2 3 1 5 3 ?CijXij
j?18s.t:
?Xij<=ai ,i=1,2,?,6
j?168?Xij=d
j?1j
,j=1,2,?,8
Xij>=0, i=1,2,?,8 1) 集合定义部分 SETS:
WH/W1..W6/:AI;!仓库集合;
页 第3
VD/V1..V8/:DJ;!客户集合;
LINKS(WH,VD):C,X;!表示运输关系(路线)的集合;
ENDSETS
2)数据部分(数据段) DATA:
AI=60,55,51,43,41,52; DJ=35,37,22,32,41,32,43,38; C =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
3)目标函数和约束条件
MIN=@SUM(LINKS(I,J):C(I,J)*X(I,J)); !目标函数; @FOR(WH(I):@SUM(VD(J):X(I,J))<=AI(I)); !约束条件;
@FOR(VD(J):@SUM(WH(I):X(I,J))=DJ(J)); !约束条件;
4)完整的模型
综上所述,本问题完整的LINGO模型为: MODEL: SETS:
WH/W1..W6/:AI; VD/V1..V8/:DJ; LINKS(WH,VD):C,X; ENDSETS DATA:
AI=60,55,51,43,41,52; DJ=35,37,22,32,41,32,43,38;
页 第4
C =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
MIN=@SUM(LINKS(I,J):C(I,J)*X(I,J)); @FOR(WH(I):@SUM(VD(J):X(I,J))<=AI(I)); @FOR(VD(J):@SUM(WH(I):X(I,J))=DJ(J)); END
然后点击工具条上的按钮 即可。
3、Lingo的语法规定:
1)求目标函数的最大值或最小值用MAX=?或MIN=?来表示; 2)每个语句必须与“;”结束,每行可以有多个语句,语句可以跨行;
3)变量名称必须与字母开头,由字母,数字和下划线组成,长度不超过32个字符,不区分大小写;
4)可以给语句加上标号,例如[OBJ] MAX=2*X1+3*X2; 5) 以“!”开头,以“;”结束的语句是注释语句;
6)如果对变量的取值范围没有做特殊说明,则默认所有决策变量都是非负;
7)LINGO模型以“MODEL:”开头,以“END”结束,对于比较简单的模型,这两个语句可以省略; 二、 LINGO中的集
对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。
现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集
集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个
页 第5