lingo中的函数 lingo中的函数 2007-09-01 15:11 一、数学函数 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函数的自然对数(当x为整数时 lgm(x)=log(x-1)!;当x不为整数时,采用线性插值得到结果)。 @sign(x) 如果x<0返回-1;否则,返回1 @floor(x) 返回x的整数部分。当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。 @pow(x,y) 指数函数,返回x的y次方的值。 @sqr(x) 平方函数,返回x的平方(既x*x)的值。 @sqrt(x) 平方根函数,返回x的正的平方根的值。 @sign(x) 符号函数,返回x的符号值(x<0时返回-1,x>=0时返回+1)。 @mod(x,y) 模函数,返回x对y取模的结果,既x除以y的余数,这里x和y应该是整数 @smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值 @smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值 二、变量定界函数 @BND(L,X,U):限制L<=X<=U。注意LINGO中没有与LINDO命令SLB, SUB类似的函数@SLB和@SUB @BIN(X):限制X为0或1。 @FREE(X):取消对X的符号限制(即可取负数、0或正数)。 @GIN(X):限制X为正数。 三、概率函数 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都可以是非整数,这时采用线性插值进行计算。 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表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。 四、输入和输出函数 输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。 1.@file函数 该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法
为@file(’filename’)。这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。@file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。 2.@text函数 该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。其语法为 @text([’filename’]) 这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕)。@text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。 我们把用接口函数产生输出的数据声明称为输出操作。输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后。 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.@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时,那么解将不可信,几乎不能用。该函数仅被用在模型的数据部分来输出数据。 lingo 概率函数 2008-07-22 04:15 P.M. 1.@pbn(p,n,x) 二项分布的累积分布函数。当n 和(或)x 不是整数时,用线性插值法进行计算。 2.@pcx(n,x) 自由度为n的χ分布的累积分布函数。 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 表示每次实验所 需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随 机数是用“分层取样”的方法产生的。 lingo 变量界定函数 2008-07-22 04:16 P.M. 变量界定函数实现对变量取值范围的附加限制,共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 @qrand 函数 2008-07-22 04:12 P.M. model: sets: rows/1..4/; cols/1..2/; table(rows,cols):x; endsets data: seed=1234567; X=@qrand(seed); enddata end or.... 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 大量的标准数学函数: 2008-07-22 03:45 P.M. 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 中的最小值 在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# #eq# #ne# #gt# #ge# #lt# #le# 低 #and# #or#