【Lingo】lingo使用

目录

  • 规划
  • LINGO 有 9 种类型的函数:
    • 算术运算符
      • LINGO 具有9种逻辑运算符:
        • 优先级
    • 数学函数
    • 金融函数
    • 概率函数
    • 变量界定函数
    • 集操作函数
    • 集循环函数
    • 输入和输出函数
    • 结果报告函数
    • 辅助函数

规划

max ⁡ 2 x 1 + x 2 s . t . x 1 + x 2 ≥ 350 x 1 ≥ 100 2 x 1 + x 2 ≤ 600 x 1 , x 2 ≥ 0 \begin{array}{l} \hspace*{1.5cm}\max{\rm{ }}2x_1+x_2\\ s.t.\hspace*{1cm}{\rm{ }}x_1+x_2\ge {\rm{ }}350\\ \hspace*{1.5cm}x_1\ge100\\ \hspace*{1.5cm}2x_1+x_2\le600\\ \hspace*{1.5cm}x_1,x_2\ge0 \end{array} max2x1+x2s.t.x1+x2350x11002x1+x2600x1,x20
Lingo代码

min=2*x1+3*x2; 
x1+x2>=350; 
x1>=100; 
2*x1+x2<=600;

【Lingo】lingo使用_第1张图片
【Lingo】lingo使用_第2张图片
max ⁡ 98 x 1 + 277 x 2 − x 1 2 − 0.3 x 1 x 2 − 2 x 2 2 s . t . x 1 + x 2 ≤ 100 x 1 ≤ 2 x 2 x 1 , x 2 ≥ 0 \begin{array}{l} \hspace*{1.5cm}\max{\rm{ }}98x_1+277x_2-x_1^2-0.3x_1x_2-2x_2^2\\ s.t.\hspace*{1cm}{\rm{ }}x_1+x_2\le {\rm{ }}100\\ \hspace*{1.5cm}x_1\le2x_2\\ \hspace*{1.5cm}x_1,x_2\ge0 \end{array} max98x1+277x2x120.3x1x22x22s.t.x1+x2100x12x2x1,x20
lingo代码

x1+x2<100;
max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
x1<=2*x2;
@gin(x1);@gin(x2);!再假设要求为整数;

【Lingo】lingo使用_第3张图片

LINGO 有 9 种类型的函数:

1. 基本运算符:包括算术运算符、逻辑运算符和关系运算符;
2. 数学函数:三角函数和常规的数学函数;
3. 金融函数:LINGO 提供的两种金融函数;
4. 概率函数:LINGO 提供了大量概率相关的函数;
5. 变量界定函数:这类函数用来定义变量的取值范围;
6. 集操作函数:这类函数为对集的操作提供帮助;
7. 集循环函数:遍历集的元素,执行一定的操作的函数;
8. 数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入
输出;
9. 辅助函数:各种杂类函数。

算术运算符

算术运算符是针对数值进行操作的。LINGO 提供了 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#
#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 函数的自然对数。
@mod(x,y):返回 x 除以 y 的余数。
@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 中的最小值。

金融函数

1.@fpa(I,n)
在这里插入图片描述
2.@fpl(I,n)
在这里插入图片描述
@ f p a ( I , n ) = ∑ k = 1 n @ f p l ( I , k ) @fpa(I,n )=\sum\limits_{{{k}} = 1}^n {@fpl( I,k )} @fpa(I,n)=k=1n@fpl(I,k)

概率函数

1.@pbn(p,n,x)

二项分布的累积分布函数。当 n 和(或)x 不是整数时,用线性插值法进行计算。
2.@pcx(n,x)

自由度为 n 的 χ 2 χ^2 χ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 表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。

变量界定函数

变量界定函数实现对变量取值范围的附加限制,共 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 的约束。

集操作函数

1.@in(set_name,primitive_index_1 [,primitive_index_2,…])

如果元素在指定集中,返回 1;否则返回 0。

sets: 
 I/x1..x4/:x; 
 B(I)/x2/:y; 
 C(I)|#not#@in(B,&1):z; 
endsets

2.@index([set_name,] primitive_set_element)

