心科研中圆 国科学研沉信息们月 科研中国 SciEn. com收集整理版权归原作者 这些运算符的优先级由高到低为: 高#nOt# #eq##ne##gt##ge##lt##le# 低#and##or# 例4.2逻辑运算符示例 2#gt#3#and#4#gt#2,其结果为假(0)。 41.3关系运算符 在 LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小 于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#1e#、 #ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该 关系是否被满足:满足为真,不满足为假 LINGO有三种关系运算符:“=”、“<=”和“>=”。LING0中还能用“<”表示小于等 于关系,“>”表示大于等于关系。 LINGO0并不支持严格小于和严格大于关系运算符。然而, 如果需要严格小于和严格大于关系,比如让A严格小于B A<B 那么可以把它变成如下的小于等于表达式: A+ε<=B 这里ε是一个小的正数,它的值依赖于模型中A小于B多少才算不等。 下面给出以上三类操作符的优先级: 高#not# (取反) #eq##ne##gt##ge##lt##le# fand= fort 低 4.2数学函数 LINGO提供了大量的标准数学函数 返回x的绝对值 返回x的正弦值,x采用弧度制 @cos(x) 返回x的余弦值 @tan(x) 返回x的正切值 返回常数e的x次方 og 返回x的自然对数 @lgm(x) 返回x的 gamma函数的自然对数 @sign(x) 如果x<0返回-1;否则,返回1 @floor(x 返回x的整数部分。当x>=0时,返回不超过x的最大整数:当x<0 时,返回不低于x的最大整数 esmax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值 smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值 例4.3给定一个直角三角形,求包含该三角形的最小正方形。 解:如图所示。 CE=asin x. AD= bcos x. E= acos x +bsin x 求最小的正方形就相当于求如下的最优化问题 min max CE, AD, DE) Oss- LINGO0代码如下 model sets 共53页11
科研中国 SciEi.com 收集整理 版权归原作者 共 53 页 11 这些运算符的优先级由高到低为: 高 #not# #eq# #ne# #gt# #ge# #lt# #le# 低 #and# #or# 例 4.2 逻辑运算符示例 2 #gt# 3 #and# 4 #gt# 2,其结果为假(0)。 4.1.3 关系运算符 在 LINGO 中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小 于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#le#、 #ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该 关系是否被满足:满足为真,不满足为假。 LINGO 有三种关系运算符:“=”、“<=”和“>=”。LINGO 中还能用“<”表示小于等 于关系,“>”表示大于等于关系。LINGO 并不支持严格小于和严格大于关系运算符。然而, 如果需要严格小于和严格大于关系,比如让 A 严格小于 B: A<B, 那么可以把它变成如下的小于等于表达式: A+ε<=B, 这里ε是一个小的正数,它的值依赖于模型中 A 小于 B 多少才算不等。 下面给出以上三类操作符的优先级: 高 #not# ﹣(取反) ^ ﹡ / ﹢﹣ #eq# #ne# #gt# #ge# #lt# #le# #and# #or# 低 <= = >= 4.2 数学函数 LINGO 提供了大量的标准数学函数: @abs(x) 返回 x 的绝对值 @sin(x) 返回 x 的正弦值,x 采用弧度制 @cos(x) 返回 x 的余弦值 @tan(x) 返回 x 的正切值 @exp(x) 返回常数 e 的 x 次方 @log(x) 返回 x 的自然对数 @lgm(x) 返回 x 的 gamma 函数的自然对数 @sign(x) 如果 x<0 返回-1;否则,返回 1 @floor(x) 返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回不低于 x 的最大整数。 @smax(x1,x2,…,xn) 返回 x1,x2,…,xn 中的最大值 @smin(x1,x2,…,xn) 返回 x1,x2,…,xn 中的最小值 例 4.3 给定一个直角三角形,求包含该三角形的最小正方形。 解:如图所示。 CE = a sin x, AD = b cos x, DE = a cos x + bsin x, 求最小的正方形就相当于求如下的最优化问题: { } CE AD DE x min max , , 2 0 π ≤ ≤ LINGO 代码如下: model: sets: A B C D E a b x
心科研中圆 国科学研沉信息们月 科研中国 SciEn. com收集整理版权归原作者 object/1.3/: f endsets b=3,4;!两个直角边长,修改很方便 enddata @sin(x) f(2)=b* @cos(x) f (3)=a ecos(x)+b s @sin(x) min @smax(f(1), f(2), f(3)) ebnd(0,x,1.57) 在上面的代码中用到了函数bnd,详情请见4.5节。 4.3金融函数 目前LING0提供了两个金融函数。 1. efpa(I, n) 返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费 用。若每个时段支付x单位的费用,则净现值可用x乘以efpa(I,n)算得。@fpa的计算公式 为 1-(1+D) (1+1) 净现值就是在定时期内为了获得一定收益在该时期初所支付的实际费用,方式(每 年年末还固定金额,直至还清)。问拟贷款10年,每年需偿还多少元? LING0代码如下: 50000x*fpa(.0531,10); 答案是x=6573.069元。 2. @fpl(I, n) 返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用。efpl(I,n)的 计算公式为 细心的读者可以发现这两个函数间的关系 @(1,n)=∑@ml(1,k) 4.4概率函数 1. Opn(p, n, x) 二项分布的累积分布函数。当n和(或)x不是整数时,用线性插值法进行计算。 2. @pcx(n, x) 自由度为n的x2分布的累积分布函数。 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和 共53页12
科研中国 SciEi.com 收集整理 版权归原作者 共 53 页 12 object/1..3/: f; endsets data: a, b = 3, 4; !两个直角边长,修改很方便; enddata f(1) = a * @sin(x); f(2) = b * @cos(x); f(3) = a * @cos(x) + b * @sin(x); min = @smax(f(1),f(2),f(3)); @bnd(0,x,1.57); end 在上面的代码中用到了函数@bnd,详情请见 4.5 节。 4.3 金融函数 目前 LINGO 提供了两个金融函数。 1.@fpa(I,n) 返回如下情形的净现值:单位时段利率为 I,连续 n 个时段支付,每个时段支付单位费 用。若每个时段支付 x 单位的费用,则净现值可用 x 乘以@fpa(I,n)算得。@fpa 的计算公式 为 I I I n n k k − = − + = + ∑ 1 (1 ) (1 ) 1 1 。 净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。 例 4.4 贷款买房问题 贷款金额 50000 元,贷款年利率 5.31%,采取分期付款方式(每 年年末还固定金额,直至还清)。问拟贷款 10 年,每年需偿还多少元? LINGO 代码如下: 50000 = x * @fpa(.0531,10); 答案是 x=6573.069 元。 2.@fpl(I,n) 返回如下情形的净现值:单位时段利率为 I,第 n 个时段支付单位费用。@fpl(I,n)的 计算公式为 n I − (1+ ) 。 细心的读者可以发现这两个函数间的关系: ∑= = n k fpa I n fpl I k 1 @ ( , ) @ ( , ) 。 4.4 概率函数 1.@pbn(p,n,x) 二项分布的累积分布函数。当 n 和(或)x 不是整数时,用线性插值法进行计算。 2.@pcx(n,x) 自由度为 n 的 χ2 分布的累积分布函数。 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 和
心科研中圆 国科学研沉信息们月 科研中国 SciEn. com收集整理版权归原作者 (或)x不是整数时,采用线性插值进行计算。 7. @phg(pop, g, n, x) 超几何( Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从 所有产品中任意取出n(n≤pop)件。pop,g,n和x都可以是非整数,这时采用线性插值 进行计算 @ppl(a, x) Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值 为a的 Poisson分布 9. @pps(a, x) 均值为a的 Poisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算。 10.@s1(x) 单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态 分布 11.@sn(x) 标准正态分布的累积分布函数 12. eptd (n, x 自由度为n的t分布的累积分布函数。 13. @qrand (seed) 产生服从(0,1)区间的拟随机数。@ grand只允许在模型的数据部分使用,它将用拟随机 数填满集属性。通常,声明一个m×n的二维表,m表示运行实验的次数,n表示每次实验所 需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随 机数是用“分层取样”的方法产生的 例45 model dat. M=4;N=2;seed=1234567 enddata sets rows cols/1.N table (rows, cols):x endsets ata X=@grand (seed) enddata 如果没有为函数指定种子,那么 LINGO将用系统时间构造种子。 14. Grand(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 ndset !第一个均匀分布随机数是任意的 u(1)= grand(.1234) !产生其余的均匀分布的随机数 @for(series( I)II #GT#1: 共53页13
科研中国 SciEi.com 收集整理 版权归原作者 共 53 页 13 (或)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; endsets !第一个均匀分布随机数是任意的; u( 1) = @rand( .1234); !产生其余的均匀分布的随机数; @for(series( I)| I #GT# 1:
心科研中圆 国科学研沉信息们月 科研中国Sciei.com收集整理版权归原作者 u( I)=grand(u(I-1) @for( series !正态分布随机数 epsn( norm( D))=u(l) !和自由度为2的t分布随机数 eptd(2, zt(i))=u(l) ! ZNORM和ZT可以是负数 @free( znorm( I)): @free( zt( I)) 4.5变量界定函数 变量界定函数实现对变量取值范围的附加限制,共4种: @bin(x) 限制x为0或1 bnd(L,x,U)限制L≤x≤U @free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数 egin(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)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 SI/A B C/ S2/X Z S3(S1, S2)/A X, AZ, BY, CX/ endsets X=@in(S3, @index(Sl, B), @index(S2, y)) 看下面的例子,表明有时为 Cindex指定集是必要的 例4.9 sets girls/dabble, sue, alice/ boys/bob, joe, sue, fred/ sets I1=@index(sue) I2=@index(boys, sue) 共53页14
科研中国 SciEi.com 收集整理 版权归原作者 共 53 页 14 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); I2=@index(boys,sue);
心科研中圆 国科学研沉信息们月 科研中国 SciEn. com收集整理版权归原作者 I1的值是2,I2的值是3。我们建议在使用@ index函数时最好指定集。 3. @wrap (index, limit) 该函数返回j= index-k* limit,其中k是一个整数,取适当值保证j落在区间[1,1imit] 内。该函数相当于 index模 limit再加1。该函数在循环、多阶段计划编制中特别有用。 4. @size (set name) 该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它 的使用使模型更加数据中立,集大小改变时也更易维护 4.7集循环函数 集循环函数遍历整个集进行操作。其语法为 @function (setname[(set index list)[conditional qualifier expression list) @function相应于下面罗列的四个集循环函数之一; setname是要遍历的集;set ndex_list是集索引列表; conditional_ qualifier是用来限制集循环函数的范围,当集循 环函数遍历集的每个成员时, LINGO都要对 conditional_ qualifier进行评价,若结果为真 则对该成员执行@ function操作,否则跳过,继续执行下一次循环。 expression_list是被 应用到每个集成员的表达式列表,当用的是efor函数时, expression list可以包含多个表 达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函 数时, expression list只能有一个表达式。如果省略 set index list,那么在 expression list中引用的所有属性的类型都是 setname集。 1. efor 该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过 efor函数允许只输入一个约束,然后 LINGO自动产生每个集成员的约束 例4.10产生序列{1,4,9,16,25} model sets number/1. 5/ endsets @for(number(I): x(I)=I 2) d 该函数返回遍历指定的集成员的一个表达式的和。 例4.11求向量[5,1,3,4,6,10]前5个数的和 N=6 enddata sets number/1. N/:x endsets 134610; enddata s=Osum(number()| I #le# 5: x) 3.@min和@max 返回指定的集成员的一个表达式的最小值或最大值 例4.12求向量[5,1,3,4,6,10]前5个数的最小值,后3个数的最大值 model N=6 enddata 共53页15
科研中国 SciEi.com 收集整理 版权归原作者 共 53 页 15 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