字形式)非常类似,几乎没有什么差别,因此几乎不要专门学习就可以掌握。LINDO软件对模型的输入格式还是有一些特殊规定的。我们下面就简单解释一下使用LINDO软件建立线性规划问题的一些特殊注意事项。
(1) LINDO中变量名由字母和数字组成,但必须以字母开头,且长度不能超过8个字符
(只能是英文字符,不能含有中文字符)。LINDO中不区分大小写字母,包括LINDO中本身的关键字(如MAX,MIN等)也不区分大小写字母。
(2) LINDO中对优化模型的目标和约束用行号进行标识,这些标识会在将来的求解报告
中用到。用户没有指定行号时,系统将自动产生行号,将目标函数所在行作为第一行,从第二行开始为约束条件。我们也可以人为定义行号或行名,行号或行名总是以“,”结束,放在相应的约束之前;行号或行名可以和变量名一样命名,也可以只用数字命名,但长度同样不能超过8个字符。为了方便将来阅读求解结果报告,建议用户总是自觉地对每个约束进行命名。行名中甚至可以含有中文字符,但行名结束标志符号必须是英文字符,否则会出现错误。
(3) 在LINDO模型的任何地方都可以用“TITLE”语句对输入的模型命名,用法是在
TITLE后面写出其名字(最多72个字符,也可以有汉字),在程序中单独占一行。请看下面两个例子:TITLE Example Modle for Chapter 2。TITLE第2章的第一个例子前者将模型命名为“TITLE Example Modle for Chapter 2”,后者将模型命名为“第2章的第一个例子”。实际上这类似于对模型的注释和说明,这是模型命名的第一个作用。对模型命名的另一个目的,是为了方便将来阅读求解结果报告。因为我们有可能同时处理多个模型,很容易混淆模型与求解结果的对应关系。这时如果对不同模型分别进行命名,就可以随时(例如在求解当前模型前)使用菜单命令
“FILE/TITLE”将当前模型的名字显示在求解结果报告窗口中,这样就容易判别每个求解结果与每个模型的对应关系。此外,LINDO模型中以感叹号“!” 开头的是注释行(注释语句或称为说明语句),可以帮助他人或以后自己理解这个模型。实际上,每行中“!”符号后面都是注释或说明。例如:!This is a comment。第1行完全是注释语句;第2行则后半部分为注释语句。可以看出,注释语句中以有汉字,但领头的有感叹号“!”必须是字符,否则会出现错误。再次总结,提醒一下:行号。“TITLE”语句和注释语句,是LINDO中惟一可以使用汉字字符的地方。
(4) LINDO中变量不能出现在一个约束条件的右端(即约束条件的右端只能的常数);
变量与其系数间可以有空格(甚至回车),但不能有任何运算符号(包括乘号“*”等)。
(5) LINDO中不能接受括号“()”和逗号“,”等任何符号(除非在注释的语句中),例
如:400(X1+X2)需写成400X1+400X2;“10,000”需写成“10000”。
(6) LINDO中表达式应当已经经过化简,如不能出现2X1+3X2-4X1而应写成-2X1+3X2
等。
(7) LINDO中已假定所有变量非负。可在模型的“END”语句后面用命令“FREE”(设
定自由变量)取消变量的非负假定。其用法是“FREE”后面跟变量名,例如,在“END”语句后输入下面命令,可将变量X的非负假定取消:FREE X
(8) 可以在模型的“END”语句后面用命令“SUB”(即设置上界(set upper bound)的
英文缩写)设定变量的上界,用命令“SLB”(即设置下界(set lower bound)的英文缩写)设定变量的上下界。其用法是:“UB vnme value”将变量Vname的上限设定为value;“SUB”的用法类似。例如:SUB X1 10 !作用等价于“X1〈=10”SLB X2 20 !作用等价于“X2〉=20”。但用“SUB”和“SLB”表示的上下界约束不计入模型的约束,因此LINDO也不能给出其松紧判断和敏感性分析。
(9) 数值均衡化及其他考虑:如果约束系数矩阵中各非零元的绝对值的数量级差别很大
(相差1000倍以上),则称其数值不均衡的。为了避免数值不均衡引起的计算问题,使用者应尽可能自己对矩阵的行列进行均衡化。此时还有一个原则,即系数中非零元的绝对值不能大于100000或小于0.0001。LINDO不能LP中系数自动进行数值均衡化,但如果LINDO觉得矩阵元素之间很不均衡,将会给出警告。
(10) 简单错误的检查和避免
当我们将一个线性规划问题的数学表达式输入LINDO系统时,有可能会带有某些输入错误。这类错误虽可能只是抄写和输入错误而造成的,但当问题规模较大时,要搜寻它们也是比较困难的。在LINDO中有一些可帮助寻找错误的功能,其中之一就是菜单命令“Report/Picture(Alt+5)”它的功能是可以将目标函数和约束表达式中的非零系数通过列表(或图形)显示出来。例2.2将图2-18中输入,Report/Picture命令,将弹出一个对话框(图2-19);在弹出的对话框中采用默认选项(即不采用下三角矩阵形式,而以图形方式显示),直接按“OK”按钮可得到图2-20的输出。可以从图2-9很直观地的发现,其实错误原因只不过是在图2-18中的输入中,行的表达式中弄混了。在图2-20中,还可以用鼠标控制显示图形的缩放,这对于规模较大的模型是有用的。
下面一个例子,说明三个变量范围限定命令(FREE,SUB,SLB)的作用。
这个模型中变量X没有非负限制,对Y有上限限制,对Z有下限限制。用FREE,SUB,SLB三个命令可以实现这些功能,具体输入如图2-21所示。
求解得到的结果如图2-22所示,即最大值为122,最优解为X=-7,Y=0,Z=39。可以看出Y的上界(20)在最优解中并没有达到,下界(30)也没有达到,因此模型中去掉“sub y 20”“slb z 30”两个语句,得到结果应该是不变的。但由于最优解中X的取值为负值,所以“free x”这个语句确实是不能少的。我们不妨试下,去掉了这个语句后效果会怎样?这时我们会发现模型没有可行解。
(11) 使输出的结果更简洁
对于例2.3,选择菜单命令“Reports/Solution(Alt+0)”(这个命令的功能是把最优解显示出来),这时会弹出一个选择对话框(图2-23),默认的选项是“Nonzreo Only(只显示非零值)”。按下图2-24所示,可以看到这时只显示了2个取非零值的变量X,Z。特别对于大的模型,这样阅读起来非常方便。
(12) 合理设定变量的上下界,尽可能给出变量的初始值
如果在实际问题中知道变量的取值范围,那就是尽量告诉LINDO,不要让软件帮你到大海捞针。例如,如果X的取值范围在实际中是大于30小于50,就不要让软件在这个整数范围内寻求最优解。有时实际问题中还能感觉到最优解大致在哪个解附近,那就可以以初始值的形式告诉LINDO,这对于问题的求解是很有帮助的。毕竟,软件是死的,而人要比计算机聪明的多。
相关推荐: