320 likes | 494 Views
10 LINDO软件应用. 教学目的与要求. 本章主要介绍运筹学的常用软件之一 —— LINDO 软件的基本操作方法和执行结果的解读。通过大量的图示,使学生由浅入深地掌握 LINDO 在解线性规划问题时如何将数学表达式转换为计算机表达式;同时,使学生掌握在得出结论报告后能够正确地解读并得到自己所需要的信息。由于本章主要的学习内容是软件的使用,所以在教学过程中应使用多媒体方式来组织教学过程,以使学生能够清晰地感受软件的整个操作过程。.
E N D
10LINDO软件应用 教学目的与要求 本章主要介绍运筹学的常用软件之一——LINDO软件的基本操作方法和执行结果的解读。通过大量的图示,使学生由浅入深地掌握LINDO在解线性规划问题时如何将数学表达式转换为计算机表达式;同时,使学生掌握在得出结论报告后能够正确地解读并得到自己所需要的信息。由于本章主要的学习内容是软件的使用,所以在教学过程中应使用多媒体方式来组织教学过程,以使学生能够清晰地感受软件的整个操作过程。 运筹学解决问题的方式可以分为两个步骤:一是建模,二是求解。如果数学模型中的决策变量和约束条件不多,手工计算可以得出结果,但却非常单调、琐碎、易错。在生产和管理实际以及科学研究中提出的大量的运筹学问题,其决策变量和主约束条件可以多到十几个、几十个、几百个,这些问题就不是人力所及,只能借助计算机进行求解。 从目前来看,解决运筹学问题的专用软件有不少,比如ORS、MATLAB、WinQSB等,以及现在应用较为普遍的LINDO和LINGO。这些软件的使用大大提高了运筹问题的求解效率。因此,学生应该在学懂运筹学基本知识的基础上尽量、尽心使用软件来帮助求解各种问题。 下面我们对LINDO软件作一个一般性的应用介绍。更深的复杂应用请参阅LINDO的专业书籍。
10LINDO软件应用 10.1 LINDO简介 10.2 整数规划问题的LINDO求解说明
10.1 LINDO简介 10.1.1 初识LINDO LINDO是一种专门用于求解数学规划问题的软件。由Linus Schrage于1986年开发,LINDO是Linear INteractive Discrete Optimizer字母的缩写形式,由于LINDO程序执行速度很快,易于方便地输入、求解和分析优化问题,LINDO在教学、科研和工业界得到广泛应用。LINDO 主要用于解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于一些非线性和线性方程组的求解以及代数方程求根等。LINDO 中包含了一种建模语言和许多常用的数学函数(包括大量概论函数),可供使用者建立规划问题时调用。 一般用LINDO解决线性规划(LP—Linear Programming)、整数规划(IP—Integer Programming)问题。其中LINDO 6.1 学生版可求解多达300个变量和150个约束的规划问题。其正式版(标准版)可求解的变量和约束在104数量级以上。 LINGO 则用于求解非线性规划(NLP—NONLINEAR PROGRAMMING)和二次规划(QP —QUARATIC PROGRAMING),其中LINGO 6.0 学生版可求解最多达300个变量和150个约束的规则问题,其标准版的求解能力亦有104数量级以上。虽然LINDO和LINGO 不能直接求解目标规划问题,但用序贯式算法可分解成一个个LINDO 和LINGO 能解决的规划问题。最新的LINGO版本是LINGO 11.0。 下面我们将用一个简单的例子来说明LINDO的输入方式及界面形式。当打开LINDO程序时,界面显示如图10.1所示。
图10.1 LINDO初始界面 图10.1中标为“LINDO”的窗口为LINDO的主框架窗口。以后运行的所有其他子窗口都将被包含在这个窗口之中。同时它还包含着LINDO的命令菜单和命令条。中间标有“<untitled>”的子窗口是一个新的空白模型输入窗口。所有规划模型的数据及表达式的输入均在此窗口中完成。 LINDO模型的输入由三个部分组成:目标、变量和约束条件。 目标有两种表述方式:MAX和MIN,分别代表最大值和最小值,在LINDO的输入窗口中第一个字符必须是MAX和MIN。 跟在MAX和MIN之后的表达式我们称之为“目标公式”,如下所示: MAX 10X+15Y 上式中X和Y代表变量,也就是我们的求解对象。任何一个规划模型都有约束条件的限制,在LINDO中约束条件需要“SUBJECT TO”或仅仅是“ST”这两个表达式的引
导。如在此例中约束条件可在新的一行中输入如下: SUBJECT TO X<10 Y<12 X+2Y<16 在条件限制表达式的输入中,需要注意的是“<”或“>”等同于“<=”或“>=”,如“X<10”可输入为“X<=10”。 条件限制表达式输入完毕后,最后一行要输入“END”作为模型输入的结束。本例的输入界面如图10.2所示。 解这个线性规划问题,按下“Solve”菜单的“Solve”命令,或按下工具栏中的Solve键()。LINDO将开始编译这个模型,这意味着LINDO要判断输入的模型是否有数学意义或语法错误。如果编译不能通过,你将会得到下面的错误信息窗口,如图10.3所示。 如果编译通过,LINDO将真正开始解这个线性规划问题,最先出现这个状态窗口如图10.4所示。 状态窗口各个域和控制的说明如下: 域/控制 说明 Status 给出当前结果的状态,可能的值包括:Optimal(最优解)、 Feasible(可行解)、Infeasible(不可行解)、Unbounded (无界解) Iterations 求解过程中迭代的次数 Infeasibility 引起解不可行的约束条件的个数
Objective 当前目标表达式的值 BestIP 整数规划的最佳值,仅与整数规划问题有关 IP Bound 整数规划问题的理论边界 Branches 整数规划中整数变量的分支数 Elapsed Time 解决问题的时间 Update Interval 状态窗口更新的频率(以秒计),你可以在此设置任何 非 负值,设为0将加快求解的时间 Interrupt Solver 按下此键将中断求解过程,并返回当前的最佳值 Close 关闭状态窗口 接下来,LINDO将给出报告窗口,但在此前,LINDO将询问是否进行敏感性分析。窗口如图10.5所示。 图10.5 敏感性分析的询问窗口
如果按下“否”并关闭状态窗口,报告窗口将出现,报告窗口呈现的是解决此问题的结论性信息。解读此信息将得到解决此问题的整体方案。此例中的报告窗口如图10.6所示。如果按下“否”并关闭状态窗口,报告窗口将出现,报告窗口呈现的是解决此问题的结论性信息。解读此信息将得到解决此问题的整体方案。此例中的报告窗口如图10.6所示。 图10.6 报告窗口 以上是求解线性规划问题时主要步骤及操作窗口的介绍,报告窗口中主要结论的解读及应用将在后续章节中介绍。
10.1.2 LINDO句法 在对LINDO有一个初步的认识之后,下面我们就LINDO模型的表达式句法作一个较为详细的介绍。 在LINDO中,目标公式总是出现在模型输入的开始阶段,并且首字符必须是MAX (最大值)或MIN(最小值)。目标公式的结束及约束条件的开始要以以下字符为准: SUBJECT TO SUCH THAT S.T. ST 约束条件的结束以“END”字符为准。 LINDO的变量名长度不能超过8个字符。变量名必须要以字母字符(A~Z)为开始,其他字符不能包含!、)、+、-、=、<、>。如以下变量名是有效的: XYZ MY_VAR A12 SHIP.LA 而以下这些变量名是无效的: THISONESTOOLONGA HYPHEN1 INFRONT 以上无效的变量名中第一个变量名长度超过了八个字符,第二个使用了无效的连字符(-),第三个不是以字符开头。 作为可选项,你可以为约束条件起名,约束名可以使许多LINDO模型的输出报告非常易于被中断。约束名的起名规则必须遵循变量名的起名约定。约束名必须置于约束表达式的开头,并且要以右括号“)”作为分隔,在右括号之后你可以输入约束表达式。
如下例中约束表达式X<10的约束名是XBOUND。 XBOUND) X<10 LINDO中只有五个操作符,分别是加(+)、减(-)、大于(>)、小于(<)和等于(=)。当你输入“<”或“>”时,LINDO将解释为“<=”或“>=”。当然,如果你愿意,你也可以直接输入“<=”或“>=”。 LINDO模型中不接受括号运算符,如以下约束条件的输入是不被认可的: 10(X+Y)<135 LINDO模型的运算顺序是从左到右。 注释可以出现在LINDO模型的任何部分中,注释必须以感叹号“!”为引导,跟在感叹后的任何表达式都将被认为是注释。比如上一节中的例题可写为如图10.7窗口所示。 图10.7 有注释的输入窗口
LINDO模型表达式的注释可以被保存在LTX文件中,因为LTX文件本来就是文本格式。当你把输入文件保存为压缩文件LPK格式和MPS格式时,注释行及其他特殊格式将被删除。 约束和目标公式可以被分割为多行,或者被合并为一行。除了变量、变量系数和约定字符外,你可以在任何地点分割表达式。如以下输入是合法的。 MAX 10 X+15Y SUBJECT TO X <10 Y<12 X+2 Y<16 END LINDO对大小写字母不敏感,所有输入都将被LINDO转换为大写字母。 在LINDO模型中,仅有常数可以被放置在约束表达式的右边,如X>Y将被LINDO拒绝,X-Y>0是合法的。同样,仅有变量可以被放置在约束表达式的左边,如3X+4Y-10=0将被LINDO拒绝,而3X+4Y=10是可接受的。
10.1.3 一个简单的线性规划求解过程 现在我们可以通过一个简单的LP问题的求解过程来解读LINDO的报告窗口所显示出来的各种信息。设有如下的LP数学模型需要求解: Max Z=2x1+5x2 由于LINDO中已假设所有的变量都是非负的,所以非负约束不必再输入。在LINDO中输入此模型,可显示如图10.8所示窗口。 执行以上输入,并确认进行灵敏度分析,可得到报告窗口如图10.9所示。
图10.8 本例的输入窗口 图10.9 本例的报告窗口 此报告窗口可分为两部分,“RANGES IN WHICH THE BASIS IS UNCHANGED:”上面为求解报告,下面为灵敏度分析报告。 在求解报告中,“LP OPTIMUM FOUND AT STEP 2”表示单纯形法在两次迭代后得到的最优解。“OBJECTIVE FUNCTION VALUE 1)19.00000”表示最优目标值为19.00000。“VALUE”给出最优解中各变量(VARIABLE)的值:x1=2.00000,x2=3.00000。“REDUCED COST”给出最优单纯形表中第0行中变量的系数(MAX型
问题)。其中基变量的REDUCED COST值应为0,对于非基变量,相应的 REDUCED COST的值表示当该非基变量增加一个单位时(其他非基变量保持不变)目标函数减少的量。本例中此值均为0。 “SLACK OR SURPLUS”给出松弛变量的值:第2、3、4行松弛变量分别为2.00000、0.00000、0.00000。 “DUAL PRICES”给出最优单纯形表中第0行松弛变量的系数(MAX型问题),即对偶价格值,表示当对应约束有微小变动时,目标函数的变化率,如果某一约束有一个对偶价格X,表示对应约束中不等式右端项若增加1个单位,目标函数将增加X个单位。本例中第2、3、4行对偶价格分别为0.00000、1.00000、2.00000。如第4行X1+2X2<8改变为X1+2X2<9时,目标函数值为19+2=21。 “NO.ITERATIONS=2”表示用单纯形法进行了两次迭代(旋转)。 若要作灵敏度分析,可以在一开始系统询问“DO RANGE(SENSITIVITY)ANALYSIS?”回答“是”,或单击“Reports”菜单的“Range”项。所谓灵敏度分析,就是当目标函数的系数和约束右端项在什么范围变化(此时假定其他系数保持不变)时,最优基保持不变。报告中的“INFINITY”表示正无穷。本例中灵敏度分析表为:
RANGES IN WHICH THE BASIS IS UNCHANGED: OBJ COEFFICIENT RANGES UARIABLE CURRENT ALLOWABLE ALLOWABLE COEF INCREASE DECREASE x1 2.000000 0.500000 2.000000 x2 5.000000 INFINITY 1.000000 RIGHTHAND SIDE RANGES ROW CURRENT ALLOWABLE ALLOWABLE RHS NCREASE DECREASE 2 4.000000 INTINITY 2.000000 3 3.000000 1.000000 1.000000 4 8.000000 2.000000 2.000000 目标函数中变量X1的系数为2,当它在[2-2,2+0.5]=[0,2.5]范围变化时,最优基保持不变。 第一个约束中右端项为4,当它在[4-2,4+∞]=[2,∞)范围变化时,最优基保持不变。 如果要显示单纯形表,则单击主菜单“Reports”下拉菜单中的“Tableau”选项。如图10.10所示。
图10.10 Reports下拉菜单 本例的单纯形表显示为: THE TABLEAU ROW(BASIS) X1 X2 SLK 2 SLK 3 SLK 4 1 ART 0.000 0.000 0.000 1.000 2.000 19.000 2 SLK 20.000 0.000 1.000 2.000 -1.000 2.000 3 x2 0.000 1.000 0.000 1.000 0.000 3.000 4 x1 1.000 0.000 0.000 -2.000 1.000 2.000
在上表中,基向量为BASIS={SLK2,X2,X1},SLK2为第2行松弛变量,ART是人工变量(ARTIFICIAL VARIABLE)。
10.1.4 对LINDO的进一步认识 本小节我们将通过一个具有典型意义的实例来对LINDO作进一步的认识,通过对结论窗口信息的深入解读,我们可以知道,LINDO不仅可以给出最优的数据,而且可以解决有关线性规划的其他方面的问题。 【例10.1】一奶制品加工厂用牛奶生产A1、A2两种奶制品,1桶牛奶可以在甲车间用12小时加工成3 kg A1,或者在乙车间用8小时加工成4 kg A2。根据市场需求,生产的A1、A2全部能售出,且每kg A1获利24元,每kg A2获利16元。现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间480小时,并且甲车间每天至多能加工100 kg A1,乙车间的加工能力没有限制。试为该厂制订一个生产计划,使每天获利最大,并进一步讨论以下三个附加问题: (1)若用35元可以买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶? (2)若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元? (3)由于市场需求变化,每千克A1的获利增加到30元,是否应改变生产计划? 设生产A1共X1kg,生产A2共X2kg,则可在LINDO的输入窗口输入如下模型: max 72x1+64x2 st x1+x2<50 12x1+8x2<480 3x1<100 End
求解这个模型并作灵敏性分析,结果如下: LP OPTIMUM FOUND AT STEP1 OBJECTIVE FUNCTION VALUE 1)3360.000 VARIABLE VALUE REDUCED COST X1 20.000000 0.000000 X2 30.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 48.000000 3) 0.000000 2.000000 4) 40.000000 0.000000 NO. ITERATIONS= 1 RANGES IN WHICH THE BASIS IS UNCHANGED: OBJ COEFFICIENT RANGES VARIABLE CURRENT ALLOWABLE ALLOWABLE COEF INCREASE DECREASE X1 72.000000 24.000000 8.000000 X2 64.000000 8.000000 16.000000
RIGHTHAND SIDE RANGES ROW CURRENT ALLOWABLE ALLOWABLE RHS INCREASE DECREASE 2 50.000000 10.000000 6.666667 3 480.000000 53.3333328 0.000000 4 100.000000 INFINITY 40.000000 结果告诉我们:这个线性规划的最优解为x1=20,x2=30,最优值为z=3360,即用20桶牛奶生产A1, 30桶牛奶生产A2,可获最大利润3360元。输出中除了告诉我们问题的最优解和最优值以外,还有许多对分析结果有用的信息,下面结合题目中提出的三个附加问题给予说明。 三个约束条件的右端不妨看做三种“资源”:原料、劳动时间、车间甲的加工能力。输出中Slack or Surplus给出这三种资源在最优解下是否有剩余:原料、劳动时间的剩余均为零,车间甲尚余40(千克)加工能力。 目标函数可以看做“效益”,成为紧约束的“资源”一旦增加,“效益”必然跟着增长。输出中DUAL PRICES 给出这3种资源在最优解下“资源”增加1个单位时“效益”的增量:原料增加1个单位(1桶牛奶)时利润增长48(元),劳动时间增加1个单位(1小时)时利润增长2(元),而增加非紧约束车间甲的能力显然不会使利润增长。这里,“效益”的增量可以看做“资源”的潜在价值,经济学上称为影子价格,即1桶牛奶的影子价格为48元,1小时劳动的影子价格为2元,车间甲的影子价格为零。我们可以用直接求解的办法验证上面的结论,即将输入文件中原料约束(第2行)右端的50改为51,看看得到的最优值(利润)是否恰好增长48(元)。用影子价格的概念很容易回答附加问题1:用35元可以买到1桶牛奶,低于1桶牛奶的影子价格48,当然应该作这项投资。回答附加问题2:聘用临时工人以增加劳动时间,付给的工资低于劳动时间的影子价格才可以增加利润,所以工资最多是每小时2元。
目标函数的系数发生变化时(假定约束条件不变),最优解和最优值会改变吗?这个问题不能简单回答。上面的输出给出了最优基不变条件下目标函数系数的允许变化范围:x1的系数为(72-8,72+24)=(64,96);x2的系数为(64-16,64+8)=(48,72)。注意:x1系数的允许范围需要x2系数64不变,反之亦然。由于目标函数的费用系数变化并不影响约束条件,因此此时最优基不变可以保证最优解也不变,但最优值变化。用这个结果很容易回答附加问题3:若每千克A1的获利增加到30元,则x1系数变为30×3=90,在允许范围内,所以不应改变生产计划,但最优值变为90×20+64×30=3720。 下面对“资源”的影子价格作进一步的分析。影子价格的作用(即在最优解下“资源”增加1个单位时“效益”的增量)是有限制的。每增加1桶牛奶利润增长48元(影子价格),但是,上面输出的CURRENT RHS 的ALLOWABLE INCREASE 和 ALLOWABLE DECREASE 给出了影子价格有意义条件下约束右端的限制范围:原料最多增加10(桶牛奶),劳动时间最多增加53(小时)。现在可以回答附加问题1的第2问:虽然应该批准用35元买1桶牛奶的投资,但每天最多购买10桶牛奶。顺便地说,可以用低于每小时2元的工资聘用临时工人以增加劳动时间,但最多增加53.3333小时。 需要注意的是:灵敏性分析给出的只是最优基保持不变的充分条件,而不一定是必要条件。比如对于上面的问题,“原料最多增加10(桶牛奶)”的含义只能是“原料增加10(桶牛奶)”时最优基保持不变,所以影子价格有意义,即利润的增加大于牛奶的投资。反过来,原料增加超过10(桶牛奶),影子价格是否一定没有意义?最优基是否一定改变?一般来说,这是不能从灵敏性分析报告中直接得到的。此时,应该重新用新数据求解规划模型,才能做出判断。所以,从正常理解的角度来看,我们上面回答“原料最多增加10(桶牛奶)”并不是完全科学的。 返回
10.2 整数规划问题的LINDO求解说明 整数规划是数学规划理论中的重要内容之一。LINDO具有01整数规划和整数规划两种模型求解的功能。LINDO可以将模型中的一部分变量定义为01变量、一部分变量定义为整数变量,其余变量仍保留为连续变量。因此,LINDO具有求解01、整数混合规划的功能。在使用LINDO求解整数规划的功能时,除01变量、整数变量的定义命令之外,其他操作如求解、模型编辑等与前一章中所介绍过的内容大致相同。因此,本章把定义01变量和定义整数变量的命令INT、GIN作为主要内容来介绍。 10.2.101规划 【例10.2】有一钢材物流基地,在配送之前先要对钢材进行物流加工,假设有四组工人,要分别指派他们完成四项不同的工作,每个组做各项工作所消耗的时间如表 10.1所示。问应该如何指派,才能使总的工作时间最小?
表10.1 因为每个组只能完成一项工作,所以这是一个01规划问题。设指派工作组i(i=1,2,3,4)完成工作j(j=1,2,3,4)为Xij。则该问题的运筹学模型可表示为: Min: z=15x11+19x21+26x31+19x41+18x12+23x22+17x32+21x42+24x13+22x23+16x33+23x43+24x14+18x24+19x34+17x44 ST: x11+x12+x13+x14=1 x21+x22+x23+x24=1 x31+x32+x33+x34=1
x41+x42+x43+x44=1 x11+x21+x31+x41=1 x12+x22+x32+x42=1 x13+x23+x33+x43=1 x14+x24+x34+x44=1 xij=0或1;i=1,2,3,4;j=1,2,3,4 因为Xij非0即1,则在LINDO中输入是应使用INT语句。本例的输入窗口如图 10.11所示。 图10.11
在INT语句的输入中,哪个变量需要定义为01解,则将那个变量置于INT之后。 当模型中有很多变量需要定义成01变量时,可以有以下命令: INT <n> 其中n表示模型中的01型整数变量数目。使用这命令来定义01变量,可以极大地提高键盘输入效率。对于本例,16个01变量的定义可以如此操作: INT 16 使用该语句时须特别注意变量在目标函数中的排列次序。当目标函数中不是包含有全部变量时,应慎用这一语句。语句中的n,是指目标函数中(或模型中先输入的)前n个变量,不注意这一点,就容易出错。 求解该问题,则本例的报告窗口如图 10.12所示。 由报告窗口可以看出,目标值是70,可以指派甲组去做A工作,丁组做B工作,丙组做C工作,乙组做D工作。
10.2.2 整数规划 【例10.3】某昼夜服务的公交线路每天各时间区段内所需司机和乘务员数如表10.2所示。 表10.2 设司机和乘务人员分别在各时间区段开始上班,并连续工作8小时,问该公交线路至少配备多少名司机和乘务人员?列出这个问题的线性规划模型。 由题意知,“所需人数”是指司机数加乘务人员数之和;另外,司机和乘务人员在各时间区段开始上班之后,要连续工作8小时。即连续上两个班次,因此,在第一个班次上班的人员中,既有从第六个班次之初开始上班的,也有从第一个班次之初开始上班的,其他以此类推。
设从第i(i=1,…,6)个班次之初开始上班的人数为xi,则六个班次上班人数共有x1+x2+x3+x4+x5+x6,目标是使总人数z最少,但同时必须满足在每个班次上班的人数要不小于所需人数,例如,在第一个班次上班的人数至少要有60人,即x6+x1>60,其他以此类推。设从第i(i=1,…,6)个班次之初开始上班的人数为xi,则六个班次上班人数共有x1+x2+x3+x4+x5+x6,目标是使总人数z最少,但同时必须满足在每个班次上班的人数要不小于所需人数,例如,在第一个班次上班的人数至少要有60人,即x6+x1>60,其他以此类推。 综上所述,可建立原问题的线性规划数学模型如下: Min z=x1+x2+x3+x4+x5+x6 St: x6+x1≥60 x1+x2≥70 x2+x3≥60 x3+x4≥50 x4+x5≥20 x5+x6≥30 xi≥0且为整数 因为Xi为整数,则在LINDO中输入是应使用GIN参数。本例的输入窗口如图 10.13所示。 GIN语句与INT语句的用法一样,既可以定义指定变量,也可以集中定义变量的数量。如本例中,6个变量都应是整数,可以用GIN 6来定义。 求解该问题,则本例的报告窗口如图 10.14所示。
图10.14 由报告窗口可以看出,目标值是150,6个班次各安排60、10、50、0、20和10人。 返回