该函数返回在集 set_name 中原始集成员 primitive_set_element 的索引。如果set_name 被忽略,那么 LINGO 将返回与primitive_set_element 匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。

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));

3.@wrap(index,limit)

该函数返回 j=index-k*limit,其中 k 是一个整数,取适当值保证 j 落在区间[1,limit]内。该函数在循环、多阶段计划编制中特别有用。
4.@size(set_name)

该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护

集循环函数

集循环函数遍历整个集进行操作。其语法为
@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 自动产生每个集成员的约束。
2.@sum

该函数返回遍历指定的集成员的一个表达式的和。
3.@min 和@max

返回指定的集成员的一个表达式的最小值或最大值。

输入和输出函数

1.@file 函数

该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为@file(’filename’)。这里 filename 是文件名,可以采用相对路径和绝对路径两种表示方式。
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 是自左而右、自上而下来读。

结果报告函数

1.@WRITE(obj1[,…,objn])

这个函数只能在数据段中使用,用于输出一系列结果(obj1,…,objn),其中obj1, …,objn 等可以是变量(但不能只是属性),也可以是字符串(放在单引号中的为字符串)或换行(@NEWLINE(1))等。结果可以输出到一个文件,或电子表(如 Excel),或数据库,这取决于@WRITE 所在的输出语句中左边的定位函数。例如:
DATA:
@TEXT()=@WRITE(’A is ’,A,’,B is ’,B,’,A/B is’,A/B);
ENDDATA
其中 A,B 是模型中的变量,则上面语句的作用是在屏幕上输出 A,B 以及 A/B 的值(注意上面语句中还增加了一些字符串,使结果读起来更方便)。假设计算结束时 A=10,B=5,则输出为 A is 10, B is 5, A/B is 2
2.@WRITEFOR(setname[(set_index_list)[|condition]]:obj1[,objn])

这个函数可以看作是函数@WRITE 在循环情况下的推广,它输出集合上定义的属性对应的多个变量的取值(因此它实际上也是一个集合循环函数)。
3.@ITERS()

这个函数只能在程序的数据段使用,调用时不需要任何参数,总是返回 LINGO 求解器计算所使用的总迭代次数。例如: @TEXT()=@WRITE('Iterations= ',@ITERS());
将迭代次数显示在屏幕上。
4.@NEWLINE(n)

这个函数在输出设备上输出 n 个新行(n 为一个正整数)。
5.@STRLEN(string)

这个函数返回字符串“string”的长度,如@STRLEN(123)返回值为 3。
6.@NAME(var_or_row_reference)

这个函数返回变量名或行名。
7.符号“*”

在@write 和@writefor 函数中,可以使用符号“”表示将一个字符串重复多次,
用法是将“
”放在一个正整数 n 和这个字符串之间,表示将这个字符串重复 n 次。
8.@format(value,format_descriptor)

在@write 和@writefor 函数中,可以使用@format 函数对数值设定输出格式。其中value 表示要输出的数值,而 format_descriptor(格式描述符)表示输出格式。格式描述符的含义与 C 语言中的格式描述是类似的,如“12.2f”表示输出一个十进制数,总共占 12,其中有 2 位小数。
9.@ranged(variable_or_row_name)

为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量。
10.@rangeu(variable_or_row_name)

为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量。
11.@status()

返回 LINGO 求解模型结束后的状态:

  • Global Optimum(全局最优)
  • Infeasible(不可行)
  • Unbounded(无界)
  • Undetermined(不确定)
  • Feasible(可行)
  • Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)
  • Local Optimum(局部最优)
  • Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO 并没有找到一个)
  • Cutoff(目标函数的截断值被达到)
  • Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)
    通常,如果返回值不是 0、4 或 6 时,那么解将不可信,几乎不能用。该函数仅
    12.@dual

@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影
子)价格(dual prices)。

辅助函数

1.@if(logical_condition,true_result,false_result)

@if 函数将评价一个逻辑表达式 logical_condition,如果为真,返回 true_ result,否则返回 false_result。
2.@warn(’text’,logical_condition)

如果逻辑条件 logical_condition 为真,则产生一个内容为’text’的信息框。

你可能感兴趣的:(数学建模学习,概率论)