第三章+LINGO软件的使用Word格式.docx
- 文档编号:16645564
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:48
- 大小:284.85KB
第三章+LINGO软件的使用Word格式.docx
《第三章+LINGO软件的使用Word格式.docx》由会员分享,可在线阅读,更多相关《第三章+LINGO软件的使用Word格式.docx(48页珍藏版)》请在冰豆网上搜索。
图1.2
当前光标所在的窗口(窗口标题栏上标有“LINGOModel-LINGO1”),就是模型窗口(modelwindows),也就是用于输入LINGO优化模型(即LINGO程序)的窗口.
3.2LINGO模型的基本特征
LINGO模型(程序)从LINGO模型窗口输入,它以语句“MODEL:
”开始,以语句“END”结束.它是由一系列语句组成,每个语句都是以分号“;
”结束,语句是组成LINGO模型的基本单位.每行可以写多个语句,为了保持模型的可读性,最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感.以感叹号“!
”开始的语句是注释语句(注释语句也需要以分号“;
”结束).
LINGO模型(程序)一般由5个部分(或称5段)组成:
(1)集合段(SETS):
这部分要以“SETS:
”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组).格式有基本集和派生集两种.
基本集:
Setname(集合变量名)[/member_list(元素列表)/][:
attribute_list(属性列表)];
元素列表可以全部一一列出,也可以用格式“/元素1..元素N/”列出,例如
SETS:
STUDENTS/1,2,3,4,5/:
NAME,AGE;
ENDSETS
STUDENTS/1..5/:
派生集:
Setname(parent_set_list(源集列表))[/member_list/][:
attribute_list];
例如
SETS:
PRODUCT/AB/;
MACHINE/MN/;
WEEK/1..2/;
ALLOWED(PRODUCT,MACHINE,WEEK);
列表可以用逗号“,”分开,也可以用空格分开.
(2)数据段(DATA):
这部分要以“DATA:
”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据.格式为:
attribute_list(属性列表)=value_list(常数列表);
SET1/A,B,C/:
X,Y;
DATA:
X=123;
Y=456;
ENDDATA
(3)初始化段(INIT):
这部分要以“INIT:
”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)给出初值.格式为:
与数据段的用法类似.
(4)计算段(CALC):
这部分要以“CALC:
”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理.因为在实际问题中,输入的数据往往是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据.在计算段中语句是顺序执行的.
(5)目标与约束段:
这部分没有段的开始和结束标记,作用在于给定目标函数与约束条件.可见除这一段外,其他4个段都有明确的段标记.这一段是模型的主要部分,其他段是为这一段服务的.其他四段可以没有,这一段必须要有.否则不称其为模型.这一段一般要用到LINGO的运算符和各种函数.
3.3LINGO的运算符和函数
LINGO包含有大量的运算符和函数,供程序(建立优化模型)调用,其功能很强.充分利用这些函数,对解决问题将是非常方便的.下面给出部分函数及简要功能介绍,全部函数及详细功能说明可进一步参考LINGO的使用手册.
一、运算符及其优先级
LINGO的运算符有三类:
算数运算符、逻辑运算符和关系运算符.
1.算术运算符:
LINGO中的算术运算符有以下5种:
+(加法),-(减法或负号),*(乘法),/(除法),∧(求幂).
算术运算是数与数之间的运算,运算结果仍是数.
2.逻辑运算符:
LINGO中的逻辑运算符有以下9种,可以分成两类:
(1)#AND#(与),#OR#(或),#NOT#(非):
这三个运算是逻辑值之间的运算,也就是它们操作的对象本身必须已经是逻辑值或逻辑表达式,计算结果也是逻辑值.
(2)#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):
这6个操作实际上是“数与数之间”的比较,也就是它们操作的对象本身必须是两个数,而逻辑表达式计算的结果是逻辑值.
3.关系运算符:
LINGO中的关系运算符有以下3种:
<(即<=,小于等于),=(等于),>(即>=,大于等于)
这三个运算符虽然也是“数与数之间”的比较,但在LINGO中只用来表示优化模型的约束条件,所以不是真正意义上的运算.
这些运算符的优先级如表3.1所示(同一优先级按左到右的顺序执行;
如果有括号“()”,则括号内的表达式优先进行计算)
表3.1
优先级
运算符
最高
最低
#NOT#-(负号)
∧
*/
+-(减法)
#EQ##NE##GT##GE##LT##LE#
#AND##OR#
<=>
二、基本的数学函数
在LINGO中写程序时可以调用大量的内部函数,这些函数以“@”符号打头(类似调用命令).LINGO中数学函数的用法与其它语言中的数学函数的用法类似,主要有以下函数:
@ABS(X):
绝对值函数,返回X的绝对值.
@COS(X):
余弦函数,返回X的余弦值(X的单位是弧度).
@EXP(X):
指数函数,返回ex的值.
@FLOOR(X):
取整函数,返回X的整数部分(向最靠近0的方向取整).
@LGM(X):
返回X的伽马(Gamma)函数的自然对数值.
@LOG(X):
自然对数函数,返回X的自然对数值.
@MOD(X,Y):
模函数,返回X对Y取模的结果.
@POW(X,Y):
指数函数,返回XY的值.
@SIGN(X):
符号函数,返回X的符号值(X<0时返回-1,X>=0返回1).
@SIN(X):
正弦函数,返回X的正弦值.
@SMAX(list):
最大值函数,返回列表(list)中的最大值.
@SMIN(list):
最小值函数,返回列表(list)中的最小值.
@SQR(X):
平方函数,返回X的平方值.
@SQRT(X):
平方根函数,返回X的正的平方根的值.
@TAN(X):
正切函数,返回X的正切值.
三、集合循环函数
集合循环函数是指对集合上的元素(下标)进行循环操作的函数,主要有@FOR,@MAX,@MIN,@SUM,@PROD五种,其用法如下:
@function(setname[(set_index_list)[|conditional_qualifier]]:
expression_list);
其中:
Function是集合函数名;
Setname是集合名;
set_index_list是集合索引列表(不需要使用索引时可以省略);
|conditional_qualifier是用逻辑表达式给出的过滤条件(无条件时可以省略);
:
expression_list是一个表达式(对@FOR函数,可以是一组表达式).
下面简要介绍其作用.
@FOR(setname[(set_index_list)[|cond_qualifier]]:
exp_list):
对集合setname中的每个元素独立地生成由exp_list描述的表达式(通常是优化问题的约束).
@MAX(setname[(set_index_list)[|cond_qualifier]]:
exp):
返回集合setname上的表达式exp的最大值.
@MIN(setname[(set_index_list)[|cond_qualifier]]:
返回集合setname上的表达式exp的最小值.
@SUM(setname[(set_index_list)[|cond_qualifier]]:
返回集合setname上的表达式exp的和.
@PROD(setname[(set_index_list)[|cond_qualifier]]:
返回集合setname上的表达式exp的积.
四、集合操作函数
集合操作函数是指对集合进行操作的函数,主要有@INDEX,@IN,@WRAP,@SIZE四种,下面简要介绍其作用.
@INDEX([set_name,]primitive_set_element):
返回元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略集合名set_name,LINGO按程序定义的集合顺序找到第一个含有元素primitive_set_element的集合,并返回索引值.如果在所有集合中均没有找到该元素,会给出出错信息.
@IN(set_name,primitive_index_1[,primitive_index_2...]):
判断一个集合中是否含有索引值.集合set_name中包含由索引primitive_index_1[,primitive_index_2...]所表示的对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”).
@WRAP(INDEX,LIMIT):
返回J=INDEX-K*LIMIT,其中J位于区间[1,LIMIT],K为整数.当INDEX位于区间[1,LIMIT]内时直接返回INDEX.相当于数学上用INDEX对LIMIT取模函数的值+1,即@WRAP(INDEX,LIMIT)=@MOD(INDEX,LIMIT)+1.此函数对LIMIT<1无定义.可以想到,此函数的目得之一是防止集合的索引值越界.
@SIZE(set_name):
返回集合set_name的模,即元素的个数.
五、变量定界函数
变量定界函数是对变量的取值范围加以限制的函数.主要有@BIN,@BND,@FREE,@GIN四种,下面简要介绍其作用.
@BIN(variable):
限制变量variable为0或1.
@BND(lower_bound,variable,upper_bound):
限制
lower_bound<=variable<=upper_bound
@FREE(variable):
取消对变量variable的符号限制(即可取负数、0或正数).
@GIN(variable):
限制变量variable为整数.
六、财务会计函数
财务会计函数是用于计算净现值的函数.主要有@FPA,@FPL两种,下面简要介绍其作用.
@FPA(I,N):
返回若干时段单位等额回收净现值.其中单位时段利率为I,时段N个,即
@FPL(I,N):
返回一个时段单位回收净现值.其中单位时段利率为I,时段N,即
七、概率中的相关函数
概率中的相关函数是涉及到概率论和随机过程中的一些函数.主要有以下函数:
@PSN(X):
返回标准正态分布的分布函数在X点的取值.
@PSL(X):
标准正态的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z为均值为A的Poisson随机变量.
@PPS(A,X):
返回均值为A的Poisson分布的分布函数在X点的取值.
@PPL(A,X):
Poisson分布的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z为标准正态随机变量.
@PBN(P,N,X):
返回参数为(N,P)的二项分布的分布函数在X点的取值.
@PHG(POP,G,N,X):
返回总共有POP个球,其中G个是白球,随机地从中取出N个球,白球不超过X的概率.
@PFD(N,D,X):
返回自由度为N和D的F分布的分布函数在X点的取值.
@PCX(N,X):
返回自由度为N的
分布的分布函数在X点的取值.
@PTD(N,X):
返回自由度为N的t分布的分布函数在X点的取值.
@PEB(A,X):
返回当到达负荷(强度)为A,服务系统有X个服务器且允许无穷排队时的Erlang繁忙概率.
@PEL(A,X):
返回当到达负荷(强度)为A,服务系统有X个服务器且不允许排队时的Erlang繁忙概率.
@PFS(A,X,C):
返回当负荷上限为A,顾客数为C,并行服务器数量为X时,有限源的Poisson服务系统得等待顾客数的期望值.
@QRAND(SEED):
返回0与1之间的多个拟均匀随机数,其中SEED为种子,默认时取当前计算机时间为种子.该函数只能用在数据段(DATA-ENDDATA).
@RAND(SEED):
返回0与1之间的一个伪均匀随机数,其中SEED为种子.
八、文件输入输出函数
文件输入输出函数是指通过文件输入数据和输出结果的函数.主要有以下函数:
@FILE('
filename'
):
这个函数提供LINGO与文本文件的接口,用于引用其它ASCII码或文本文件中的数据,其中filename为存放数据的文件名(包括路径,没有指定路径时表示当前目录),该文件中记录之间必须用符号“~”分开.主要用在集合段和数据段,通过文本文件输入数据.
@TEXT(['
]):
用于数据段中将解答结果送到文本文件filename中.
@ODBC(['
data_source'
[,'
table_name'
col_1'
[,'
col_2'
...]]]]):
这个函数提供LINGO与ODBC(opendatabaseconnection,开放式数据库连接)的接口,用于集合段和数据段中引用其它数据库数据或将解答结果送到数据库中.其中data_source是数据库名,table_name是数据表名,col_i是数据列名(数据域名).
@OLE('
spreadsheet_file'
[,range_name_list]):
这个函数提供LINGO与OLE(objectlinkingandembedding,对象链接与嵌入)的借口,用于集合段、数据段和初始段中输入和输出数据库.其中spreadsheet_file是文件名,range_name_list是文件中包含数据的单元范围.
@POINTER(N):
在Windows下使用LINGO的动态链接库(dynamiclinklibrary,DLL),直接从共享的内存中传送数据.
3.4LINGO软件求解案例
一、生产管理问题
1.问题实例
某厂有5种设备A1,A2,…,A5,用来加工7种零部件B1,B2,…,B7,每种设备的数量、每种零部件的单位成本及所需各设备的加工工时(以小时计)见表1
表1
产品
B1B2B3B4B5B6B7
设备的数量
收益
1006080401109030
A1
A2
A3
A4
A5
0.50.7000.30.20.5
0.10.200.300.60
0.200.80000.6
0.050.0300.070.100.08
000.0100.0500.05
4
2
3
1
在其后的半年中,工厂有设备检修计划(停工检修时间一个月)见表2
表2
一月
二月
三月
四月
五月
六月
A11台
A32台
A21台
A31台
工厂在半年中有订单(必须按时交货)见表3
表3
B1B2B3B4B5B6B7
250500150150400100100
3002501000200150100
15030000250200100
1001502002501000100
01002501005001500
250250100300550250100
每种零部件库存最多可到100件,现每种零部件有库存80件,库存费用每件每月为0.5元,,要求到六月底每种零部件有存货50件,每种零部件生产至少50件.
工厂每周工作5天,每天2班,每班8小时.
试回答如下问题:
(1)工厂如何安排各月份各种零部件的加工数量?
(2)单位成本有10%的变化,对计划有什么影响?
(3)设备各增加1台对计划有什么的影响.
2.模型建立
设:
为第
种零部件在第
种设备上的单位加工工时
;
种设备在第
月的数量
月第
种零部件的顶单数量
种零部件的单位收益
种零部件的生产数量
月末第
种零部件的库存数量
为初始库存
假设每月以20天计,有以下模型:
3.模型求解
利用LINGO软件计算,输入
model:
sets:
cp/1..7/:
c;
yf/1..6/:
;
sb/1..5/:
sl1(yf,cp):
x,d,s;
sl2(sb,cp):
a;
sl3(sb,yf):
b;
endsets
data:
a=0.50.70.00.00.30.20.5
0.10.20.00.30.00.60.0
0.20.00.80.00.00.00.6
0.050.0300.070.100.08
000.0100.0500.05;
b=344434
221112
313332
111111
111111;
d=250500150150400100100
250250100300550250100;
c=1006080401109030;
enddata
min=@sum(sl1(k,j):
c(j)*x(k,j)+0.5*s(k,j));
@for(yf(k):
@for(sb(i):
@sum(cp(j):
a(i,j)*x(k,j))<
=320*b(i,k)));
@for(yf(k)|k#gt#1:
@for(cp(j):
s(k,j)=s(k-1,j)+x(k,j)-d(k,j)));
@for(cp(j):
s(1,j)=80+x(1,j)-d(1,j));
s(6,j)=50);
@for(sl1(k,j):
s(k,j)<
=100);
x(k,j)>
=50);
end
(1)计算结果有:
目标函数:
产品生产
B1B2B3B4B5B6B7
17042070703205050
3002501005020012070
1503005050250200100
10015015015010050100
5010025010050010050
250300150350600300100
产品库存
000003030
00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 LINGO 软件 使用