图3—6所示的LINGO的运行状态窗口也和LINDO的运行状态窗口类似,但包含的内容更多些(注意:可能由于LINDO和LINGO对中文Windows系统的兼容性不太好,所以图3-6中有些显示字符和单词被截掉了).下面我们给出相应的解释.
Variables(变量数量):其中包括变量总数(Total)、非线性变量数(Nonlinear)、整数变量数(Integer).
Constraints(约束数量):包括约束总数(Total)、非线性束个数(Nonlinear). Nonzeros(非零系数数量):包括总数(Total)、非线性项的系数个数(Nonlinear). Generator Memory Used(K)(内存使用量):单位为千字节(K).
Elapsed Runtime(hh:mm:ss)(求解花费的时间):显示格式是“时:分:秒”. 需要注意的是,凡是可以从一个约束直接解出变量取值是,这个变量就不认为是决策变量而是固定变量,不列入统计,中;只含有固定变量的约束也不列入约束统计中(参见1.3节的说明).总的来说,这些统计值的意义比较清楚,图3-6中最下面一行的含义也与LINDO状态窗口类似,我们下面主要详细介绍一下图3-6左边的两个框中内容.左上角是求解器(求解程序)状态框(Solver Status),含义见表3-1;左下角是扩展的求解器(求解程序)状态框(Extended Solver Status),含义见表3-2.
表3-1 LINGO 状态窗口中关于求解器各项的含义 域名 含义 可能的显示 Model Class 当前模型的类型(请 参阅本书 LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP 第1章的介绍) 以I开头表示IP,以PI开头表示PIP) State 当前解的状态 Global Optimum,Local Optimum,Feasible,Infeasible (不可行),Unbounded(无界),Interrupted(中断), Undetermind(未确定) 实数 实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束) 非负整数 Objective 当前解的目标函数值 Infeasibility 当前约束不满足的总数(不是 不满足的约束个数) Iterations 到目前为止的跌代次数 表3—2 LINGO状态窗口中关于扩展的求解器各项的含义 域名 Solver 含义 使用的特殊求解程序 可能的显示 B-and-B(分支定界算法) Global(全局最优求解程序) Multistart(最多个初始点求解的程序) Best Obi 但目前为止找到的可行解的最佳目 实数 标函数值 实数 非负整数 特殊求解程序当前运行步数: 分支数(对B-and-B程序); 子问题数(对Global程序); 初始点数(对Multistart程序) 有效步数 Obj Bound 目标函数值的界 Steps Active 非负整数 备注 在LINGO 9.0以前的版本中(如LINGO 8.0中),一般不能直接用
FileImportLINGOFile(F12)命令可以直接把LINDO的模型文件转化成LINGO模型。
这个菜单命令的意思是“导入LINDO文件”(LINGO 9.0中已无必要,所以已经被取消了),
6
运行后屏幕上会显示一个标准的“打开文件”的对话框,我们在目录下找到exam0201.ltx,选定该文件后,屏幕显示如图3-8.可以看出 ,这个命令在LINGO主窗口中又打开了两个窗口,一个是命令窗口(Command
Window,根据版本不同,这个窗口也可能不显示出来),另一个是名为“exam0201”的模型窗口。还可以看出,当前光标位于命令窗口(从主窗口左上角的显示结果也可以知道当前 的活动窗口是命令窗口),命令窗口显示的正是从exam0201。1tx读出的原始文件;而“exam0201”窗口才是由exam0201。1tx转化而来的等价的LINGO模型,请大家注意,在 第二 章的最后,我们曾经用行命令“SAVE”把同样的LINDO模型以压缩文件格式存入了一个名为exam0201。1pk的模型文件中。但是经过试验,笔者发现LINGO8.0的菜单命令File/Import LINDOFile/saveF(12)不能把exam0201.1pk正确地转化成LINGO模型。即使对于在LINDO中去用菜单命令“File/save‘保存下来的模型,笔者也多次发现有时不能正确地转化(转化时出现严重错误)。因此,本人的经验是:为了保证将来能将LINDO模型移植到LINGO中去,在LINDO模型输入时尽量采用“规范化”的格式并以文本文件保存(例如,说明语句最好单独占据一行;行名(目标和约束的名字)不要以数字开头;尽量避免少出现汉字和非标准的英文符;二次规划(QP)模型不能被正确转化;等等),当然,由于现在的LINGO9.0版本能直接接受LINDO格式的输入,所以不需要进行格式转化,这个问题也就不存在了。
图3-8 从LINDO模型转化成的LINGO模型(LINGO8.0下)
实际上,在LINGO9.0中,一样可以把LINDO格式的文件转化成LINGO格式的文件显示出来。例如,对图3-5的模型,运行“LINGO/Generate/DisplayModelModel(Ctrl+G)”命令,就会显示图3-6的LINGO状态窗口和一个如图3-9的报告窗口。图3-9中报告显示的正是标准格式的LINGO模型,与图3-8中的模型类似,但增加了以“MODEL:”开头,“ END”结束的语句,不过删去了注释语句,增加了目标行的行号。
比较图3-8,图3-9和图3-5可以发现,从LINDO模型到LINGO模型的实质性转化
7
图3-9 与世隔绝LINDO模型等价的LINGO模型(LINGO9.0下)
工作主要在于以下几个方面(这也是LINGO模型的最基本特征):
(1) 将目标函数的表示方式从“MAX”变成了“MAX=”; (2) “ST”(subject to)在LINGO模型中不再需要,所以删除了; (3) 在每个系数与变量之间增加了运算符“*”(即乘号不能省略); (4) 每行(目标、约束和说明语句)后面均增加了一个分号“;‘;
(5) 约束的名字被放到了一对方括号“[ ]”中,而不是放在右半括号“)“之前; (6) LINGO中模型以“MODEL:”开始,以“END”结束。对简单的模型,这两个
语句也可以省略。
3. 1. 3 编写一个简单的LINGO程序
如果直接在LINGO模型窗口中输入程序,应该如何做呢? 下面通过一个例子说明。
例3. 2 我们现在直接用LINGO来解1. 2 .3 节和 2.. 4节的二次规划问题:
max 98x11+277x2- x1-0.3x1x2-0.2x2
s. t x1+x2
x1〈 =2*x2,
x1,x2 〉=0为整数。
该模型输入模型窗口LINGO1后的形式见图3-10。对照2. 4节,我们可以看出用LINGOQP比用LINDO解要容易输入模型。请注意以下几点:
22解
图3-10
. 我们故意把目标函数没有放在程序的最前面,是为了表明LINGO中的语句的顺序是
不重要的,因为LINGO总是根据“MIN=”语句寻找目标函数,而其他语句都是约束条件(注释语句和TITLE语句出外),所以语句的顺序不重要。
. 原来LINDO模型中“END”语句后面的限定变量取整数值的语句“GIN X1”和“GIN
X2”,这里变成了“@GIN(x1)”和“@GIN(X2)”;但是,在LIDO下也可以写成“GIN2”,这里却不可写成“@GIN(2)”,否则LINDO将把这个模型看成没有整数变量。
8
。在LINGO中,以“@”开头的都是函数调用,其中整型变量函数(@BIN 、@GIN)和上下界限定函数(@FREE 、@SUB 、@SLB)与LINDO中的命令非常类似。只是LINGO中函数一律需要以”@”开头;而且0-1变量函数不是与LINDO中的INT命令对应的@INT函数(LINGO中没有@INT函数),而是改成了@BIN函数。我们将在后面(3. 4节)详细介绍LINGO中能够使用的所有函数。
现在运行菜单命令“LINGO/Sove”,则可以得到图3-11所示得解答报告,最友整数解x=(35,65),最大利润=11077.5。结果中最优整数解与2. 4节相同,但最优值略有不同,估计是计算机误差引起的。你还可以选择运行菜单命令“WINDOW/Status Window”看到图3-12所示的状态窗口(这时我们已经把该规划模型保存到了文件IQP0302.lg4中,所以这个 名字现在也出现在了状态窗口中),从中可以看到目前为止找到的最佳目标值“Best Obj”与问题的上界“Obj BounD”已经是一样的。实际上,如果采用全局最优求解程序(我们将在后面介绍“LINGO/Options”菜单命令时介绍如何激活全局最优求解程序),可以验证它就是全局最优解。此外,LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此只告诉我们找到的是局部最优解(为什么LINGO不将它作为PIQP(纯整数二次规划)来求解?本人也不清楚)。
图3-11
在本节的最后,我们对LINGO的基本用法指出几点注意事项: (1) 和LINGO一样,LINGO中不区分大小写字母;但LINGO中的变量和行名
可以超过8个字符,只是不能超过32个字符,且仍然必须以字母开头
9
图 3 - 12
(2) 与LINDO相同,用LINGO解优化模型时已假定所有变量非负(除非用限定
变量取值范围的函数@free或@sub或@s1b另行说明)。
(3) 与LINDO不同,变量可以放在约束条件的右端(同时数字也可放在约束条
件的作端)。但为了提高LINGO求接时的效率,应尽可能采用线性表达式定义目标和约束(如果可能的话)。
(4) LINGO模型是由一系列语句组成LINGO模型的基本单位。每个语句都是以
分号“;”结尾的,编写程序时应注意保持模型的可读性,例如:虽然LINGO 允许每行写多个语句,但最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感。
(5) 与LINDO相同,LINGO中以感叹号“!”开始的是说明语句(说明语句也
需要以分号“;”结束)。
3.2 在LINGO中使用集合
3. 2. 1 集合的基本语法和LINGO模型的基本要素
我们前面说过,LINGO同时也是优化问题的一种建摸语言,有了它,使用者可以只用输入一行文字就可以建立起含有大规模变量的目标函数和成千上万条件约束。掌握这种最优化模型语言是非常重要的,与LINGO相比,这可使输入较大规模问题的过程得到简化。
理解LINGO建模语言最重要的是理解集合(set)及其属性(attribute)的概念。什么是集合呢?我们通过下面的一个简单例子开始来进行介绍。
例3.3 SAILCO公司需要决定下四个季度的帆船生产量.下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足.每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元.如果加班生产,每条船的生产费用为450美元,每个季度末,每条船的库存费用为20美元.假定生产提前期为0.初始库存为10条船.如何安排生产可使总费用最小?
10