Lingo使用教程
我们在模型的数据部分用如下代码从EXECL中引入数据:
PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\\IMPORT.XLS'); @OLE('D:\\IMPORT.XLS')=rate; 等价的描述为
PRODUCT,MACHINE,WEEK,ALLOWED,x,y
=@OLE('D:\\IMPORT.XLS', PRODUCT,MACHINE,WEEK,ALLOWED,x,y); @OLE('D:\\IMPORT.XLS',rate)=rate;
这一等价描述使得变量名和Ranges不同亦可。 4.@ranged(variable_or_row_name)
为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量。 5.@rangeu(variable_or_row_name)
为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量。 6.@status()
返回LINGO求解模型结束后的状态: 0 Global Optimum(全局最优) 1 Infeasible(不可行) 2 Unbounded(无界) 3 Undetermined(不确定) 4 Feasible(可行)
5 Infeasible or Unbounded(通常需要关闭―预处理‖选项后重新求解模型,以确定模型究竟是不可行还是无界)
6 Local Optimum(局部最优)
7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个)
8 Cutoff(目标函数的截断值被达到)
9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)
通常,如果返回值不是0、4或6时,那么解将不可信,几乎不能用。该函数仅被用在模型的数据部分来输出数据。
例4.17
第21页(共59页)
Lingo使用教程
model:
min=@sin(x); data:
@text()=@status(); enddata end
部分计算结果为:
Local optimal solution found at iteration: 33
Objective value: -1.000000 6
Variable Value Reduced Cost X 4.712388 0.000000
结果中的6就是@status()返回的结果,表明最终解是局部最优的。 7.@dual
@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子)价格(dual prices)。
4.9 辅助函数
1.@if(logical_condition,true_result,false_result)
@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_ result,否则返回false_result。
例4.18 求解最优化问题 minf(x)?g(y)??100?2xx?0?f(x)??x?0?2x???60?3yy?0 s.t.?g(y)??y?0?2y??s?y?30?x,y?0?其LINGO代码如下: model: min=fx+fy;
fx=@if(x #gt# 0, 100,0)+2*x; fy=@if(y #gt# 0,60,0)+3*y; x+y>=30; end
2.@warn(’text’,logical_condition)
如果逻辑条件logical_condition为真,则产生一个内容为’text’的信息框。 例4.19 示例。 model: x=1;
@warn('x是正数',x #gt# 0); end
§5 LINGO WINDOWS命令
第22页(共59页)
Lingo使用教程
5.1 文件菜单(File Menu) 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组合键可以将当前选中的内容剪切至
第23页(共59页)
Lingo使用教程
剪贴板中。
3. 复制(Copy)
从编辑菜单中选用―复制‖(Copy)命令、单击―复制‖按钮或按Ctrl+C组合键可以将当前选中的内容复制到剪贴板中。
4. 粘贴(Paste)
从编辑菜单中选用―粘贴‖(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单位 60单位 每个餐桌 6单位 2单位 1.5单位 30单位 每个椅子 1单位 1.5单位 0.5单位 20单位 现有资源总数 48单位 20单位 8单位
第24页(共59页)
Lingo使用教程
若要求桌子的生产量不超过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),可以看到如下结果。
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
第25页(共59页)