全国数学建模lingo实例讲解
3.@peb(a,x)
当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。 4.@pel(a,x)
当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。 5.@pfd(n,d,x)
自由度为n和d的F分布的累积分布函数。 6.@pfs(a,x,c)
当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。当c和(或)x不是整数时,采用线性插值进行计算。
7.@phg(pop,g,n,x)
超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出n(n≤pop)件。pop,g,n和x都可以是非整数,这时采用线性插值进行计算。
8.@ppl(a,x)
Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。
9.@pps(a,x)
均值为a的Poisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算。 10.@psl(x)
单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。 11.@psn(x)
标准正态分布的累积分布函数。 12.@ptd(n,x)
自由度为n的t分布的累积分布函数。 13.@qrand(seed)
产生服从(0,1)区间的拟随机数。@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。通常,声明一个m×n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。
例4.5
model: data:
M=4; N=2; seed=1234567; enddata sets:
rows/1..M/; cols/1..N/;
table(rows,cols): x; endsets data:
X=@qrand(seed); enddata end
如果没有为函数指定种子,那么LINGO将用系统时间构造种子。 14.@rand(seed)
返回0和1间的伪随机数,依赖于指定的种子。典型用法是U(I+1)=@rand(U(I))。注意如果seed不变,那么产生的随机数也不变。
例4.6 利用@rand产生15个标准正态分布的随机数和自由度为2的t分布的随机数。
model:
!产生一列正态分布和t分布的随机数; sets:
series/1..15/: u, znorm, zt;
11
全国数学建模lingo实例讲解
endsets
!第一个均匀分布随机数是任意的; u( 1) = @rand( .1234);
!产生其余的均匀分布的随机数; @for(series( I)| I #GT# 1: u( I) = @rand( u( I - 1)) );
@for( series( I): !正态分布随机数;
@psn( znorm( I)) = u( I); !和自由度为2的t分布随机数; @ptd( 2, zt( I)) = u( I); !ZNORM 和 ZT 可以是负数;
@free( znorm( I)); @free( zt( I)); ); end
4.5 变量界定函数
变量界定函数实现对变量取值范围的附加限制,共4种: @bin(x) 限制x为0或1 @bnd(L,x,U) 限制L≤x≤U
@free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数 @gin(x) 限制x为整数
在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。@free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。
4.6 集操作函数
LINGO提供了几个函数帮助处理集。
1.@in(set_name,primitive_index_1 [,primitive_index_2,?]) 如果元素在指定集中,返回1;否则返回0。
例4.7 全集为I,B是I的一个子集,C是B的补集。
sets:
I/x1..x4/; B(I)/x2/;
C(I)|#not#@in(B,&1):; endsets
2.@index([set_name,] primitive_set_element)
该函数返回在集set_name中原始集成员primitive_set_element的索引。如果set_name被忽略,那么LINGO将返回与primitive_set_element匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。
例4.8 如何确定集成员(B,Y)属于派生集S3。
sets:
S1/A B C/; S2/X Y Z/;
S3(S1,S2)/A X, A Z, B Y, C X/; endsets
X=@in(S3,@index(S1,B),@index(S2,Y));
看下面的例子,表明有时为@index指定集是必要的。 例4.9
sets:
girls/debble,sue,alice/; boys/bob,joe,sue,fred/; endsets
I1=@index(sue);
12
全国数学建模lingo实例讲解
I2=@index(boys,sue);
I1的值是2,I2的值是3。我们建议在使用@index函数时最好指定集。
3.@wrap(index,limit)
该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]内。该函数相当于index模limit再加1。该函数在循环、多阶段计划编制中特别有用。
4.@size(set_name)
该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。 4.7 集循环函数
集循环函数遍历整个集进行操作。其语法为
@function(setname[(set_index_list)[|conditional_qualifier]]:
expression_list);
@function相应于下面罗列的四个集循环函数之一;setname是要遍历的集;set_ index_list是集索引列表;conditional_qualifier是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO都要对conditional_qualifier进行评价,若结果为真,则对该成员执行@function操作,否则跳过,继续执行下一次循环。expression_list是被应用到每个集成员的表达式列表,当用的是@for函数时,expression_list可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时,expression_list只能有一个表达式。如果省略set_index_list,那么在expression_list中引用的所有属性的类型都是setname集。
1.@for
该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。
例4.10 产生序列{1,4,9,16,25}
model: sets:
number/1..5/:x; endsets
@for(number(I): x(I)=I^2); end
2.@sum
该函数返回遍历指定的集成员的一个表达式的和。 例4.11 求向量[5,1,3,4,6,10]前5个数的和。
model: data: N=6; enddata sets:
number/1..N/:x; endsets data:
x = 5 1 3 4 6 10; enddata
s=@sum(number(I) | I #le# 5: x); end
3.@min和@max
返回指定的集成员的一个表达式的最小值或最大值。
例4.12 求向量[5,1,3,4,6,10]前5个数的最小值,后3个数的最大值。
model: data: N=6; enddata sets:
number/1..N/:x;
13
全国数学建模lingo实例讲解
endsets data:
x = 5 1 3 4 6 10; enddata
minv=@min(number(I) | I #le# 5: x); maxv=@max(number(I) | I #ge# N-2: x); end
下面看一个稍微复杂一点儿的例子。
例4.13 职员时序安排模型 一项工作一周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为20、16、13、16、19、14和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
model: sets:
days/mon..sun/: required,start; endsets data:
!每天所需的最少职员数;
required = 20 16 13 16 19 14 12; enddata
!最小化每周所需职员数; min=@sum(days: start); @for(days(J):
@sum(days(I) | I #le# 5:
start(@wrap(J+I+2,7))) >= required(J)); end
计算的部分结果为
Global optimal solution found at iteration: 0 Objective value: 22.00000
Variable Value Reduced Cost REQUIRED( MON) 20.00000 0.000000 REQUIRED( TUE) 16.00000 0.000000 REQUIRED( WED) 13.00000 0.000000 REQUIRED( THU) 16.00000 0.000000 REQUIRED( FRI) 19.00000 0.000000 REQUIRED( SAT) 14.00000 0.000000 REQUIRED( SUN) 12.00000 0.000000 START( MON) 8.000000 0.000000 START( TUE) 2.000000 0.000000 START( WED) 0.000000 0.3333333 START( THU) 6.000000 0.000000 START( FRI) 3.000000 0.000000 START( SAT) 3.000000 0.000000 START( SUN) 0.000000 0.000000
从而解决方案是:每周最少需要22个职员,周一安排8人,周二安排2人,周三无需安排人,周四安排6人,周五和周六都安排3人,周日无需安排人。 4.8 输入和输出函数
输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。 1.@file函数
该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为@file(’filename’)。这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。@file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。
例4.14 以例1.2来讲解@file函数的用法。
14
全国数学建模lingo实例讲解
注意到在例1.2的编码中有两处涉及到数据。第一个地方是集部分的6个warehouses集成员和8个vendors集成员;第二个地方是数据部分的capacity,demand和cost数据。
为了使数据和我们的模型完全分开,我们把它们移到外部的文本文件中。修改模型代码以便于用@file函数把数据从文本文件中拖到模型中来。修改后(修改处代码黑体加粗)的模型代码如下:
model:
!6发点8收点运输问题; sets:
warehouses/ @file('1_2.txt') /: capacity; vendors/ @file('1_2.txt') /: demand; links(warehouses,vendors): cost, volume; endsets !目标函数;
min=@sum(links: cost*volume); !需求约束;
@for(vendors(J):
@sum(warehouses(I): volume(I,J))=demand(J)); !产量约束;
@for(warehouses(I):
@sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data:
capacity = @file('1_2.txt') ; demand = @file('1_2.txt') ; cost = @file('1_2.txt') ; enddata end
模型的所有数据来自于1_2.txt文件。其内容如下: !warehouses成员;
WH1 WH2 WH3 WH4 WH5 WH6 ~ !vendors成员;
V1 V2 V3 V4 V5 V6 V7 V8 ~ !产量;
60 55 51 43 41 52 ~ !销量;
35 37 22 32 41 32 43 38 ~ !单位运输费用矩阵; 6 2 6 7 4 2 5 9 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3
把记录结束标记(~)之间的数据文件部分称为记录。如果数据文件中没有记录结束标记,那么整个文件被看作单个记录。注意到除了记录结束标记外,模型的文本和数据同它们直接放在模型里是一样的。
我们来看一下在数据文件中的记录结束标记连同模型中@file函数调用是如何工作的。当在模型中第一次调用@file函数时,LINGO打开数据文件,然后读取第一个记录;第二次调用@file函数时,LINGO读取第二个记录等等。文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时,LINGO会读取最后一条记录,然后关闭文件。如果最后一条记录也有记录结束标记,那么直到LINGO求解完当前模型后才关闭该文件。如果多个文件保持打开状态,可能就会导致一些问题,因为这会使同时打开的文件总数超过允许同时打开文件的上限16。
当使用@file函数时,可把记录的内容(除了一些记录结束标记外)看作是替代模型中
15