sets:
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 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(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)
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
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 求解最优化问题
其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