【Lingo】lingo使用

规划

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;

在这里插入图片描述
在这里插入图片描述
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 有 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’的信息框。

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Lingo使用教程》是一本介绍Lingo语言的使用方法的电子书。Lingo是一个用于创建交互式多媒体应用程序的脚本语言,主要用于Adobe Director软件中。这本教程提供了详细的步骤和示例,帮助读者了解Lingo的基本语法、关键概念和常用功能。 这本教程的电子书格式使得读者可以方便地在电脑或其他设备上阅读。电子书的好处是可以随时随地进行学习,并且可以进行搜索和书签等功能,方便读者进行查找和复习。此外,电子书还可以通过放大和缩小字体大小来满足不同读者的需求。 教程的内容由浅入深,首先介绍了Lingo的基本语法规则,包括变量、数据类型、运算符等。然后,教程逐步展示了如何使用Lingo来创建图形、动画、音频和视频等多媒体效果。同时,还介绍了如何处理用户输入并与其他应用程序进行交互。 这本教程的目标读者主要是初学者和想要进一步掌握Lingo语言的人。对于初学者来说,他们可以通过阅读教程了解Lingo的基础知识,并通过示例代码来练习和理解。对于有一定Lingo基础的人来说,这本教程可以作为参考资料和进阶指南,帮助他们深入学习和应用Lingo。 总之,《Lingo使用教程》是一本对于想要学习和掌握Lingo语言的人来说非常有价值的电子书。通过阅读这本教程,读者可以系统地学习Lingo语言的使用方法,并将其应用于自己的多媒体应用程序开发中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰之光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值