Lingo介绍

相信参加过或者学习过《数学建模》这门课程的小伙伴对这个软件都不陌生,lingo可以解决好多数学模型问题。那么好,今天我也学到了这门课,就想着写一个关于lingo的试用总结,方便自己以后复习观看,当然也欢迎大家进行指正。

Lingo软件是美国Lindo公司的产品,主要用来求解优化问题。它是一个非常强大的软件,可以求解大部分优化问题,包括线性规划、二次规划、整数规划、运输问题等。

Lingo的基本用法

1)LINGO 的数学规划模型包含目标函数决策变量约束条件三个要素。

2)在LINGO 程序中,每一个语句都必须要用一个英文状态下的分号结束,一个语句可以分几行输入。

3)LINGO 的注释以英文状态的!开始,必须以英文状态下的分号结束。

4)LINGO 的变量不区分字母的大小写,必须以字母开头,可以包含数字和下划线,不超过32 个字符。

5)LINGO 程序中,只要定义好集合后,其他语句的顺序是任意的。

6)LINGO 中的函数以“@”开头

7)LINGO 程序默认所有的变量都是非负的。

8)LINGO 程序中"<"或">"号与 "<="或 ">=" 号功能相同。

集合

集合部分的语法为

sets:
集合名称1/成员列表1/:属性1_1,属性1_2,…,属性1_n1;
集合名称2/成员列表2/:属性2_1,属性2_2,…,属性2_n2;
派生集合名称(集合名称1,集合名称2):属性3_1,…,属性3_n3;
endsets

基本集合:通过列举全部元素所定义的是原始(Primary Set),又被称为基本集合。

派生集合:通过原始集合派生所定义的集合是派生集合(Derived Set)。

注:原始集合和派生集合都在集合段中定义。集合段以SETS(或sets)开始,以ENDSETS(endsets)结束。

定于原始集合的语法:

集合名[/集合的元素列表/] [集合的属性列表];

集合的命名规则

  • 起始字符只能说字母或者下划线,后续字符只能是字母、数字或者下划线。
  • 标识符最长为32个字符。
  • 标识符不区分大小写

集合的元素命名规则

集合元素的命名也要遵循标识符的命名规范。集合元素命名有特例:集合元素可以是整数。

集合的元素列表

显式罗列:

将集合的每一个元素都完完整整的写出来的方式。

item/1 2 3 4 5 6/;

隐式罗列:

集合中的元素有一定的递增规律,写成起始元素…终止元素的形式。

ITEM/1..6/;

隐式罗列的全部列表形式:

格式实例集合元素
1…n1…61 2 3 4 5 6
alphM…alphNa…ha b c d e f g h
stringM…stringNtruck6…truck11
dayM…dayNMON…FRIMON TUE WED THU FRI
monthM…monthNOCT…JANOCT NOV DEC JAN
monthyearM…monthyearNOCT2001…JAN2002OCT2001 NOV2001 DEC2001 JAN2002

集合的属性列表

集合的属性列表就是下标,是该集合类型的向量的列表,属性之间只能用逗号分割开来(而不能用空格分隔)。

sets:
product/A B/; 这里是显示罗列
machine/M N/;
week/1..2/; 这里是隐式罗列
allowed(product,machine,week):x; 派生集合
endsets

数据

数据部分的语法为:

data:

属性 1= 数据列表; 数据列表; 数据列表;

属性 2= 数据列表; 数据列表; 数据列表;

enddata

常用LINGO函数

算术运算符

^ 乘方

﹡ 乘

/ 除

﹢ 加

﹣ 减

逻辑运算符

在 LINGO 中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些 集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。 LINGO 具有9种逻辑运算符。

#not# 否定该操作数的逻辑值,#not#是一个一元运算符。

#eq# 若两个运算数相等,则为 true;否则为 false。

#ne# 若两个运算符不相等,则为 true;否则为 false。

#gt# 若左边的运算符严格大于右边的运算符,则为 true;否则为 false。

#ge# 若左边的运算符大于或等于右边的运算符,则为 true;否则为 false。

#lt# 若左边的运算符严格小于右边的运算符,则为 true;否则为 false。

#le# 若左边的运算符小于或等于右边的运算符,则为 true;否则为 false。

#and# 仅当两个参数都为 true 时,结果为 true;否则为 false。

#or# 仅当两个参数都为 false 时,结果为 false;否则为 true。

数学函数

@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)如果 x0 时返回 1,当 x=0 时返回 0。

@floor(x)返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回 不低于 x 的最大整数。

@smax(x1,x2,…,xn)返回 x1,x2,…,xn 中的最大值。

@smin(x1,x2,…,xn)返回 x1,x2,…,xn 中的最小值

变量界定函数

@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 的约束。

集循环函数

@for:该函数用来产生对集成员的约束。

@sum:该函数返回遍历指定的集成员的一个表达式的和。

@min 和@max:返回指定的集成员的一个表达式的最小值或最大值。


例子:

以上部分来自网络。仅供参考。