dylingo8(编辑修改稿)内容摘要:

算次序为从左到右按优先级高低来执行。 运算的次序可以用圆括号“()”来改变。 例 算术运算符示例。 2﹣ 5/ 3, (2﹢ 4)/ 5等等。 逻辑运算符 在 LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。 在创建稀疏集时用在成员资格过滤器中。 LINGO具有9种逻辑运算符: not 否定该操作数的逻辑值,# not#是一个一元运算符 eq 若两个运算数相等,则为 true;否则为 flase ne 若两个运算符不相等,则为 true;否则为 flase gt 若左边的运算符严格大于右边的运算符,则为 true;否则为 flase ge 若左边的运算符大于或等于右边的运算符,则为 true;否则为 flase lt 若左边的运算符严格小于右边的运算符,则为 true;否则为 flase le 若左边的运算符小于或等于右边的运算符,则为 true;否则为 flase and 仅当两个参数都为 true时,结果为 true;否则为 flase or 仅当两个参数都为 false时,结 果为 false;否则为 true 这些运算符的优先级由高到低为: 高 not 13 eq ne gt ge lt le 低 and or 例 逻辑运算符示例 2 gt 3 and 4 gt 2,其结果为假( 0)。 关系运算符 在 LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。 关系运算符与逻辑运算符 eq、 le、ge截然不同,前者是 模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。 LINGO有三种关系运算符: “=” 、 “=” 和 “=”。 LINGO中还能用 “ ”表示小于等于关系,“ ”表示大于等于关系。 LINGO并不支持严格小于和严格大于关系运算符。 然而,如果需要严格小于和严格大于关系,比如让 A严格小于 B: AB, 那么可以把它变成如下的小于等于表达式: A+ε=B , 这里ε是一个小的正数,它的值依赖于模型中 A小于 B多少才算不等。 下面给出以上三类操作符的优先级: 高 not ﹣(取反) ^ ﹡ / ﹢﹣ eq ne gt ge lt le and or 低 = = = 数学函数 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) 如果 x0返回 1;否则,返回 1 @floor(x) 返回 x的整数部分。 当 x=0时,返回不超过 x 的最大整数;当 x0时,返回不低于 x的最大整数。 @smax(x1,x2,„,xn) 返回 x1, x2, „ , xn中的最大值 @smin(x1,x2,„,xn) 返回 x1, x2, „ , xn中 的最小值 例 给定一个直角三角形,求包含该三角形的最小正方形。 解:如图所示。 ,s i nc o s,c o s,s i n xbxaDExbADxaCE  求最小的正方形就相当于求如下的最优化问题:  DEADCEx ,m a xm in20  LINGO代码如下: model: sets: object/1..3/: f。 endsets data: A B C D DA E a b x 14 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,)。 end 在上面的代码中用到了函数 @bnd,详情请见。 金融函数 目前 LINGO提供了两个金融函数。 1. @fpa(I,n) 返回如下情形的净现值:单位时段利率为 I,连续 n个时段支付,每个时段支付单位费用。 若每个时段支付 x单位的费用,则净现值可用 x乘以 @fpa(I,n)算得。 @fpa的计算公式为 I IInnk k )1(1)1( 11。 净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。 例 贷款买房问题 贷款金额 50000元,贷款年利率 %,采取分期付款方式(每年年末还固定金额,直至还清)。 问拟贷款 10年,每年需偿还多少元。 LINGO代码如下: 50000 = x * @fpa(.0531,10)。 答案是 x=。 2. @fpl(I,n) 返回如下情形的净现值:单位时段利率为 I,第 n 个时段支付单位费用。 @fpl(I,n)的计算公式为 nI  )1(。 细心的读者可以发现这两个函数间的关系:  nk kIf p lnIf p a 1 ),(@),(@。 概率函数 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和(或) x不是整数时,采用线性插值进行计算。 7. @phg(pop,g,n,x) 超几何( Hypergeometric)分布的累积分布函数。 pop表示产品总数, g是正品数。 从所有产品中任意取出 n( n≤pop )件。 pop, g, n和 x都可以是非整数,这时采用线性插值 15 进行计算。 8. @ppl(a,x) Poisson分布的线性损失函数,即返回 max(0,zx)的期望值,其中随机变量 z服从均值为 a的 Poisson分布。 9. @pps(a,x) 均值为 a的 Poisson分 布的累积分布函数。 当 x不是整数时,采用线性插值进行计算。 10. @psl(x) 单位正态线性损失函数,即返回 max(0,zx)的期望值,其中随机变量 z 服从标准正态分布。 11. @psn(x) 标准正态分布的累积分布函数。 12. @ptd(n,x) 自由度为 n的 t分布的累积分布函数。 13. @qrand(seed) 产生服从 (0,1)区间的拟随机数。 @qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。 通常,声明一个 mn 的二维表, m表示运行实验的次数, n表示每次实验所需的随机数的个数。 在行内, 随机数是独立分布的;在行间,随机数是非常均匀的。 这些随机数是用 “ 分层取样 ” 的方法产生的。 例 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不变,那么产生的随机数也不变。 例 利用 @rand产生 15个标准正态分布的随机数和自由度为 2的 t分布的随机数。 model: !产生一列正态分布和 t分布的随机数。 sets: series/1..15/: u, znorm, zt。 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分布随机数。 16 @ptd( 2, zt( I)) = u( I)。 !ZNORM 和 ZT 可以是负数。 @free( znorm( I))。 @free( zt( I))。 )。 end 变量界定函数 变量界定函数实现对变 量取值范围的附加限制,共 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的约束。 集操作函数 LINGO提供了几个函数帮助处理集。 1. @in(set_name,primitive_index_1 [,primitive_index_2,„]) 如果元素在指定集中,返回 1;否则返回 0。 例 全集为 I, B是 I的一个子集, C是 B的补集。 sets: I/x1..x4/。 B(I)/x2/。 C(I)|not@in(B,amp。 1):。 endsets 2. @index([set_name,] primitive_set_element) 该函数返回在集 set_name 中原始集成员 primitive_set_element 的索 引。 如果 set_name被忽略,那么 LINGO将返回与 primitive_set_element匹配的第一个原始集成员的索引。 如果找不到,则产生一个错误。 例 如何确定集成员 (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指定集是必要的。 例 sets: girls/debble,sue,alice/。 boys/bob,joe,sue,fred/。 endsets I1=@index(sue)。 I2=@index(boys,sue)。 I1的值是 2, I2的值是 3。 我们建议在使用 @index函数时最好指定集。 3. @wrap(index,limit) 该函数返回 j=indexk*limit,其中 k是一个整数,取适当值保证 j落在区间 [1, limit]内。 该函数相当于 index模 limit再加 1。 该函数在循环、多阶段计划编制中特别有用。 4. @size(set_name) 该函数返回集 set_name的成员个数。 在模型中明确给出集大小时最好使用该函数。 它的使用使模型更加数据中立,集大小改变时也更易维护。 集循环函数 17 集循环函数遍历整个集进行操作。 其语法为 @function(setname[(set_index_list)[|conditional_qualifier]]: expression_list)。 @function 相应于下面罗列的四个集循环函数之一; setname 是要遍历的集; set_ index_list是集索引列表 ;。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。