LINGO教程
days/mon..sun/: required,start; endsets data:
!每天所需的最少职员数;
required = 20 16 13 16 19 14 12;
@text('d:\\out.txt')=days '至少需要的职员数为' start; enddata
!最小化每周所需职员数; min=@sum(days: start); @for(days(J):
@sum(days(I) | I #le# 5:
start(@wrap(J+I+2,7))) >= required(J)); end
3.@ole函数
@OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术。OLE传输直接在内存中传输数据,并不借助于中间文件。当使用@OLE时,LINGO先装载EXCEL,再通知EXCEL装载指定的电子数据表,最后从电子数据表中获得Ranges。为了使用OLE函数,必须有EXCEL5及其以上版本。OLE函数可在数据部分和初始部分引入数据。
@OLE可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式。原始集每个集成员需要一个单元(cell),而对于n元的派生集每个集成员需要n个单元,这里第一行的n个单元对应派生集的第一个集成员,第二行的n个单元对应派生集的第二个集成员,依此类推。
@OLE只能读一维或二维的Ranges(在单个的EXCEL工作表(sheet)中),但不能读间断的或三维的Ranges。Ranges是自左而右、自上而下来读。
例4.16 sets:
PRODUCT; !产品; MACHINE; !机器; WEEK; !周;
ALLOWED(PRODUCT,MACHINE,WEEK):x,y; !允许组合及属性; endsets data:
rate=0.01;
PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\\IMPORT.XLS'); @OLE('D:\\IMPORT.XLS')=rate; enddata
代替在代码文本的数据部分显式输入形式,我们把相关数据全部放在如下电子数据表中来输入。下面是D:\\IMPORT.XLS的图表。
除了输入数据之外,我们也必须定义Ranges名:PRODUCT,MACHINE,WEEK,ALLOWED,x,y. 明确的,我们需要定义如下的Ranges名:
Name Range PRODUCT B3:B4 MACHINE C3:C4
共53页 31
LINGO教程
WEEK D3:D5 ALLOWED B8:D10
X F8:F10 Y G8:G10 rate C13
为了在EXCEL中定义Ranges名:
① 按鼠标左键拖曳选择Range, ② 释放鼠标按钮,
③ 选择“插入|名称|定义”, ④ 输入希望的名字, ⑤ 点击“确定”按钮。
我们在模型的数据部分用如下代码从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(通常需要关闭“预处理”选项后重新求解
共53页 32
LINGO教程
模型,以确定模型究竟是不可行还是无界)
6 Local Optimum(局部最优)
7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个)
8 Cutoff(目标函数的截断值被达到)
9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止) 通常,如果返回值不是0、4或6时,那么解将不可信,几乎不能用。该函数仅被用在模型的数据部分来输出数据。 例4.17 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)s.t.?100?2x,f(x)???2x,?60?3y,g(y)???2y,x?y?30x,y?0其LINGO代码如下: model:
min=fx+fy;
共53页 33
x?0x?0y?0y?0
LINGO教程
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命令
5.1 文件菜单(File Menu) 1. 1. 新建(New)
从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。在这个新的“Model”窗口中能够输入所要求解的模型。
2. 2. 打开(Open)
从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。这个文件可能是一个Model文件。
3. 3. 保存(Save)
从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。
4. 4. 另存为...(Save As...) 从文件菜单中选用“另存为...”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为...”对话框中输入的文件名。利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。
5. 5. 关闭(Close)
在文件菜单中选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。如果这个窗口是新建窗口或已经改变了当前文件的内容,LINGO系统将会提示是否想要保存改变后的内容。
6. 6. 打印(Print)
在文件菜单中选用“打印” (Print)命令、单击“打印”按钮或直接按F7键可以将当前活动窗口中的内容发送到打印机。
7. 7. 打印设置(Print Setup...) 在文件菜单中选用“打印设置...”命令或直接按F8键可以将文件输出到指定的打印机。
8. 8. 打印预览(Print Preview) 在文件菜单中选用“打印预览...”命令或直接按Shift+F8键可以进行打印预览。
共53页 34
LINGO教程
9. 9. 输出到日志文件(Log Output...) 从文件菜单中选用“Log Output...”命令或按F9键打开一个对话框,用于生成一个日志文件,它存储接下来在“命令窗口”中输入的所有命令。
10.提交LINGO命令脚本文件(Take Commands...) 从文件菜单中选用“Take Commands...”命令或直接按F11键就可以将LINGO命令脚本(command script)文件提交给系统进程来运行。
11.引入LINGO文件(Export Lingo File...)
优化模型输出到文件,有两个子菜单,分别表示两种输出格式(都是文本文件):
MPS Format(MPS格式):是IBM公司制定的一种数学规划文件格式。
MPI Format(MPI格式):是LINDO公司制定的一种数学规划文件格式。
12. User Database Info
弹出对话框,用户输入用户使用数据库时需要验证的用户名(User ID)和密码(Password),这些信息在使用@ODBC()函数访问数据库时要用到 13. 退出(Exit)
从文件菜单中选用“Exit”命令或直接按F10键可以退出LINGO系统。
5.2 编辑菜单(Edit Menu) 1. 1. 恢复(Undo)
从编辑菜单中选用“恢复”(Undo)命令或按Ctrl+Z组合键,将撤销上次操作、恢复至其前的状态。
2. 2. Redo
3. 3. 剪切(Cut)
从编辑菜单中选用“剪切”(Cut)命令或按Ctrl+X组合键可以将当前选中的内容剪切至剪贴板中。
4. 4. 复制(Copy)
从编辑菜单中选用“复制”(Copy)命令、单击“复制”按钮或按Ctrl+C组合键可以将当前选中的内容复制到剪贴板中。
5. 5. 粘贴(Paste)
从编辑菜单中选用“粘贴”(Paste)命令、单击“粘贴”按钮或按Ctrl+V组合键可以将粘贴板中的当前内容复制到当前插入点的位置。
6. 6. 粘贴特定..(Paste Special。。)
与上面的命令不同,它可以用于剪贴板中的内容不是文本的情形。
7. 7. 全选(Select All)
从编辑菜单中选用“Select All”命令或按Ctrl+A组合键可选定当前窗口中的所有内容。
8. 8. Find
9. 9. Find Next 10. Replace 11. Go to Line
12. 匹配小括号(Match Parenthesis)
共53页 35