1. 新建(New)
从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。在这个新的“Model”窗口中能够输入所要求解的模型。
2. 打开(Open)
从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。这个文件可能是一个Model文件。
3. 保存(Save)
从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。
4. 另存为...(Save As...) 从文件菜单中选用“另存为...”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为...”对话框中输入的文件名。利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。
5. 关闭(Close)
在文件菜单中选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。如果这个窗口是新建窗口或已经改变了当前文件的内容,LINGO系统将会提示是否想要保存改变后的内容。
6. 打印(Print) 在文件菜单中选用“打印” (Print)命令、单击“打印”按钮或直接按F7键可以将当前活动窗口中的内容发送到打印机。
7. 打印设置(Print Setup...) 在文件菜单中选用“打印设置...”命令或直接按F8键可以将文件输出到指定的打印机。
8. 打印预览(Print Preview) 在文件菜单中选用“打印预览...”命令或直接按Shift+F8键可以进行打印预览。
9. 输出到日志文件(Log Output...) 从文件菜单中选用“Log Output...”命令或按F9键打开一个对话框,用于生成一个日志文件,它存储接下来在“命令窗口”中输入的所有命令。
10.提交LINGO命令脚本文件(Take Commands...) 从文件菜单中选用“Take Commands...”命令或直接按F11键就可以将LINGO命令脚本(command script)文件提交给系统进程来运行。
11.引入LINGO文件(Import Lingo File...) 从文件菜单中选用“Import Lingo File...”命令或直接按F12键可以打开一个LINGO格式模型的文件,然后LINGO系统会尽可能把模型转化为LINGO语法允许的程序。
12.退出(Exit)
从文件菜单中选用“Exit”命令或直接按F10键可以退出LINGO系统。 5.2 编辑菜单(Edit Menu) 1. 恢复(Undo)
从编辑菜单中选用“恢复”(Undo)命令或按Ctrl+Z组合键,将撤销上次操作、恢复至其前的状态。
2. 剪切(Cut)
从编辑菜单中选用“剪切”(Cut)命令或按Ctrl+X组合键可以将当前选中的内容剪切至剪贴板中。
3. 复制(Copy)
从编辑菜单中选用“复制”(Copy)命令、单击“复制”按钮或按Ctrl+C组合键可以将当前选中的内容复制到剪贴板中。
4. 粘贴(Paste)
页 第21
从编辑菜单中选用“粘贴”(Paste)命令、单击“粘贴”按钮或按Ctrl+V组合键可以将粘贴板中的当前内容复制到当前插入点的位置。
5. 粘贴特定..(Paste Special。。)
与上面的命令不同,它可以用于剪贴板中的内容不是文本的情形。 6. 全选(Select All) 从编辑菜单中选用“Select All”命令或按Ctrl+A组合键可选定当前窗口中的所有内容。
7. 匹配小括号(Match Parenthesis)
从编辑菜单中选用“Match Parenthesis”命令、单击“Match Parenthesis”按钮或按Ctrl+P组合键可以为当前选中的开括号查找匹配的闭括号。
8. 粘贴函数(Paste Function) 从编辑菜单中选用“Paste Function”命令可以将LINGO的内部函数粘贴到当前插入点。 5.3 LINGO菜单
1. 求解模型(Slove)
从LINGO菜单中选用“求解”命令、单击“Slove”按钮或按Ctrl+S组合键可以将当前模型送入内存求解。
2. 求解结果...(Solution...) 从LINGO菜单中选用“Solution...”命令、单击“Solution...”按钮或直接按Ctrl+O组合键可以打开求解结果的对话框。这里可以指定查看当前内存中求解结果的那些内容。
3. 查看...(Look...) 从LINGO菜单中选用“Look...”命令或直接按Ctrl+L组合键可以查看全部的或选中的模型文本内容。
4. 灵敏性分析(Range,Ctrl+R)
用该命令产生当前模型的灵敏性分析报告:研究当目标函数的费用系数和约束右端项在什么范围(此时假定其它系数不变)时,最优基保持不变。灵敏性分析是在求解模型时作出的,因此在求解模型时灵敏性分析是激活状态,但是默认是不激活的。为了激活灵敏性分析,运行LINGO|Options?,选择General Solver Tab, 在Dual Computations列表框中,选择Prices and Ranges选项。灵敏性分析耗费相当多的求解时间,因此当速度很关键时,就没有必要激活它。
下面我们看一个简单的具体例子。
例5.1某家具公司制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示: 木料 漆工 木工 每个书桌 每个餐桌 每个椅子 现有资源总数 8单位 4单位 2单位 6单位 2单位 1单位 1.5单位 48单位 20单位 8单位 1.5单位 0.5单位 30单位 20单位 成品单价 60单位 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大? 用DESKS、TABLES和CHAIRS分别表示三种产品的生产量,建立LP模型。 max=60*desks+30*tables+20*chairs; 8*desks+6*tables+chairs<=48;
4*desks+2*tables+1.5*chairs<=20; 2*desks+1.5*tables+.5*chairs<=8; tables<=5;
求解这个模型,并激活灵敏性分析。这时,查看报告窗口(Reports Window),可以看到如下结果。
页 第22
Global optimal solution found at iteration: 3 Objective value: 280.0000
Variable Value Reduced Cost DESKS 2.000000 0.000000 TABLES 0.000000 5.000000 CHAIRS 8.000000 0.000000 Row Slack or Surplus Dual Price 1 280.0000 1.000000 2 24.00000 0.000000 3 0.000000 10.00000 4 0.000000 10.00000 5 5.000000 0.000000
“Global optimal solution found at iteration: 3”表示3次迭代后得到全局最优解。 “Objective value:280.0000”表示最优目标值为280。 “Value”给出最优解中各变量的值:造2个书桌(desks), 0个餐桌(tables), 8个椅子(chairs)。所以desks、chairs是基变量(非0),tables是非基变量(0)。 “Slack or Surplus”给出松驰变量的值:
第1行松驰变量 =280(模型第一行表示目标函数,所以第二行对应第一个约束) 第2行松驰变量 =24 第3行松驰变量 =0 第4行松驰变量 =0 第5行松驰变量 =5
“Reduced Cost”列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时, 目标函数的变化率。其中基变量的reduced cost值应为0, 对于非基变量 Xj, 相应的 reduced cost值表示当某个变量Xj 增加一个单位时目标函数减少的量( max型问题)。本例中:变量tables对应的reduced cost值为5,表示当非基变量tables的值从0变为 1时(此时假定其他非基变量保持不变,但为了满足约束条件,基变量显然会发生变化),最优的目标函数值 = 280 - 5 = 275。
“DUAL PRICE”(对偶价格)表示当对应约束有微小变动时, 目标函数的变化率。输出结果中对应于每一个约束有一个对偶价格。若其数值为p, 表示对应约束中不等式右端项若增加1 个单位,目标函数将增加p个单位(max型问题)。显然,如果在最优解处约束正好取等号(也就是“紧约束”,也称为有效约束或起作用约束),对偶价格值才可能不是0。本例中:第3、4行是紧约束,对应的对偶价格值为10,表示当紧约束
3) 4 DESKS + 2 TABLES + 1.5 CHAIRS <= 20 变为 3) 4 DESKS + 2 TABLES + 1.5 CHAIRS <= 21 时,目标函数值 = 280 +10 = 290。对第4行也类似。 对于非紧约束(如本例中第2、5行是非紧约束),DUAL PRICE 的值为0, 表示对应约束中不等式右端项的微小扰动不影响目标函数。有时, 通过分析DUAL PRICE, 也可对产生不可行问题的原因有所了解。
灵敏度分析的结果是
Ranges in which the basis is unchanged:
Objective Coefficient Ranges
Current Allowable Allowable Variable Coefficient Increase Decrease DESKS 60.00000 0.0 0.0 TABLES 30.00000 0.0 0.0 CHAIRS 20.00000 0.0 0.0 Righthand Side Ranges
Row Current Allowable Allowable RHS Increase Decrease 2 48.00000 0.0 0.0
页 第23
3 20.00000 0.0 0.0 4 8.000000 0.0 0.0 5 5.000000 0.0 0.0
目标函数中DESKS变量原来的费用系数为60,允许增加(Allowable Increase)=4、允许减少(Allowable Decrease)=2,说明当它在[60-4,60+20] = [56,80]范围变化时,最优基保持不变。对TABLES、CHAIRS变量,可以类似解释。由于此时约束没有变化(只是目标函数中某个费用系数发生变化),所以最优基保持不变的意思也就是最优解不变(当然,由于目标函数中费用系数发生了变化,所以最优值会变化)。
第2行约束中右端项(Right Hand Side,简写为RHS)原来为48,当它在[48-24,48+∞] = [24,∞]范围变化时,最优基保持不变。第3、4、5行可以类似解释。不过由于此时约束发生变化,最优基即使不变,最优解、最优值也会发生变化。
灵敏性分析结果表示的是最优基保持不变的系数范围。由此,也可以进一步确定当目标函数的费用系数和约束右端项发生小的变化时,最优基和最优解、最优值如何变化。下面我们通过求解一个实际问题来进行说明。
例5.2一奶制品加工厂用牛奶生产A1,A2两种奶制品,1桶牛奶可以在甲车间用12小时加工成3公斤A1,或者在乙车间用8小时加工成4公斤A2。根据市场需求,生产的A1,A2全部能售出,且每公斤A1获利24元,每公斤A2获利16元。现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间480小时,并且甲车间每天至多能加工100公斤A1,乙车间的加工能力没有限制。试为该厂制订一个生产计划,使每天获利最大,并进一步讨论以下3个附加问题:
1) 若用35元可以买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶? 2) 若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元? 3) 由于市场需求变化,每公斤A1的获利增加到30元,应否改变生产计划? 模型代码如下:
max=72*x1+64*x2; x1+x2<=50;
12*x1+8*x2<=480; 3*x1<=100;
求解这个模型并做灵敏性分析,结果如下。
Global optimal solution found at iteration: 0 Objective value: 3360.000
Variable Value Reduced Cost X1 20.00000 0.000000 X2 30.00000 0.000000 Row Slack or Surplus Dual Price 1 3360.000 1.000000 2 0.000000 48.00000 3 0.000000 2.000000 4 40.00000 0.000000 Ranges in which the basis is unchanged:
Objective Coefficient Ranges
Current Allowable Allowable
Variable Coefficient Increase Decrease
X1 72.00000 24.00000 8.000000 X2 64.00000 8.000000 16.00000 Righthand Side Ranges
Row Current Allowable Allowable RHS Increase Decrease 2 50.00000 10.00000 6.666667 3 480.0000 53.33333 80.00000 4 100.0000 INFINITY 40.00000
页 第24